跳到正文

JavaScript 美化与压缩

JavaScript Beautifier & Minifier

只删注释和空白来压缩 JavaScript 或 TypeScript,不改任何名字;也能把挤成一行的打包产物重新缩进,让它重新可读。

把压缩过的 JavaScript 或 TypeScript 美化到能读,或者在你想让它更小时去掉注释和空白。它建立在分词器而不是解析器上,这条边界正是它诚实的地方:不重命名任何东西,不改写任何表达式,字符串、模板和正则内部一概不碰。

🔒 完全在你的浏览器里运行javascriptformatminifybeautify
模式
缩进

JavaScript · TypeScript 输入

拖入 .js 或 .ts 文件

只在这个标签页里读取,不上传。

整理结果

Token

109

行数

18

说实话:这是个分词器,不是解析器

  • · 分词器能准确分辨正则字面量和除法,分辨模板字面量里的 ${ {a:1}.a },也分辨字符串里的 //。所以字符串、模板和正则里面的内容一个字符都不动。
  • · 压缩只删注释和空白。它不重命名任何东西,不改写任何表达式,并且保留自动分号插入(ASI)所依赖的换行—— return 之后、后置 ++ 之前、以及下一行以 ( 或 [ 开头的地方。它压不到 Terser 那么小,但也不会改变行为。
  • · 格式化靠花括号、方括号的深度和 ; 找出语句边界,重新缩进,并保留原本就在那儿的换行。它不会补分号,不会折长行,也分不出对象字面量和代码块,所以两者都是一行一项。
  • · TypeScript 的泛型 Map<string, T> 和比较式 a < b 靠看前后的 token 区分。JSX 不处理。
  • · 把混淆过的打包文件摊开到能读,这就够了;要提交的代码,Prettier 才是对的工具。

要找出压缩后的堆栈信息背后的原始位置,请用 Source Map 还原。

怎么用

  1. 粘贴代码或拖入文件

    挤成一行的打包产物、缩进混杂的文件、带泛型的 TypeScript——读法都一样。文件在这个标签页里读取。

  2. 选「格式化」或「压缩」

    「格式化」按花括号深度重新缩进,不动你原有的换行。「压缩」只去掉注释和空白,别的什么都不做;你要求的话会保留 `/*!` 许可证头。

  3. 盯着记号流检查

    每次运行都会把输出的有效记号和输入比较。一旦不同,页面会用红色说出来,并告诉你改用你的输入——这是唯一绝不能沉默的失败模式。

常见问题

为什么我压缩后的文件还是比 Terser 的大?

因为这里只删注释和空白。Terser 会解析程序,能重命名局部变量、折叠常量、删除死分支;那需要 AST 和作用域分析,任何一处细微的错误都会改变行为。这里的取舍是:省得少一些,但不会弄坏你的代码。

压缩会破坏自动分号插入吗?

不会——ASI 依赖的换行都保留了:`return` 之后、后缀 `++` 之前,以及下一行以 `(` 或 `[` 开头的地方。这些正是去掉一个换行就会改变程序行为的位置。

为什么我的对象字面量出来是一行一个属性?

因为分词器分不出对象字面量和代码块——两者都是 `{`。处在花括号深度上的一切得到同样的处理。解析器会知道区别;这个工具有意不做解析器。

支持 JSX 吗?

不支持。JSX 需要这里没有的解析器——在记号层面 `<Foo>` 和一次比较无法区分,而能应付 `Map<string, T>` 的泛型启发式已经是猜测的极限了。`.tsx` 文件请用 Prettier。

我能用它代替 Prettier 吗?

用来读一个混淆过的打包产物,能——它就是干这个的。用在你准备提交的代码上,不能:它不插入分号,不折长行,对参数列表没有任何主张。Prettier 是从 AST 重新打印的,所以它能。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。