为何部分压缩后的JS文件中会包含require函数调用?
问题解答
为什么压缩后的moment.js里会有require调用?
你用的这个moment.js压缩文件,本质是CommonJS模块版本的压缩产物,并非专门为浏览器环境打包的版本。moment.js源码原本是为Node.js/CommonJS生态设计的,用require来按需加载locale文件;压缩过程只是精简代码,并没有把模块语法转换成浏览器能直接识别的形式。
之前用Gulp的时候,只是单纯拼接压缩文件,并没有解析模块依赖——浏览器运行时如果没触发到这段require(比如你没用到非默认的locale),就不会报错;但Webpack会主动扫描所有模块语法(包括require),尝试解析并打包对应的依赖,所以找不到./locale/xxx相关文件时就会报错。
解决打包错误的方案
- 确保安装完整的moment包:如果你用npm/yarn安装moment,默认会包含locale目录,Webpack就能正常解析
require("./locale/"+t)的动态依赖。如果不想打包所有locale,可以用Webpack的ContextReplacementPlugin指定只打包需要的语言,示例配置:const webpack = require('webpack'); module.exports = { plugins: [ new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn|en-us/) ] }; - 改用浏览器专用版本:直接引入
moment/min/moment-with-locales.min.js,这个是已经打包成UMD格式的文件,内部处理了locale加载逻辑,不会留下未解析的require。 - 处理isotope-docs.min.js:同理,检查该文件是否为模块版本,换成浏览器适配的IIFE/UMD版本,或者配置Webpack正确解析它的依赖。
内容的提问来源于stack exchange,提问作者neca
相关产品推荐
相关产品推荐

