
WebSafeCompiler (WSC) 是一款高级实用工具(网站编译器),专为使用 Node.js 的 Web 应用程序和网站进行优化、压缩和混淆(如有需要)而设计。它通过减小文件大小或提供针对逆向工程的持久保护来增强您的 Web 资源,确保您的代码可随时部署且安全可靠。
[!NOTE]
适用于 *.github.io 站点
该编译器是单体式的:所有实现都位于 source/wsc.js 中。回归测试单独位于 tests/ 中。
要充分发挥 WebSafeCompiler 的潜力,请在终端中执行以下命令:
node wsc.js <input_dir> <output_dir> [--map] [--smart] [--drm]
<input_dir>:包含待处理源文件的目录。<output_dir>:优化和混淆后的文件将输出到的目录。-m, --map:在输出目录中创建 sitemap.xml 以提升 SEO-s, --smart:自动检测已压缩的文件并跳过它们。这包括 JS 和 CSS 文件。-d, --drm:启用代码混淆(DRM 保护),以保护您的源代码免遭未经授权的分析。
class、id 和 title 值进行编码。现有的类名和属性会被保留。检测到的选择器和 DOM 检查依赖项会通过控制台警告来限制干扰。-h, --help:显示包含详细使用说明的帮助信息。-v, --version:输出 WebSafeCompiler 的当前版本。node wsc.js "/path/to/source" "/path/to/output" --drm --smart
此命令将处理指定源目录中的所有文件,对其进行优化,并且如果启用了混淆标志,还会保护代码免遭未经授权的访问或篡改。输出文件将可直接部署到您的 Web 环境中。

WebSafeCompiler 使用以下库来处理 JavaScript 代码:
要开始使用 WebSafeCompiler,您需要在系统上安装 Node.js。请按照以下步骤安装所需的软件包:
安装 Node.js:从 Node.js 官方网站 下载并安装 Node.js。请按照适用于您操作系统的安装说明进行操作。
克隆仓库:如果您还没有克隆仓库,请将其克隆到本地计算机:
git clone <repository-url>
cd <repository-directory>/source
安装依赖项:导航到项目目录并安装必要的 npm 软件包:
npm install
完成!您可以开始使用 WSC 了。
WSC 会压缩 HTML 标签/属性的间距并移除普通 HTML 注释,同时保留带引号的值、文本空白、原始 script/style 内容、条件注释以及框架标记。检测到源代码/注释检查时,会禁用这些标记编辑并发出警告。JavaScript 使用局部名称混淆和五轮压缩,同时保留公共全局变量和函数名。DRM 保留控制流平坦化、死代码注入以及使用 base64 编码的完整字符串数组覆盖。CSS 会被解析并压缩;不支持的 JS 以及带有解析器警告的 CSS 将保持不变并发出警告。非 UTF-8 资源会被直接复制而不进行转换。本地 SRI 资源在 HTML 之前处理,然后根据 script、stylesheet、preload 和 template 引用中的最终字节重新计算 SHA-256/384/512 元数据。可访问的 CSP 策略中匹配的外部脚本哈希也会被更新。如果任何引用页面具有不可用的 CSP 或无法安全地重写为 UTF-8,则共享资源将保持不变并发出 DRM 警告。无效的 SRI 元数据仍会被阻止;外部托管的资源不会被重写。
DRM 会向现有的 class 属性添加随机类,并在符合条件的普通 HTML 标签的每个真实属性周围添加两个随机惰性属性。随机名称会对照 HTML、CSS 和 JS 源文本进行检查。类相等/子字符串选择器会保留受影响的类值;AST 分析将类/属性检查范围限定为静态识别的元素、不可变别名和观察者子树,并使用每个页面及其本地 JS/CSS 依赖项。不相关的元素仍会收到噪声。未知接收者、运行时选择器、解构和未解析的观察者使用保守的回退方案并打印警告。Script/style/meta/noscript 标签、自定义元素以及外部 SVG/MathML 节点不会收到垃圾属性。这些防护措施覆盖了已知依赖项;动态计算的选择器或反射并不总能被静态推断出来。
在 DRM 模式下,当应用了受支持的 CSP 配置时,WSC 会自动将符合条件的行内 JavaScript 提取到每个 HTML 文档旁边混淆后的 wsc-inline-*.js 文件中:根 _headers、根 vercel.json(headers 规则)或 HTML CSP meta 标签。它在输出策略中向 script-src-elem 添加 'self',保留其他源权限、事件处理程序的 script-src 规则以及无关指令。这有意将脚本权限扩大到同源文件。将生成的 JavaScript 和头配置与 HTML 一起部署。Nonce 保持不变;生成的文件包含 SRI 哈希。支持字面路由和 * 通配符。
生成的 script 标签保持在其原始位置。经典脚本仍会阻塞解析器;添加 src 时,被忽略的行内 async/defer 属性会被移除。模块保留其属性,并且文件会生成在文档旁边,以保留相对导入解析。导入映射、数据脚本、样式和事件处理程序保持行内。
当提取不可用时,WSC 会打印警告:外部/未知 CSP、不支持的路由、strict-dynamic、<base href>、异步脚本、模板脚本、无效 JavaScript,或检测到的源/URL 依赖,例如 document.currentScript.src、import.meta 和 document.write。在可能的情况下,它改为混淆行内代码,并更新可访问策略中的 SHA-256/384/512 哈希。读取其原始脚本源代码的代码以及没有可访问策略的代码保持不变。读取 document.currentScript.src、document.write/writeln、import.meta 和模板脚本会阻止提取,但当 CSP 可访问时不会禁用行内混淆;模板执行和源 URL 会被保留。现有策略禁止的脚本不会被新授权。在没有 DRM 的情况下,符合条件的行内 JavaScript 会被压缩,并且当 CSP 可访问时其哈希会被更新;否则保留原始源代码并给出警告。外部 JS 处理和 HTML 属性编码在 DRM 中保持启用。独立提供的附加 HTTP 策略必须与项目策略一致;任意源反射和时序依赖无法通过静态分析普遍推断。
输入和输出目录不得重叠。输入符号链接会被跟随,其内容会按链接的相对路径进行编译。目录循环以及指向输出的输入链接会被跳过并给出警告;预先存在的输出链接会被拒绝,以防止意外写入。
从 source 运行浏览器回归测试套件(测试运行器需要 Node.js 18 或更高版本):
npm install
npx playwright install chromium
npm test
测试位于 tests/browser.js。该测试套件在操作系统临时目录中创建故意畸形的站点,并在桌面和移动宽度下比较四种标志组合的浏览器行为和截图。它检查实际生成的 JS 文件、执行顺序、被忽略的内联 async/defer 属性、模块导入、生成的 SRI、来自生成的 _headers/vercel.json 的 CSP,以及外部管理的 CSP。它还检查作用域属性/类检查、观察者子树、动态选择器回退、混淆的 document.write 和 import.meta、模板脚本插入、使用多种算法和无填充哈希的原始字节 SRI、preload/CSS SRI、被阻止的不匹配完整性、strict-dynamic、基础 URL 以及异步执行。DRM 跳过会报告受影响的文件或元素及原因,包括智能模式、编码、不支持的 JS、无法访问的 SRI/CSP、外部脚本和事件处理器。浏览器 CSP 违规会导致测试失败。测试夹具和截图保留在打印的临时目录中以供检查。要在 PowerShell 中使用已安装的 Microsoft Edge:
$env:WSC_BROWSER_CHANNEL = 'msedge'
npm test
本项目采用 MIT 许可证授权。更多详情,请参阅 LICENSE 文件。