如何防止moment.js使用webpack加载语言环境?

时间:2014-08-19 13:13:36

标签: javascript gulp momentjs webpack

你好,无论如何,当你使用webpack时,你可以阻止moment.js加载所有语言环境(我只需要英语)?我正在查看源代码,如果定义了hasModule,它是用于webpack,那么它总是尝试require()每个语言环境。我很确定这需要拉动请求来修复。但无论如何我们可以使用webpack配置解决这个问题。

这是我的webpack配置加载momentjs

resolve: {
            alias: {
                moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
            },
        },

然后我需要它的任何地方我只需要('时刻')这可以工作,但它在我的包中添加了大约250kb的不需要的语言文件。此外,我正在使用bower版本的momentjs和gulp。

此外,如果webpack配置无法解决此问题,则链接指向加载语言环境的函数https://github.com/moment/moment/blob/develop/moment.js#L760-L772我尝试将“&& module.exports.loadLocales”添加到if语句但我认为webpack并不会以某种方式工作,只要我认为它现在使用正则表达式只需要它,所以我真的不知道你怎么会修复它。无论如何,谢谢你的帮助。

6 个答案:

答案 0 :(得分:287)

代码require('./locale/' + name)可以使用locale目录中的每个文件。因此webpack将每个文件都包含在您的包中作为模块。它无法知道您正在使用哪种语言。

two plugins有助于向webpack提供有关应在捆绑包中添加哪个模块的更多信息:ContextReplacementPluginIgnorePlugin

require('./locale/' + name)称为context(包含表达式的require)。 webpack从此代码片段中推断出一些信息:目录和正则表达式。在此处:directory = ".../moment/locale" regular expression = /^.*$/。因此,默认情况下,locale目录中的每个文件都包含在内。

ContextReplacementPlugin允许覆盖推断的信息,即提供新的正则表达式(以选择您想要包含的语言)。

另一种方法是忽略IgnorePlugin的要求。

以下是一个例子:

var webpack = require("webpack");
module.exports = {
  // ...
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de|fr|hu/)
    // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
  ]
};

答案 1 :(得分:7)

在我们的项目中,我包括这样的时刻:import moment from 'moment/src/moment';,这似乎可以解决问题。我们对时刻的使用非常简单,所以我不确定SDK是否会有任何不一致之处。我认为这是有效的,因为WebPack不知道如何静态查找语言环境文件,因此您会收到警告(通过在moment/src/lib/locale/locale添加空文件夹可以轻松隐藏)但不包含语言环境

答案 2 :(得分:2)

根据Adam McCrmick的回答,你很接近,将你的别名改为:

resolve: {
    alias: {
        moment: 'moment/src/moment'
    },
},

答案 3 :(得分:2)

使用webpack2和最新版本的时刻,您可以:

import {fn as moment} from 'moment'

然后在webpack.config.js中执行:

resolve: {
    packageMains: ['jsnext:main', 'main']
}

答案 4 :(得分:2)

正确的模块化moment库会在某个时候出现Version 3,所以目前我正在使用angular-cli而不是--eject我最终使用了https://github.com/ksloan/moment-mini比如import * as moment from 'moment-mini';

答案 5 :(得分:0)

这是在NPM安装程序中使用postinstall script的另一种解决方案。

您可以在 package.json 文件中添加一行:

{
  "scripts": {
    ...
    "postinstall": "find node_modules/moment/locale -type f -not -name 'en-gb.js' -not -name 'pl.js' -printf '%p\\n' | xargs rm"
    ...
  }
}

结果npm install完成安装软件包后,将立即删除不需要的语言环境。

在我的情况下,仅en-gbpl语言环境将保留在包中。

如果您已经拥有postinstall脚本,则可以将脚本添加到现有命令:

{
  "scripts": {
    ...
    "postinstall": "previous_command && find node_modules/moment/locale -type f -not -name 'en-gb.js' -not -name 'pl.js' -printf '%p\\n' | xargs rm"
    ...
  }
}