我正在用Vue CLI开发一个应用程序.

因为电路板会移动,所以电路板的IP会随着时间的推移而变化,这取决于我在哪里.

这是我的项目当前树:

Project tree

IP配置包含在设置中.js文件:

export const Settings = {
    // Server configuration
    SERVER_IP: '127.0.0.1',
    SERVER_PORT: '9000',

    SERVER_PROTOCOL: 'http', // http or https

    // Website configuration
    DEBUG_MODE: true
};

在我的文件中,我使用以下语句导入此IP:

import {Settings} from '../../Settings'
const ip = Settings.SERVER_IP;

// Do stuff

这个很好用.但问题是:当IP发生变化时,我必须重新编译所有内容.因为设置.js与其他js文件一起编译.

因此,我想知道是否有一种方法可以让配置文件保留在dist/目录中,并在执行期间被我的JS应用程序读取.因此,我不必每次应用服务器IP更改时都重新编译所有内容.

谢谢你的帮助:)

推荐答案

我的Vue解决方案基于solution for Angular.

您可以使用与后端开发人员完全相同的环境变量.

但区别在于,后端代码是在服务器内部执行的,而前端代码只是磁盘上的文件,您可以将其作为静态文件撤回,而在撤回之前,它们甚至没有机会运行和判断环境变量.

但是你的代码是在浏览器中执行的.因此,这是理想的,也是唯一一个拥有env的合适地方.

然而,你必须事先准备好这个环境——根据你的后端环境.

计划如下:

  1. 从编译中排除设置文件(见下文).
  2. 在运行Vue应用程序之前,设置文件会"构造"环境.
  3. 从代码中可以使用该环境,还可以在运行时更新该环境.

下面是您的最终代码 struct :

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);

Webpack Copy plugin提供在vue.config.js中的npm run build阶段复制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>

现在您的窗口中有了它:

enter image description here

从代码中的任何地方都可以访问以下环境:

Vue.use(VueReCaptcha, { siteKey: window.__env.captcha.key })

Sidenote:

如果你想"与DevOps兼容",你需要在一个嵌套的目录中有一个设置(在我们的例子中是cfg).这将提供在Kubernetes/Swarm中进行装载的能力,而不会覆盖dist的整个目录.

Vue.js相关问答推荐

检测Vue3/Vue-test-utils中的Vuex还原/Mutations

是否可以使用 Vuetify/VueJS 为轮播设置默认图像而不是第一个图像?

为什么普通对象在 Vue3 中自动变成响应式的?

我在表格中创建了一个包含信息的新行,但在 Cypress e2e 测试中我无法获得最后一行(新行)

使用计算(computed)属性更改视图

如何在 vuejs 中导入和使用本地 .csv 文件

vue router/:param 斜杠的参数

使用 Nuxt 动态获取文件夹中的图像路径

如何对将 DOM 元素附加到 HTML 正文的 Vue 组件进行单元测试?

Axios-一次发出多个请求(vue.js)

Laravel Blade 模板将数据传递给 Vue JS 组件

Vuejs:我应该在 vue-router SPA 中的哪里放置一些常用的 js 工具?

我可以避免使用 Vue.js 组件的重复样式吗?

为 webpack HMR Vue.js 包含来自外部项目文件夹的可导入模块

从 vue.js 中的 store 获得的计算(computed)属性的设置器

如何使用 JavaScript 按索引删除数组元素?

Vue Js如何在单个文件模板中使用mixins?

在 Vuejs 中放置 firebase.auth().onAuthStateChanged() 的位置

Vue-i18n - 无法读取未定义的属性配置

vue-cli@3 没有可用于依赖类型的模块工厂:CssDependency