moment引入导致包体积暴涨300kb+,因其默认打包全部100+个locale文件;可通过ignoreplugin剔除全部locale(需显式引入所需语言)或contextreplacementplugin精确保留指定语言,亦可替换为dayjs(2kb)或date-fns。

moment.js 一引入,主包直接多出 300KB+,不是配置问题,是它默认打包全部 locale 文件
为什么 require('moment') 会让包体积暴涨
Webpack 打包时,require('moment') 会把 moment/locale/ 下全部 100+ 个语言文件(如 zh-cn.js、ja.js、fr.js)全打进 vendor.js —— 即使你只用中文,也照单全收。
uni-app 构建不报错,但打开 unpackage/dist/build/mp-weixin/static/js/chunk-vendors.[hash].js,用 VS Code 搜索 locale,一眼就能看到密密麻麻的翻译字符串。
- 不用任何 locale:体积可降 280KB+
- 只留中文 locale:体积可降 220KB+
- 保留中 + 英 + 日三语:约增 60KB,可控
webpack IgnorePlugin 移除全部 locale(最常用)
在 vue.config.js 的 configureWebpack.plugins 中加:
const webpack = require('webpack')
module.exports = {
configureWebpack: {
plugins: [
new webpack.IgnorePlugin(/^./locale$/, /moment$/)
]
}
}
这样后,require('moment') 就只剩核心逻辑。若需指定语言,必须显式引入:
import moment from 'moment'
import 'moment/locale/zh-cn'
moment.locale('zh-cn')
⚠️ 注意:import 'moment/locale/zh-cn' 这行不能少,否则 moment().format('LL') 仍显示英文。
ContextReplacementPlugin 精确控制要保留的 locale
如果业务需支持中英双语,又不想手动 import 两次,改用:
new webpack.ContextReplacementPlugin( /moment[/\]locale$/, /zh-cn|en-us/ )
这样 Webpack 只打包匹配正则的 locale 文件,其余全剔除。代码里无需再 import,moment.locale() 直接可用。
常见错误写法:/zh-cn|en-us/i —— i 标志会导致匹配失败,因为 moment 的 locale 路径是小写(zh-cn.js),但文件系统路径大小写敏感,实际匹配应严格按文件名来。
替代 moment.js 是更彻底的解法
moment 已进入维护模式,且体积顽疾难根治。推荐两种轻量替代:
- 用
dayjs:API 兼容 moment,体积仅 2KB,import dayjs from 'dayjs'默认无 locale,按需加载插件:import 'dayjs/locale/zh-cn' - 用
date-fns:函数式设计,tree-shaking 友好,import format from 'date-fns/format'只打包含用函数
uni-app 项目中替换时,注意过滤器写法变化:moment().format('YYYY-MM-DD') → dayjs().format('YYYY-MM-DD'),需全局搜索替换,但一次改完,后续零体积负担。
真正容易被忽略的是:即使你用了 IgnorePlugin,如果某处写了 require('moment/locale/zh-cn') 或 import * as locales from 'moment/locale',Webpack 仍会尝试解析整个目录——这类动态引用必须手动清理干净,否则优化无效。











