You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:22:45