在学习 umi.js 的过程中遇到了一些小问题,记录一下。完整内容参照:官方文档
umi.js版本为:^4.0.72
重要概念
umi的配置文件有两个,一个是.umirc,另一个是config/config.ts这两个功能是等价的,但.unirc的优先级更高。.umirc和config/config.ts都支持通过添加文件后缀,区分不同环境的功能,以config/config.ts举例,格式为config/config.${UMI_ENV}.tsUMI_ENV是umi提供的环境变量,他有三个安全值dev、prod、test,这三个值只能由umi自动修改才有效,我们手动UMI_ENV为这三个值中的任意一个,都不会生效,项目依然使用默认的dev环境- 为了实现手动设置
UMI_ENV生效,可以设置除这三个值之外的key,例如UMI_ENV=development,对应的就是config/config.development.ts文件 umi的环境变量有两种,这里称为编译时和运行时。App只能读取运行时的环境变量,可以通过define将编译时的变量转换成运行时以供App使用
实例 1
声明提供给编译时的环境变量,也就是 node 变量,可以通过 process.env.[变量名] 访问,但没办法在页面上直接访问
# .env
WELCOME="Hello World"
将编译时的环境变量转发给运行时,以供 App 调用,下面是一种取巧的写法:
// config/config.ts
export default {
define: {
'process.env': process.env
},
// ...其他代码
}
实例 2
我们希望在不同的环境下,使用不同的 proxy 代理,可以这么做:
- 修改
package.json文件中的script命令
{
//...省略代码
"script": {
"dev": "cross-env NODE_ENV=development UMI_ENV=development umi dev",
"prod": "cross-env NODE_ENV=production UMI_ENV=production umi dev",
}
}
- 在
config目录下新增两个文件:config.development.ts和config.production.ts,并分别写入下列代码:
// config.development.ts
import { defineConfig } from "umi";
export default defineConfig({
proxy: {
'/api': {
'target': 'https://www.dev.mock.cn/',
'changeOrigin': true,
'pathRewrite': { '^/api' : '' },
},
}
});
// config.production.ts
import { defineConfig } from "umi";
export default defineConfig({
proxy: {
'/api': {
'target': 'https://www.prod.mock.cn/',
'changeOrigin': true,
'pathRewrite': { '^/api' : '' },
},
}
});
当我们运行 pnpm run prod 时,控制台弹出信息中出现下列内容,就说明配置生效了
[HPM] Proxy created: /api -> https://www.prod.mock.cn/
[HPM] Proxy rewrite rule created: "^/api" ~> ""