页面偶尔白屏,控制台报 Mismatched anonymous define() module,刷新后又正常。这类问题常被缓存掩盖,实际原因是匿名 AMD 模块被 RequireJS 以无法对应的方式加载,或者同一文件既被 script 标签加载,又被 RequireJS 加载。

不要先开合并。在预发布环境关闭 merge/bundling,保留源路径复现:

bin/magento config:set dev/js/merge_files 0
bin/magento config:set dev/js/enable_js_bundling 0
bin/magento cache:clean config full_page
rm -rf pub/static/frontend/Vendor/theme/zh_CN
bin/magento setup:static-content:deploy -f zh_CN

删除静态目录应在维护窗口进行,并保留 pub/static/.htaccess

找到匿名 define 与重复 script

grep -RniE 'define(s*[' app/code app/design | head -n 100
grep -RniE '<script[^>]+src=.*js' app/code app/design | head -n 100
grep -Rni "map:|mixins:" app/code/*/*/view app/design | head -n 120

模块文件使用匿名 define 本身并非错误;错误通常发生在它脱离 RequireJS loader 被直接插入页面,或 bundle 拼接顺序让 loader 无法关联当前 URL。

mixin 目标使用模块 ID,不是文件路径

var config = {
 config: {
  mixins: {
   'Magento_Checkout/js/view/minicart': {
    'Vendor_Module/js/minicart-mixin': true
   }
  }
 }
};

目标不要带 .js。两个模块同时 map 同一别名时,合并后的 requirejs-config 以后加载者为准,部署顺序变化就可能表现不稳定。

修复后重新启用生产配置,连续冷加载、强制刷新和无痕窗口各测试多次,并确认故障文件只请求一次。若只有 bundling 开启才失败,应检查 bundle 与第三方脚本兼容性,而不是加延时重试。

部署后比较合并前后的模块名

从浏览器报错堆栈记录第一个业务 JS URL,在 pub/static 与源目录分别计算哈希,并检查页面是否还引用上一个 release 的 requirejs-config。多节点环境如果只有一台保留旧静态文件,故障会随负载均衡随机出现。

sha256sum app/code/Vendor/Module/view/frontend/web/js/*.js
find pub/static/frontend -path '*Vendor_Module/js/*.js' -exec sha256sum {} ;