【发布时间】:2016-04-11 18:00:17
【问题描述】:
我正在尝试从 RequireJS 迁移到 Webpack,但我不确定处理我们的语言环境文件的最佳方式。
目前,我们为每个语言环境生成一个单独的 JS 文件。这些文件包含 i18n 消息的 7 多个模块定义以及库配置(例如 moment)。例如,我们的 da_DK 文件如下所示:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('../moment')) :
typeof define === 'function' && define.amd ? define('moment-locale',['moment'], factory) :
factory(global.moment)
}(this, function (moment) { 'use strict';
var da = moment.defineLocale('da', {
...
});
return da;
}));
define('messages',[],function(){
var da_messages = {
...
};
return da_messages;
});
在运行时,我们确定要与应用程序的其余部分一起加载的适当语言文件。我们的应用程序代码不知道加载了哪个语言环境;任何依赖于语言环境的模块都可以使用require('moment-locale') 和require('messages')。
我想用 Webpack 做一些类似的事情,但我还没有找到一个好的方法来完成这个。
我已经看到 require.context 用于动态需求,但听起来这最终会将所有可能的语言环境与我的应用程序捆绑在一起,我不想这样做。
我还查看了 DllPlugin,认为每个语言环境文件都可能是一个“dll”,但我注意到 dll 清单包含特定的模块名称(例如:node_modules/moment/locale/de-at.js),我想我需要它更通用,以便 webpack 知道我何时 require('moment-locale'),它需要查看那个 dll。
我能够让它工作的一种方法是更新我的语言环境包生成代码,以便它为每个语言环境创建一个条目,如下所示:
module.exports = {
'messages': require('messages'),
'moment-locale': require('moment-locale'),
...
};
然后在 webpack 配置中,我将 library 字段设置为我的应用程序的命名空间。然后在我的应用程序的 webpack 配置中,我在 externals 中引用了这些模块。所以换句话说,当 da_DK.js 被加载时,它会将 window 上的所有模块放在一个命名空间下,供应用程序在加载时引用。我宁愿不使用这种方法,但这是迄今为止我能够让它发挥作用的唯一方法。
还有其他/更好的方法来完成这个吗?
【问题讨论】:
标签: webpack