当你使用webpack时,是否有任何方法可以停止moment.js加载所有的locale(我只需要英语)?我在看源代码,似乎如果hasModule是定义的,这是为webpack,那么它总是试图要求()每个地区。我很确定这需要一个拉请求来修复。但是我们是否可以通过webpack配置来解决这个问题呢?
下面是加载momentjs的webpack配置:
resolve: {
alias: {
moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
},
},
然后在任何我需要它的地方,我只需要('moment')。这是有效的,但它增加了大约250kb的不需要的语言文件到我的包。我还使用了momentjs和gulp的凉亭版本。
另外,如果webpack配置不能解决这个问题,这里有一个加载locale的函数的链接。我试着添加&& module.exports.loadLocales到if语句,但我猜webpack实际上并没有以那种方式工作。它只是要求无论什么。我想它现在用的是正则表达式所以我不知道你会怎么去修正它。
下面是在NPM安装程序中使用postinstall脚本的另一个解决方案。
你可以在你的包裹上放一条线。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完成安装包后立即删除。
在我的例子中,只有engb和pl locale将保留在bundle中。
如果你已经有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"
...
}
}
从2.18开始,所有的语言环境都与核心库捆绑在一起(参见GitHub问题)。
传递给IgnorePlugin的resourceRegExp参数不会根据被导入或需要的解析文件名或绝对模块名进行测试,而是根据在发生导入的源代码中传递给require或import的字符串进行测试。例如,如果你试图排除node_modules/moment/locale/*.js,这将不起作用:
new webpack.IgnorePlugin({ resourceRegExp: /moment\/locale\// });
相反,因为moment导入的代码是这样的:
require('./locale/' + name);
您的第一个regexp必须匹配该'。/地区/字符串。然后使用第二个contextRegExp参数选择发生导入的特定目录。下面的操作将导致这些区域设置文件被忽略:
plugins:[
new webpack.IgnorePlugin({
resourceRegExp: /^\.\/locale$/,
contextRegExp: /moment$/,
}),
]
这意味着“任何要求语句匹配”。任何以'moment'结尾的目录中的/locale'将被忽略。