在 Vue CLI 3 中运行 build:electron 后,如何将静态 config.json 文件中的值读取到 Vue 文件中的 TypeScript?

sta*_*145 7 javascript typescript vue.js electron-builder vue-cli-3

下午好。

我想知道是否可以将config.json文件添加到 Vue CLI 3 项目中,该文件可以在开发和生产期间在运行时读取。

config.json文件将包含一些字符串的应用程序可以动态地使用变化的内容,如显示给用户和打印机的IP地址的视频文件。

// config.json

{
    "brand": "eat",
    "printerIP": "192.168.0.4"
}
Run Code Online (Sandbox Code Playgroud)

我试图将文件放在 assets 文件夹和 public 文件夹中。我尝试使用 import 和 require 语句将它导入到App.vue脚本 lang="ts"元素中。我正在使用 vue-property-decorator。

// App.vue (<script lang="ts">)

const config = require('../public/config.json');

OR

import config from '../public/config.json';
Run Code Online (Sandbox Code Playgroud)

我已经通过使用 axios 像 API 一样处理它并简单地使用例如config.brand访问变量来访问这些值。

// App.vue (<script lang="ts">)

import axios from 'axios';

@Provide() private brand: string = "";

axios
    .get('.config.json')
    .then(response => {
        this.brand = response.data.brand;
    })

OR

this.brand = config.brand;
Run Code Online (Sandbox Code Playgroud)

不幸的是,数据只能在构建时读取并编译成缩小的 JavaScript。这意味着即使用户在构建应用程序后更新config.json 中的变量,应用程序也不会更新。我需要能够访问构建文件中的config.json,更新一个值,然后让应用程序在运行时读取新值,而无需再次构建项目。我想知道是否有可能做到这一点。

您可以提供的任何帮助将不胜感激。

小智 5

您认为应该将运行时配置放在public/文件夹下是正确的,但不要导入它们。导入将在构建期间得到解决,其结果将通过 webpack。相反,使用fetch通过 HTTP 加载它们。

Vue 将public文件夹指定为放置静态资源的地方,这些资源应该绕过 webpack 并简单地复制到dist/. 您可以在运行时使用 HTTP 请求访问它们,如下所示:

const getRuntimeConfig = async () => {
  const runtimeConfig = await fetch('/config');
  return await runtimeConfig.json()
}
Run Code Online (Sandbox Code Playgroud)

如果你想在多个 Vue 组件中使用这些运行时配置而不进行多次获取,那么在驱动你的 Vue 应用程序的主 Javascript 文件(例如src/main.js)中进行一次获取并通过 Vue mixins 共享结果,如下所示:

  Vue.mixin({
      data() {
        return {
          // Distribute runtime configs into every Vue component
          BRAND: BRAND,
          PRINTER_IP: json.printerIP
        }
      },
    });
Run Code Online (Sandbox Code Playgroud)