首页 文章

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

提问于
浏览
184

你好,无论如何,当你使用webpack时,你可以阻止moment.js加载所有语言环境(我只需要英语)?我正在查看源代码,如果定义了hasModule,它是用于webpack,那么它总是尝试require()每个语言环境 . 我很确定这需要pull request来修复 . 但无论如何我们可以使用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不能正常工作,这将工作它只需要无论我认为它现在使用正则表达式,所以我真的不知道你怎么会修复它 . 无论如何,谢谢你的帮助 .

5 回答

  • 2

    代码 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$/)
      ]
    };
    
  • 279

    适当的模块化 moment 库会在某个时刻出现Version 3所以目前我正在使用angular-cli而没有 --eject 我刚刚使用https://github.com/ksloan/moment-mini就像 import * as moment from 'moment-mini';

  • 2

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

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

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

    import {fn as moment} from 'moment'
    

    然后在 webpack.config.js 你做:

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

    在我们的项目中,我包含这样的时刻: import moment from 'moment/src/moment'; ,这似乎可以解决问题 . 我们对时刻的使用非常简单,所以我不知道如何静态地找到语言环境文件,所以你得到一个警告(通过在 moment/src/lib/locale/locale 添加一个空文件夹很容易隐藏),但没有包含语言环境 .

相关问题