文档
/

运行环境兼容性

运行环境兼容性

请根据实际运行环境选择 target。Browser 和 Node 构建可能包含不同的防御,Browser 目标不能替代 Node。

target

  • browser:Chrome、Firefox、Safari、Edge。
  • browser-no-eval:与 browser 相同,但输出不使用 eval()。当目标页面的内容安全策略禁止 eval/unsafe-eval 时使用。
  • node:Node.js 环境。浏览器专用的选项会被禁用(它们需要 window/document,在 Node 中要么不起作用,要么会抛出异常)。部分依赖仅浏览器 API 的 vmSelfDefending 防御(无头浏览器检测、基于 iframe 的干净 realm 恢复、反检查器/DOM 检查)不会为此目标生成。
  • service-worker:Service Worker 上下文。没有 window,没有 document,self 全局对象也不同。
  • userscript:用户脚本管理器沙箱(例如 Tampermonkey)。vmSelfDefending 的防御会相应调整。需要 VM Obfuscation(或 Parse HTML)以及混淆器 v6.9.0+。
  • bytenode:用于将要通过 bytenode 编译为 .jsc 的代码。需要 VM Obfuscation(或 Parse HTML)以及混淆器 v6.13.0+。

浏览器环境与域名

关于代码运行位置的声明必须与实际部署一致。browserEnvironment 必须如实描述构建的实际提供方式(请参阅 Browser Environment),VM Domain Lock 必须列出提供该构建的每个域名(请参阅 VM Domain Lock)。自动化工具和调试器可能会触发高级防护;请参阅测试与 CI。

JavaScript

混淆可能会改变函数名和函数源码文本。不要把 .name 或 .toString() 当作稳定的应用数据;请改用显式的标识符。在您的设置需要时,公共全局变量可能仍然可见。

strictMode

strictMode: null 和 strictMode: false 仍会把显式指令、ES 模块和类方法识别为严格模式。strictMode: true 会把所有输入都视为严格模式。请与最终的运行上下文保持一致;如果打包工具在混淆之后才添加严格模式,行为可能会改变。

构建流程

在最终的混淆步骤之前,先编译 TypeScript 或 JSX 并打包您的应用。在整个构建过程中保留 /* javascript-obfuscator:vm */ 注释,使 comment 模式仍能找到它们。之后请不要对启用了 Self Defending 或 VM Self Defending 的输出进行压缩、格式化或其他改写。VM 混淆和 HTML 混淆不提供 source map。