Vue CLI - 编译后将配置文件保留为外部文件

Vue CLI - Keep config file as external after compilation

我正在使用 Vue CLI 开发应用程序。 此应用程序是一个 Web 界面,必须与板上的 Rest API 通信。

所以,因为板会移动,所以板的 IP 会随着时间的推移而变化,具体取决于我在哪里。

这是我的项目当前树:

IP 配置包含在 Settings.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 更改时,我必须重新编译所有内容。因为Settings.js是和其他JS文件一起编译的

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

谢谢你的帮助:)

你提前知道完整的IP地址列表吗?如果是这样,您可以创建一个函数,根据任何 time/location 逻辑 returns 正确的 IP。

否则你可以尝试将设置文件移动到 public 文件夹,添加到你的 .gitignore 文件,确保你在你的 public/index.html 中引用它。它现在将位于已编译的 Vue 应用程序之外,并且可以作为全局设置变量从 Vue 内部访问。

因此,您将引用 window.Settings

而不是 import {Settings} from '../../Settings'

例如const ip = window.Settings.SERVER_IP;

这样就可以直接编辑设置了,不用每次都重新编译。

您可以在 public 目录 中创建一个 config.json 文件,然后在主 js 中您可以 fetch它并加载配置文件。现在你的 dist 是用这个 config.json.

创建的
fetch('/config.json').then(res => res.json()).then(config => {
     .......
})

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

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

但区别在于后端代码是在服务器内部执行的,而前端代码只不过是磁盘上的文件,您将它们作为静态文件撤回,甚至没有机会 运行 并在之前检查环境变量正在撤回。

但是你的代码是在浏览器中执行的。所以这是拥有环境的理想且唯一合适的地方。

但是,你必须事先准备好这个环境——根据你的后端环境。

计划如下:

  1. 您从编译中排除了您的设置文件(见下文)。
  2. 您的设置文件在您 运行 Vue 应用程序之前“构建”环境。
  3. 从您的代码中使用该环境,并且您可以在 运行 时间内更新该环境。

所以这是你的最终代码结构:

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提供在npm 运行构建阶段复制cfg文件的指令vue.config.js(您不能更改此名称):

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 中 运行 应用程序之前 window:

  <body>
    <script src="/cfg/settings.js"></script>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>

现在你的 window:

并且从代码中的任何地方你都可以到达这个环境:

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

旁注:

如果你想“与 DevOps 兼容”,你需要在嵌套目录中进行设置(在我们的示例中为 cfg)。这将提供在 Kubernetes/Swarm 中进行挂载的能力,而无需覆盖 dist.

的整个目录

使用 Melih Altıntaş 的 (谢谢!!:))但为了避免获取,我在 /public 文件夹中创建了一个 JavaScript 文件:

/public/config.js --> /dist/config.js

将其加载到 index.html 头部

<script src="<%= BASE_URL %>config.js">

并在我需要的任何后续 *.js 文件中使用了在 /public/config.js 中声明的变量(例如 main.js、mixins.js...)。

构建后,/dist/config.js 可以轻松修改,它的值仍然自动在应用程序中顺利使用(并重新编译 ;))。

也许这是一个愚蠢的解决方案,但它确实有效。完全按照我的需要去做(让客户轻松编辑某些值)。

再次感谢你,Melih! :)