你好,无论如何,当你使用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并不会以某种方式工作,只要我认为它现在使用正则表达式只需要它,所以我真的不知道你怎么会修复它。无论如何,谢谢你的帮助。
答案 0 :(得分:287)
代码require('./locale/' + name)
可以使用locale
目录中的每个文件。因此webpack将每个文件都包含在您的包中作为模块。它无法知道您正在使用哪种语言。
有two plugins有助于向webpack提供有关应在捆绑包中添加哪个模块的更多信息:ContextReplacementPlugin
和IgnorePlugin
。
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-gb
和pl
语言环境将保留在包中。
如果您已经拥有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"
...
}
}