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文件,这些文件又配置了同一个字段,导致相同字段内容被覆盖

相关推荐
阿蒙Amon4 小时前
TypeScript学习-第7章:泛型(Generic)
javascript·学习·typescript
睡美人的小仙女1275 小时前
Threejs加载环境贴图报错Bad File Format: bad initial token
开发语言·javascript·redis
fanruitian5 小时前
uniapp android开发 测试板本与发行版本
前端·javascript·uni-app
rayufo5 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk5 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
摘星编程6 小时前
React Native + OpenHarmony:Timeline垂直时间轴
javascript·react native·react.js
2501_944525546 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
jin1233227 小时前
React Native鸿蒙跨平台完成剧本杀组队详情页面,可以复用桌游、团建、赛事等各类组队详情页开发
javascript·react native·react.js·ecmascript·harmonyos
李白你好7 小时前
Burp Suite插件用于自动检测Web应用程序中的未授权访问漏洞
前端
经年未远8 小时前
vue3中实现耳机和扬声器切换方案
javascript·学习·vue