你好,无论如何,当你使用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 回答
代码
require('./locale/' + name)
可以使用locale
目录中的每个文件 . 因此webpack将每个文件都包含在您的包中作为模块 . 它无法知道您使用的是哪种语言 .有一些two plugins可以为webpack提供有关哪些模块应该包含在您的包中的更多信息:
ContextReplacementPlugin
和IgnorePlugin
.require('./locale/' + name)
被称为context(包含表达式的require) . webpack从此代码片段中推断出一些信息:目录和正则表达式 . 这里:directory = ".../moment/locale"
regular expression = /^.*$/
. 因此,默认情况下,包含locale
目录中的每个文件 .ContextReplacementPlugin
允许覆盖推断的信息,即提供新的正则表达式(以选择您想要包含的语言) .另一种方法是忽略
IgnorePlugin
的要求 .这是一个例子:
适当的模块化
moment
库会在某个时刻出现Version 3所以目前我正在使用angular-cli而没有--eject
我刚刚使用https://github.com/ksloan/moment-mini就像import * as moment from 'moment-mini';
根据Adam McCrmick的回答,你很接近,将你的别名更改为:
使用
webpack2
和最近版本的时刻,您可以:然后在
webpack.config.js
你做:在我们的项目中,我包含这样的时刻:
import moment from 'moment/src/moment';
,这似乎可以解决问题 . 我们对时刻的使用非常简单,所以我不知道如何静态地找到语言环境文件,所以你得到一个警告(通过在moment/src/lib/locale/locale
添加一个空文件夹很容易隐藏),但没有包含语言环境 .