IgnorePlugin 配置后为啥没生效?

彦杰 Dev 阅读 43

我在用 Webpack 的 IgnorePlugin 时,明明配置了忽略 moment 的 locale,但打包体积还是很大,好像没起作用。

我这样配的:

new webpack.IgnorePlugin({
  resourceRegExp: /^./locale$/,
  contextRegExp: /moment$/
})

是不是写法有问题?还是得配合其他设置?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
程序猿树源
兄弟,你这个正则写错了!

resourceRegExp: /^./locale$/ 里面 . 是元字符,代表任意字符,不是真的点号。所以你这个正则实际上匹配的是像 /alocale/blocale 这种路径,根本不可能匹配到 ./locale

改成这样就对了:

new webpack.IgnorePlugin({
resourceRegExp: /^./locale$/,
contextRegExp: /moment/
})


或者更简单粗暴点:

new webpack.IgnorePlugin({
resourceRegExp: /locale$/
})


这样就能匹配到 moment 的 locale 目录请求了。

不过说真的,IgnorePlugin 用来处理 moment locale 有时候不太靠谱,更推荐用 ContextReplacementPlugin,这样更稳:

new webpack.ContextReplacementPlugin(/moment[/\]locale/, /zh-cn/)


只保留你需要的语言,比如这里只保留 zh-cn,其他都忽略。

改完重新打包试试,应该就生效了。
点赞
2026-03-19 14:01
永香~
永香~ Lv1
你的正则写错了,根本没匹配上 moment 内部请求的路径。moment 内部引用 locale 通常是 require('./locale'),你那个 ^./locale 里的点号没转义,且缺少斜杠,导致正则失效,打包时自然就把所有语言包都打进去了。

把正则改成下面这样,记得把点号转义一下,加上路径前缀:

new webpack.IgnorePlugin({
resourceRegExp: /^./locale$/,
contextRegExp: /moment$/
})


改完重新打包,体积应该就下来了。如果你还需要显示中文,记得在代码里手动 import 'moment/locale/zh-cn',不然时间全是英文的。拿去改改。
点赞 1
2026-03-03 23:01