umi max配置文件问题排查

现象描述

分别执行cross-env UMI_ENV=test max buildcross-env UMI_ENV=production max build,在config/config.tsheadScripts的首个资源加载存在差异。production会丢失首个资源,而test不会。

执行环境

  • @umijs/max@4.0.78

分析

因为主要是配置文件方向的问题,所以从配置文件入手,定位到getUserConfig函数:

ts 复制代码
  getUserConfig() {
    const configFiles = Config.getConfigFiles({
      mainConfigFile: this.mainConfigFile,
      env: this.opts.env,
      specifiedEnv: this.opts.specifiedEnv,
    });
    return Config.getUserConfig({
      configFiles: getAbsFiles({
        files: configFiles,
        cwd: this.opts.cwd,
      }),
    });
  }

这里的configFiles,当执行cross-env UMI_ENV=production max build时是:

js 复制代码
[
  '/config/config.ts',
  '/config/config.production.ts',
  '/config/config.prod.ts',
  '/config/config.prod.production.ts'
]

当执行cross-env UMI_ENV=test max build时是:

js 复制代码
[
  '/config/config.ts',
  '/config/config.test.ts',
  '/config/config.prod.ts',
  '/config/config.prod.test.ts'
]

当执行max build时是:

js 复制代码
[
  '/config/config.ts',
  '/config/config.prod.ts'
]

很显然,无论是拿种情况,都会不止加载一个config/config.ts文件,而是会根据env来加载额外文件,并且把这些文件内容用lodash.merge合并 处理。

而我们在/config/下一共有两个配置文件,/config/config.ts/config/config.production.ts,当指定了envproduction时,会加载/config/config.production.ts文件并与/config/config.ts文件用lodash.merge做内容合并处理。而我们在这两个文件中都配置了headScripts,并且/config/config.production.ts中的headScripts恰好是配置了一个元素,于是导致合并的时候/config/config.ts中的headScripts第一个元素因为被覆盖而丢失。

丢失的原因是,lodash.merge 的合并处理,对于字符串数组来说,合并会导致相同位置的内容被替换,如:

js 复制代码
const lodash = require('lodash');

lodash.merge(['1', '2', '3'], ['21']);

// 结果是:[ '21', '2', '3' ]

结论

执行build命令时指定了env,加载了多个config文件,这些文件又配置了同一个字段,导致相同字段内容被覆盖

相关推荐
阿珊和她的猫几秒前
WebRTC 技术深度解析:实时通信的未来引擎
前端·webpack·node.js·webrtc
silence_xiang3 分钟前
【React】首页悬浮球实现,点击出现悬浮框
前端·javascript·react.js
隔壁的大叔25 分钟前
由于vite版本不一致,导致vue组件引入报错
javascript·vue.js
申阳28 分钟前
Day 11:集成百度统计以监控站点流量
前端·后端·程序员
Cache技术分享37 分钟前
239. Java 集合 - 通过 Set、SortedSet 和 NavigableSet 扩展 Collection 接口
前端·后端
超级罗伯特41 分钟前
大屏自适应,响应式布局,亲测有效
前端·javascript·html·大屏·驾驶舱
青衫码上行41 分钟前
【Java Web学习 | 第九篇】JavaScript(3) 数组+函数
java·开发语言·前端·javascript·学习
前端老宋Running42 分钟前
React组件命名为什么用小写开头会无法运行?
前端·react.js·面试
百***071843 分钟前
WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程
前端
ruanCat44 分钟前
对 changelogen 和 changelogithub 使用的思考
前端·github