小编Sea*_*lee的帖子

如何在运行时捆绑并加载i18n模块?

我正在尝试从RequireJS迁移到Webpack,我不确定处理我们的语言环境文件的最佳方法.

目前,我们为每个语言环境生成一个单独的JS文件.这些文件包含7个以上的i18n消息模块定义以及库配置(例如时刻).例如,我们的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;
 });
Run Code Online (Sandbox Code Playgroud)

在运行时,我们确定要与我们的应用程序的其余部分一起加载的相应语言文件.我们的应用代码不知道加载了哪个区域设置; 依赖于语言环境的任何模块会做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'),
    ...
};
Run Code Online (Sandbox Code Playgroud)

然后在webpack配置中,我将library …

webpack

9
推荐指数
1
解决办法
4943
查看次数

标签 统计

webpack ×1