Vite中Terser Minifier未生效:原因排查与解决方法
问题:Vite使用Terser构建ES格式库时代码未被压缩
使用Vite构建ES格式的库时,即使在配置中指定了Terser作为压缩工具,输出的代码完全没有被压缩,甚至比原文件还多几个字符。
复现脚本
#!/bin/bash -x rm -rf my-vanilla-lib npm create vite@latest my-vanilla-lib -- --template vanilla cd my-vanilla-lib npm i cat <<EOL > vite.config.js export default { build: { minify: 'terser', terserOptions: { compress: { passes: 2, }, mangle: true, format: { beautify: false, comments: false, }, }, lib: { entry: 'src/counter.js', name: 'MyLibrary', fileName: 'my-library', formats: ['es'], }, } }; EOL npm run build cat dist/my-library.js
构建输出(未压缩)
function setupCounter(element) { let counter = 0; const setCounter = (count) => { counter = count; element.textContent = `count is ${counter}`; }; element.addEventListener("click", () => setCounter(counter + 1)); setCounter(0); console.log("Counter initialized"); } export { setupCounter };
原因分析
Vite在构建ES格式的库时,默认会跳过压缩步骤。Vite的设计逻辑是:ES模块通常会被最终的应用构建工具(如Rollup、Webpack)再次处理,压缩工作应该由这些工具完成,因此库模式下的ES格式构建默认不启用压缩,即使外层build.minify配置了Terser也不会生效。
解决方法
要让Terser在ES库构建中生效,需要在build.lib字段下显式添加minify: true配置,同时保留外层的build.minify: 'terser'和Terser选项。修改后的vite.config.js如下:
export default { build: { minify: 'terser', terserOptions: { compress: { passes: 2, }, mangle: true, format: { beautify: false, comments: false, }, }, lib: { entry: 'src/counter.js', name: 'MyLibrary', fileName: 'my-library', formats: ['es'], minify: true // 新增这一行 }, } };
修改后重新执行npm run build,就能看到代码被Terser正常压缩,输出示例:
function setupCounter(e){let t=0;const n=e=>{t=e,e.textContent=`count is ${t}`};e.addEventListener("click",()=>n(t+1)),n(0),console.log("Counter initialized")}export{setupCounter as s};
内容的提问来源于stack exchange,提问作者Dan Fabulich
相关产品推荐
相关产品推荐

