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

你好,无论如何,你可以停止使用webpack时,加载所有语言环境(我只需要英语)的moment.js? 我正在看源代码,如果hasModule被定义为webpack,那么它总是试图require()每个语言环境。 我很确定这需要拉动请求来解决。 但是,无论如何,我们可以用一个webpackconfiguration来解决这个问题。

这是我的webpackconfiguration加载momentjs

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

然后,我需要它的任何地方,我只是需要('时刻')这个作品,但它增加了约250kb的不需要的语言文件到我的包。 此外,我正在使用matrix和吞噬的凉亭版本。

另外,如果这不能通过webpackconfiguration修复这里是一个链接到它加载语言环境的函数https://github.com/moment/moment/blob/develop/moment.js#L760-L772我试着添加“&& module.exports.loadLocales”到if语句,但我猜测webpack不acaully工作的方式,这将工作它只是需要不pipe我认为它现在使用正则expression式,所以我真的不知道你会怎么去修理它。 反正谢谢你的帮助。

代码require('./locale/' + name)可以使用locale dir中的每个文件。 所以webpack将每个文件都包含在你的包中。 它不知道你正在使用哪种语言。

有两个插件可以为webpack提供关于哪个模块应该包含在你的包中的更多信息: IgnorePluginIgnorePlugin

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

ContextReplacementPlugin允许覆盖推断的信息,即提供一个新的正则expression式(select你想包含的语言)。

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

这里是一个例子:

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

在我们的项目中,我包含了这样一个时刻: import moment from 'moment/src/moment'; 而这似乎是伎俩。 我们使用的时刻非常简单,所以我不确定是否会与SDK有任何不一致。 我认为这是有效的,因为WebPack不知道如何静态查找语言环境文件,所以你会得到一个警告(在moment/src/lib/locale/locale添加一个空文件夹很容易隐藏),但是没有语言环境。

根据Adam McCrmick的回答,你已经接近了,把你的别名改成:

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

正确的模块化--eject库将在某一moment提出第3版 ,所以目前我正在使用angular-cli而没有--eject我刚刚使用https://github.com/ksloan/moment-mini像;import * as moment from 'moment-mini';

随着webpack2和最新版本的时刻,你可以做:

 import {fn as moment} from 'moment' 

然后在webpack.config.js执行:

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