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

相关推荐
小罗水5 分钟前
第17章 后台管理端与演示支持
javascript·vue.js·ecmascript
濮水大叔8 分钟前
不必把 Vue3 写成“麻花”:从状态碎片到对象协作,重新理解 Zova 的前端心智模型
前端·typescript·vue3·ioc·tsx·zova
Vuji1 小时前
MCP: 一条 tool 调用链路的旅程
前端·人工智能
万少2 小时前
DeepSeek-V4-Flash 正式版上线了,但这 3 个坑我帮你提前踩了
前端·javascript·后端
明月_清风2 小时前
🚀 Palantir Foundry 本体论实战:当 Ontology 从"知识图谱"进化为"企业操作系统"
前端·后端
驳是2 小时前
入坑 Nginx,看这一篇就够了
前端
宁风NF2 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
明月_清风2 小时前
从概念到代码:用 Ontology 构建你的第一个知识图谱
前端·后端
程序员黑豆2 小时前
鸿蒙应用开发:AppStorage 全局状态存储用法教程
前端·harmonyos
猫猫不是喵喵.2 小时前
Vue3 中 computed 计算属性与 watch、watchEffect 监听
前端·javascript·vue.js