已经有人提出并回答了有关在使用Webpack打包之后注入环境变量的问题。
答案通常基于在index.html
文件中加载更新的环境变量。
但是,在使用Webpack模块联邦时,我们只公开了一个component.js
文件,因此在构建docker镜像阶段打包源代码,但在服务阶段(例如在k8s内部以pod形式运行我们的打包文件时)读取环境变量应该如何实现呢?
已经有人提出并回答了有关在使用Webpack打包之后注入环境变量的问题。
答案通常基于在index.html
文件中加载更新的环境变量。
但是,在使用Webpack模块联邦时,我们只公开了一个component.js
文件,因此在构建docker镜像阶段打包源代码,但在服务阶段(例如在k8s内部以pod形式运行我们的打包文件时)读取环境变量应该如何实现呢?
目前,我们正在将 webpack.EnvironmentPlugin
与 Docker 结合使用。
在 webpack.config.js
中,我们将环境变量替换为特殊字符串:
plugins: [
new EnvironmentPlugin({
MY_CUSTOM_ENV_VAR: '{{MY_CUSTOM_ENV_VAR}}',
ANOTHER_ENV_VAR: '{{ANOTHER_ENV_VAR}}',
}),
],
{{MY_CUSTOM_ENV_VAR}}
'和'{{MY_CUSTOM_ENV_VAR}}
'。RUN
命令添加一个替代。CMD sed -i "s@{{MY_CUSTOM_ENV_VAR}}@${MY_CUSTOM_ENV_VAR}@g" /usr/share/nginx/html/*.bundle*.js \
&& sed -i "s@{{ANOTHER_ENV_VAR}}@${ANOTHER_ENV_VAR}@g" /usr/share/nginx/html/*.bundle*.js \
&& nginx -g "daemon off;"
它将在捆绑文件中使用/usr/share/nginx/html/*.bundle*.js
(nginx)将字符串{{MY_CUSTOM_ENV_VAR}}
替换为${MY_CUSTOM_ENV_VAR}
的值。
我正为同样的问题苦苦挣扎... 我只能想到在容器中使用一个约定来处理这个问题。
所有的微前端都可以潜在地在 ./assets/env.template.js(最终为 ./assets/env.js)中暴露它们的环境变量,使用 ${MY_ENVIRONMENT_VARIABLE} 作为占位符。
这个 env.template.js 文件将是一个自动执行的 JavaScript 函数,它会将环境变量值作为全局属性引入 window(请参见下面的示例)。
env.template.js
(function (window) {
window.env = window.env || {};
window['env']['clientId'] = '${CLIENT_ID}';
window['env']['baseUrl'] = '${BASE_URL}'
})(this);
const webpack = require('webpack');
require('dotenv').config({ path: './.env' });
然后在插件模块部分添加这个
new webpack.DefinePlugin({
"process.env": JSON.stringify(process.env);
}),
这将从计算机中获取所有环境变量的代码。
另一个改进是通过这种方式实现的,这样您就可以创建像.env.development
或.env.production
这样的文件。
module.exports = (env, args) => {
require("dotenv").config({ path: `./.env.${args.mode}` });
const dotenv = require("dotenv").config({ path: ./.env.${args.mode}` });
将definePlugin更改为以下内容:
new webpack.DefinePlugin({ "process.env": JSON.stringify(dotenv.parsed), }),