Vue.js 排除设置文件被捆绑

Posted

技术标签:

【中文标题】Vue.js 排除设置文件被捆绑【英文标题】:Vue.js exclude settings file from being bundled 【发布时间】:2017-09-11 16:39:07 【问题描述】:

我正在使用vue-webpack 模板,并创建了一个settings.json 文件来存储安装脚本时应更改的环境变量。

我的settings.json(只存储API服务器的绝对路径):


  "apiURL": "//localhost/app/server/API"

如何防止文件在生产版本中被缩小/捆绑,以便我可以更改它并且下次访问应用程序时将使用更新的文件(无需再次构建它)?

在我的应用程序中,我通过require 使用此文件:

const SETTINGS = require('../settings.json');

我知道通过requireing 它,webpack 会将它捆绑为一个模块,但我怎样才能将它包含在我的应用程序中,以便设置文件在生产中仍然是一个分隔文件构建我可以编辑的。

是否有更好的格式/方式来存储这些设置(以便它们可以在生产中进行编辑而无需重新构建)?

【问题讨论】:

【参考方案1】:

您可以在 webpack.config.js 中的 externals 配置中引用的对象中定义这些设置。

externals 配置选项提供了一种排除方式 来自输出包的依赖项。相反,创建的包 依赖于消费者环境中存在的依赖关系。

例子:

externals: 
  appSettings: "appSettings",
  "window.appSettings": "appSettings"

其中appSettings 是一个全局变量,包含您要操作的环境变量。


或者,如果您不喜欢在全局对象中公开设置的方法,您可以执行以下操作:

使用默认设置导出一个变量,该变量将包含在 webpack 包中。

export var appSettings = 
  currentSettings: "",
  settings: ,
  getString: function(strName) 
    var sett = this.currentSettings ?
      this.settings[this.currentSettings] :
      appDefaultStrings;
    if (!sett || !sett[strName]) sett = appDefaultStrings;
    return sett[strName];
  ,
  getSettings: function()  //Gets all available settings
    var res = [];
    res.push("");
    for (var key in this.settings) 
      res.push(key);
    
    res.sort();
    return res;
  
;

export var appDefaultStrings = 
  apiURL: "//localhost/app/server/API"
    //...

appSettings.settings["default"] = appDefaultStrings;

然后您可以要求或导入此变量并像这样使用它:

import appSettings from "../path/to/appSettings";

appSettings.getString("apiURL"); //"//localhost/app/server/API"

现在您的默认设置已启动并运行,我们将创建另一个包含自定义设置的文件。

import appSettings from "../path/to/appSettings";

export var appProductionSettings = 
  apiUrl: "http://example.com"
    //...


appSettings.settings["production"] = appProductionSettings;

您需要做的最后一件事是处理要使用的设置。我还没有使用过 vue.js,但希望这会引导你朝着正确的方向前进:

import appSettings from "../path/to/appSettings";

export class MyApp 
  constructor() 
    this.settingsValue = "";
  
  get settings() 
    return this.settingsValue;
  
  set settings(value) 
    this.settingsValue = value;
    appSettings.currentSettings = value;
  

更改设置:

import "../path/to/productionSettings";

var app = new MyApp();

app.settings = "production";

使用此方法,您可以创建和使用任意数量的设置文件。

【讨论】:

感谢您的回复,我想我会采用简单的方法并使用 externals 功能将我的设置简单地包含为定义全局 APP_SETTINGS 变量的 settings.js 文件。跨度> 最适合您要求的就是最佳选择。如果您要定义一个全局变量,可能值得使用 object.defineProperties 来利用属性描述符,尤其是 writable (默认为 false) 。这将防止用户使用分配运算符更改值,而不是像您期望的那样在文件中更改它。这里有一个简单的例子来说明这一点:jsfiddle. 随时克里斯蒂:)

以上是关于Vue.js 排除设置文件被捆绑的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Webpack 捆绑 JS 文件中排除 style-loaders、css-loader 源代码?

ERR_CONNECTION_REFUSED 与 Django 和 Vue.js 捆绑文件

Vue.js / webpack:当热重载编译它们时,如何清除旧的包 main-*.js 文件?

乘客捆绑器/设置 LoadError

我需要从 Vue.js 中的 bundle webpack 中排除 js 库

使用 vue-cli 设置时如何从 babel-loader 中排除特定文件?