JavaScript 格式化与压缩工具

JavaScript 代码的美化、压缩与校验三合一。美化模式基于括号深度追踪智能换行缩进,压缩模式移除注释与空白减小体积,校验模式输出函数语句统计与未闭合括号问题清单。手写 JS 词法分析器,正确识别字符串、模板字符串、注释与正则字面量。数据仅在浏览器本地处理。

美化(缩进) 结果0 字 · 0
结果将显示在这里
所有数据仅在你浏览器内处理,不会上传到任何服务器。手写 JS 词法分析器,正确识别字符串、模板字符串、注释与正则字面量。

常见问题

什么是 JavaScript 格式化?为什么需要它?

JS 格式化(也称美化或 Pretty Print)是将压缩或缩进混乱的 JS 代码重新按层级缩进对齐的过程。它不改变代码语义,只调整可读性。常见场景:①还原压缩后的生产 JS 源码;②阅读第三方库或框架的压缩代码;③整理复制粘贴的代码片段;④代码审查时统一缩进风格。本工具支持 2 空格、4 空格、Tab 三种缩进,可选保留注释。

JS 压缩能减小多少体积?

压缩效果取决于原代码的空白与注释量。典型场景:含大量缩进与注释的源码压缩后可减小 40-70% 体积;已经是单行的代码压缩收益有限(约 5-15%)。本工具压缩模式移除注释与所有多余空白,合并为单行。注意 JS 压缩不同于 CSS/HTML,需保留必要的分号防止 ASI(自动分号插入)陷阱,并保留标识符间的空格防止词法粘连(如 return x 不能合并为 returnx)。

如何区分除法与正则字面量?

JS 中 / 既是除法运算符又是正则字面量开始符,区分需依赖上下文。本工具通过「前一个有意义 token」判断:①前一个 token 是标识符(非 return/typeof/case 等关键字)、数字、字符串、正则、)]}true/false/null/this/super → 除法;②前一个 token 是 =(,;{[!&&||returntypeofnewthrowcase 等 → 正则字面量。这是手写 JS tokenizer 的经典难点。

支持哪些 JS 语法?

本工具手写词法分析器,正确处理以下语法:①函数声明与表达式(function foo() {}const f = function() {});②箭头函数((x) => x * 2x => { return x; });③类声明(class Foo { constructor() {} method() {} });④模板字符串(`Hello, ${name}!`);⑤正则字面量(/^https?:\/\//i,含字符类与 flags);⑥注释(// 单行/* 多行 */);⑦数字字面量(十进制、0x 十六进制、0o 八进制、0b 二进制、科学计数法 1e3);⑧多字符运算符(===!==...**=&&=??=>>> 等);⑨可选链(?.)与空值合并(??)。

校验模式会执行哪些检查?

校验模式遍历 token 流输出统计与问题清单:①统计字符数、行数、函数数(含 function 关键字与 => 箭头函数)、语句数(; 近似计数)、字符串数、注释数、最大嵌套深度;②检测未闭合的花括号 {、圆括号 (、方括号 [;③检测未闭合的字符串('"`)与多行注释 /*。注意本工具不做语法错误检测(如未定义变量、类型错误),仅做词法层面的统计与平衡性检查。

为什么美化时对象字面量会被展开为多行?

本工具采用「括号深度追踪」策略而非完整 AST 解析,无法区分 {} 是代码块还是对象字面量。为统一处理,所有 { 都触发换行 + 缩进递增,} 触发缩进递减 + 换行。因此 const obj = { a: 1, b: 2 }; 会被美化成 const obj = { \\n a: 1, b: 2 \\n}(属性仍在一行,未按逗号拆分)。这是「智能缩进」与「完整 AST 重排」的取舍:前者实现简单、零依赖、不破坏代码,后者效果更好但需引入重型解析器(如 Babel/ESLint)。如需更精细的对象格式化,建议使用 Prettier。

与 HTML/CSS 格式化工具有何联动?

三者形成「标记 + 样式 + 脚本」完整三件套:HTML 格式化工具处理 HTML 结构,CSS 格式化工具处理样式代码,本工具处理 JS 脚本。典型流程:用 HTML 格式化工具美化页面结构(<script> 标签内的 JS 内容会被原样保留不格式化),将 <script> 内的 JS 复制到本工具单独美化或压缩。

支持 JSX/TypeScript 吗?

本工具针对标准 JavaScript(ES2023+)设计,不专门支持 JSX/TSX/TypeScript 扩展语法。①JSX 的 <Component prop={value} /> 会被当作标点与标识符处理,< / > 会被误判为运算符,美化效果可能不理想;②TypeScript 的类型注解(: string)、接口(interface Foo {})、泛型(<T>)、枚举(enum Color {})等会被当作普通 JS 标识符处理,多数场景能正常美化,但类型参数 <T> 可能被误判为比较运算。如需 JSX/TSX 支持,建议使用 Prettier 或 ESLint。

压缩后会引入 ASI 陷阱吗?

不会。ASI(Automatic Semicolon Insertion,自动分号插入)是 JS 引擎在行尾缺少分号时自动补全的机制,但某些场景下会失效导致 bug(如行首是 [(`+- 时会与前一行合并)。本工具压缩模式保留所有原始分号,不主动移除分号,因此不会引入 ASI 陷阱。生产级压缩工具(如 Terser)会做更激进的分号省略与 ASI 分析以进一步减小体积,本工具为安全起见保留全部分号。

数据会上传到服务器吗?

不会。本工具完全在浏览器内运行,所有词法分析、美化、压缩、校验逻辑由 JavaScript 在你本地执行,输入内容不会发送到任何服务器。