JS / CSS 代码压缩

粘贴代码即出压缩结果,并告诉你省了多少字符。

怎么用

  1. 把 JavaScript 或 CSS 粘进输入框——下面的压缩结果随输入实时更新,没有按钮要点。
  2. 语法默认「自动」,识别错了就点一下 JavaScript / CSS,结果立刻按新语法重压。
  3. 标题行直接给「字符:压缩前 → 压缩后(省多少)」,可以一键复制或下载成 .js / .css 文件。

示例

输入

// 购物车合计:含税金额与免运费判断
const 税率 = 0.08;

function 合计(明细, 优惠券) {
  let 小计 = 0;
  for (const 项 of 明细) {
    小计 += 项.单价 * 项.数量; // 单价 × 数量
  }
  if (优惠券) {
    小计 -= 优惠券;
  }
  return { 金额: 小计 * (1 + 税率), 免运费: 小计 > 50 };
}

压缩后

const 税率=0.08;function 合计(明细,优惠券){let 小计=0;for(const 项 of 明细){小计+=项.单价*项.数量;}if(优惠券){小计-=优惠券;}return{金额:小计*(1+税率),免运费:小计>50};}

注释被删掉,空白被折叠,但中文标识符一个都没改名、数字写法一个都没改。读数是 216 → 126 字符(省 42%)。

规则、局限与已知问题

  • 只动空白与注释:不改名、不折叠语句、不删代码。所以压出来一定还能跑,但体积会比 Terser 大。
  • 以 /*! 、//! 开头,或正文里写着 @license / @preserve 的注释会保留(法律声明),其余注释删除。
  • 换行只在「删了会改变程序行为」的地方保留:return / throw / break / continue / yield / async 之后,以及两条语句之间会被自动插入分号的地方(a\nb、x={}\nfoo())。其余代码通常压成一行。
  • JavaScript 走词法扫描而不是语法分析:字符串、正则、模板字面量里的 /* 与换行一个字符都不动。除号与正则靠上一个 token 区分;跨行的 / 按除号处理。
  • CSS 只删没有歧义的空白:{ } ; , > ~ ! 两侧、: 之后、} 之前的最后一个分号。选择器里的后代空格保留(.a .b 不是 .a.b),: 之前的空格保留(a :hover 不是 a:hover),calc(100% - 10px) 里的空格是语法要求,原样保留。
  • 不做改名(mangle)、不做死代码消除、不做 drop_console:这些都会改变运行时行为,压缩工具不该悄悄做。
  • 不支持:HTML / SVG(空白语义依赖 <pre>、<textarea> 与内联元素)、TypeScript 类型层改写、JSX/TSX 输入、source map、多文件合并。检测到 JSX 会给警告。
  • 字符串、模板、注释或 url( 在末尾没闭合只给警告,不算错误:后面的代码照常压缩。括号数量对不上同样只警告——本工具不是语法校验器。
  • 字符数按 Unicode 码点计(不是字节,也不是 UTF-16 单元);百分比取整,压缩后反而变大时显示 +n%。全部在浏览器里完成:不上传、不存储、不进 URL。
  • 超过 20 万字符时,结果会在停止输入约 0.6 秒后更新,不截断文本。输出统一用 LF,末尾不带换行。

压完还想对照原样,或者换一种格式看看?