Free 是基线:完整的变换目录,统一应用于你的整个 bundle,在你自己的机器上运行,完全免费。当一次许可证校验、一段计价逻辑或一个内嵌凭据的价值远高于周围其余代码时,Pro 就是为这种不均匀的 bundle 准备的。
Pro 改变的是保护落在哪里、精度有多高,而不改变任何单个变换本身的强度。两个层级都可以把 complexity 拉到你的体积预算所能承受的最高值。
Free 已经给你的能力
这不是一个有上限的试用版。Free 运行完整流水线:complexity 没有上限,阶梯上的每一档预设都可以使用。
- 每一档预设:
minify(目标 0)、light(5)、medium(7)、hard(12)、extreme(25),以及你自行设置的任意数值目标。默认是light。 - 每一种变换。 字面量下沉、控制流扁平化、不透明谓词、混合布尔运算、整数表达式字节码、常量具象化、作用域加深、跨依赖纠缠。
- 每次构建都是全新结构。 不设置 seed 即可让每次构建都抽取新的种子;需要可复现输出时再固定它。
- 你能想到的其他一切:Protection Map、source map、框架插件、框架检测。混淆本身不需要账户、不需要 key、不需要任何网络请求。
- 默认对调试友好。 Devtools、断点、
console.log和监视表达式都能照常使用。当构建报告了什么问题时,参见诊断。
输出体积随预设增长;实测体积见性能。Pro 让你只在值得的地方花费这些体积,而不必为整个 bundle 都提高预设。
Pro 买到的东西
可以瞄准目标的保护
在 Free 上,你的配置会平等地应用到 bundle 中的每一个节点。在 Pro 上,一段标记区域可以覆盖你的全局设置。
实际上这意味着你可以把 bundle 整体留在 light,以获得更快的构建和更小的体积,同时仍然在真正重要的那二十行代码上使用 extreme:
/* @afterpack preset=hard */
function verifyLicense(token) {
// raised to complexity target 12, string floor forced on
}
/* @afterpack end */
/* @afterpack skip */
function debugPanel() {
// target 0, floor off — left alone
}
/* @afterpack end */区域来自 @afterpack 块注释。指令由插件从你的源码中读取。
指令可以设置什么:任何按区域生效的选项。
负责读取的插件是 @afterpack/next、@afterpack/vite、@afterpack/webpack,或其余框架。由 npx afterpack@latest <path> 驱动的 Pro 构建会在整个 bundle 上获得 Pro 保护,但没有区域:CLI 运行在已构建的输出上,那里的注释已经不存在,因此它不读取指令,并会拒绝 directives.enabled。
针对许可证和支付路径的加固
两项 Free 构建不会应用的保护,你可以开启:
| 设置 | 它为你做了什么 |
|---|---|
transforms.selfIntegrity.enabled | 对它自身的校验表加一道检查,只检测对这张表的修改。对你代码其他地方的修改不会被检测到。未被改动时,它不会改变任何东西。 |
transforms.comparisonHardening.enabled | 一次字符串相等性判断会变成单向摘要校验,因此你用来比较的字面量会从产物中完全消失。 |
两者默认都是关闭的。确认一个被标记的反射模式,在两个层级上的做法相同:在你的配置中使用 reflection.allow。它不能通过指令设置。
构建运行在 AfterPack 的基础设施上
一个 key 会把你构建中的文件路由到 AfterPack 的云端,每个文件处理完成后即返回受保护的输出。不需要额外安装什么,也不需要维护更新。
源码在内存中处理,不会被持久化保存。引擎所在位置发生变化时会有什么不同,参见部署模式。
每一次构建的记录
云端构建都会被记录下来。AfterPack 会保存该次构建的 Protection Map 以及一行汇总指标,这样控制台就能展示任意最近构建的地图、诊断信息和耗时。这样无需重新运行任何东西,就能回答“这次发布到底有没有被保护?”这个问题。存储按项目进行,也可以关闭。保留期为一年且每个项目最多保留最近 500 次构建,以先到期者为准。用量按兆字节计量。参见 Pro 如何收费。
按层级划分的完整能力矩阵,参见套餐与层级。
Pro 如何收费
Pro 计量的是用量,而不是席位。你购买的是**云端引擎处理的 JavaScript 的 MB 数**:不是构建次数,不是文件数,也不是请求数。包括 Free 在内,每个层级的工作区成员数都没有上限。
一个 Pro key 会把你整个客户端 bundle 都路由经过云端引擎,它处理的每一个字节都会被计量,包括标记区域之外的代码。一个 1.5 MB 的 Next.js 客户端 bundle,每次构建都会消耗月度配额中的 1.5 MB。
获取 Pro 额度有三种方式:
- 注册即可免费获得:每月 10 MB,无需绑卡。 足够在真实 bundle 上使用这些精准功能并比较输出结果。参见账户。
- Extra MB:一次性 $5 购买 20 MB。 永不过期,不会自动续费,购买它也不会开启订阅。每隔几周才发布一次的项目,仅靠充值就足够运行。
- 当用量足够大、订阅更划算时,可选择起价 $49/月 的套餐。 Indie 每月包含 500 MB,Team 为 3 GB,Studio 为 8 GB,每档都支持按 MB 自动计费的超额用量,避免繁忙的迭代周期让 CI 失败。Indie 和 Team 都包含 14 天试用。
一次构建按先用套餐配额、再用 Extra MB、最后才计超额的顺序扣减,所以充值额度排在月度配额之后,而不会被优先消耗。价格、项目数量上限、超额费率和消费上限都在套餐与层级中。
作为参考,一个典型的生产环境 SPA bundle 大小在几百 KB 到一两 MB 之间。免费的 10 MB 能覆盖好几次真实构建,Indie 的 500 MB 能覆盖几百次。
即将推出
目前尚不可用。以下是公开路线图上的 Pro 相关项目,AfterPack 在那里说明即将推出的内容,但不给出具体日期。
| 能力 | 它会带来什么 |
|---|---|
| 跨模块混淆 | 跨越模块边界而不仅是在单个文件内进行纠缠。 |
| 网络传输伪装 | 为你的 API 请求和响应生成逐次构建的编解码器,作用于网络传输层。 |
| 托管 source map | 通过经过身份验证的查询还原生产环境的堆栈跟踪,而 map 本身永远不会发布出去。 |
Pro 专属设置在 Free 构建上会怎样
遇到会提高保护强度的按区域指令时,Free 构建会直接终止,而不会用比源码要求更弱的保护继续下去,并会忽略其他任何指令。上面两项加固设置则完全不会被应用。无法连接到云端的 Pro 构建会失败即中止。
下一步
- 部署模式:每个层级在哪里执行,以及失败即中止在实践中意味着什么。
- Cloud API 参考:每一次 Pro 构建背后的线上协议。
- 层级:价格、MB 额度,以及各个套餐分别适合什么场景。
- Protection Map:一次构建的地图展示了什么,以及它存储在哪里。打开实时演示。
- 指令:上面区域标记的完整语法。
- 配置:所有的 key、flag、变量和指令,汇总在一处。
- 控制台中的构建:一次被记录的云端构建,事后看起来是什么样子。