我对 Vue 的解决方案是基于solution for Angular。
您可以拥有与后端开发人员完全相同的环境变量。
但不同之处在于后端代码在服务器内部执行,而前端代码只不过是磁盘上的文件,您将其作为静态文件撤回,甚至没有机会在撤回之前运行和检查环境变量。
但是您的代码正在浏览器中执行。所以这是拥有环境的理想和唯一合适的地方。
但是,您必须事先准备好这个环境 - 根据您的后端环境。
计划如下:
- 您从编译中排除您的设置文件(见下文)。
- 您的设置文件会在您运行 Vue 应用程序之前“构建”环境。
- 从您的代码中,您可以使用该环境,并且您还可以在运行时更新该环境。
这是你的最终代码结构:
root_project_dir:
├─> cfg
│ └── settings.js
├─> public
│ ├── favicon.ico
│ └── index.html
├─> src
│ ├── App.vue
│ ├─> assets
│ │ └── logo.png
│ ├─> components
│ ├─> layouts
│ ├── main.js
│ ├─> plugins
│ ├─> router
│ ├─> store
│ └─> views
└── vue.config.js
创建设置文件cfg/settings.js:
/*
This file goes as an asset without any of compilation even after build process.
Thus, it can be replaced in a runtime by different file in another environment.
Example for Docker:
docker run -v ./local_cfg_dir:cfg image:tag
*/
(function(window) {
window.__env = window.__env || {};
window.__env.api = {
"url": "http://127.0.0.1:8000",
"timeout": 80000
};
window.__env.captcha = {
"enabled": true,
"key": "Mee1ieth1IeR8aezeiwi0cai8quahy"
};
window.__env.rollbar = {
"enabled": true,
"token": "zieriu1Saip5Soiquie6zoo7shae0o"
};
window.__env.debug = true;
})(this);
在 vue.config.js 的 npm run build 阶段为Webpack Copy plugin 提供复制cfg 文件的指令(您不能更改此名称):
module.exports = {
chainWebpack: config => {
config.plugin("copy").tap(([pathConfigs]) => {
pathConfigs.unshift({
from: "cfg",
to: "cfg"
});
return [pathConfigs]})
},
transpileDependencies: ["vuetify"]
};
检查生成的 webpack 配置并发现它已被应用(在输出的底部):
vue inspect
现在,当您构建项目时,您将在生成的目录中看到它:
dist
├─> cfg
│ └── settings.js
├─> css
│ ├── app.06b1fea6.css
│ └── chunk-1f2efba6.a298b841.css
├── favicon.ico
├─> img
│ └── logo.09e0e4e1.png
├── index.html
└─> js
├── app.8fc75c19.js
├── app.8fc75c19.js.map
└── chunk-vendors.1ab49693.js.map
因此,您可以在 public/index.html 中运行此设置,然后在同一窗口中运行应用程序:
<body>
<script src="/cfg/settings.js"></script>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
现在你的窗口中有它了:
您可以从代码中的任何位置访问此环境:
Vue.use(VueReCaptcha, { siteKey: window.__env.captcha.key })
旁注:
如果您想“与 DevOps 兼容”,您需要在嵌套目录中进行设置(在我们的示例中为 cfg)。这将提供在 Kubernetes/Swarm 中进行挂载而不覆盖整个 dist 目录的能力。