如何防止使用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提供关于哪个模块应该包含在你的包中的更多信息: IgnorePlugin
和IgnorePlugin
。
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'] }