webpack 里面 definePlugin 里面定义了一些 process.env 的变量,这个是如何应用到 runtime 环境的?

2022-01-25 10:35:35 +08:00
 yazoox

我的理解,webpack 是个打包工具,是在 compile 阶段。 打包好以后,把 bundle 部署到服务器上,比如 aws 上面,运行后,是怎么应用这些 process.env 的?

是 webpack 打包时,把 process.env 生成了一个文件,然后在 runtime 再把这些 variables 从文件里面读取出来了么?

我 google 了一下,找相关文档,没有找到。

1090 次点击
所在节点    webpack
13 条回复
Mutoo
2022-01-25 10:39:34 +08:00
直接把整个 process.env.var 替换(硬编码)成你指定的字面量,正如它的名字 #define 一样。
Mutoo
2022-01-25 10:40:08 +08:00
murmur
2022-01-25 10:40:25 +08:00
不同的框架不一样,vue 只替换 process.env.vue_app_xxxx 的变量
yazoox
2022-01-25 10:46:09 +08:00
@Mutoo 但我们的代码是 runtime 运行的
比如
export function getVersion() {
return process.env.VERSION as string;
}

你的意思是,webpack 在 compile 的时候,会直接把这里的 process.env.VERSION 替换掉么?
谢谢
otakustay
2022-01-25 11:34:09 +08:00
你自己用了 DefinePlugin 的话,就是你定义的 key 字面量替换的,你上面的代码,在 VERSION=1.2.3 ,且用了 new DefinePlugin({'process.env.VERSION': JSON.stringify(process.env.VERSION)})的情况下,就会被编译成 return '1.2.3'
所以你必须原样写 process.env.VERSION ,不能 process.env[CONST_VERSION]之类的动态写法
zqx
2022-01-25 13:14:30 +08:00
打包的时候,替换了你的代码
浏览器执行的时候已经不是 process.env 了
SoloCompany
2022-01-25 13:20:49 +08:00
你应该配合 treeshaking 一起理解
Biwood
2022-01-25 13:22:05 +08:00
@yazoox 正解,就是替换字符串
wyhooo
2022-01-25 14:10:32 +08:00
硬核替换,没别的技巧。
mxT52CRuqR6o5
2022-01-25 14:12:52 +08:00
你写个简单点的 case 自己看一下编译结果就明白了
mxT52CRuqR6o5
2022-01-25 14:13:44 +08:00
https://webpack.js.org/plugins/define-plugin/#root

The DefinePlugin replaces variables in your code with other values or expressions at compile time.

看到 replace 了吗
mxT52CRuqR6o5
2022-01-25 14:15:29 +08:00
必须是 compile time 的硬核替换,不然没法把条件为 false 的分支代码 drop 掉
mxT52CRuqR6o5
2022-01-25 14:16:47 +08:00
当然也许 development 环境可以做一些动态注入之类的方案(在全局声明个 process 变量),可以更快的编译

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/830419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX