@ismailnakkar/vite-obfuscator

中文文档
5.1.0发布于 2026/11/01MITTypeScriptES Module

Vite插件,它混淆了发货的JS岛,带有在静默损坏时构建失败的守卫。

中文使用文档
文档目录8 节
  1. 安装
  2. 使用
  3. VM标志
  4. 构建失败
  5. 输出
  6. 测试
  7. 升级
  8. 从4.倍

@ismailnakkar / vite-obfuscator

一个插件,用于混淆所选条目的块 javascript-obfuscator,可以选择 通过其Pro VM运行标记的函数,并且在受保护的代码发布时构建失败 可读,否则VM标记将丢失或移动。

安装

npm i -D @ismailnakkar/vite-obfuscator

8 .和 javascript-obfuscator 5.8.1+是对等体。虚拟机需要进行模糊处理。io Pro API令牌。

使用

import obfuscator from '@ismailnakkar/vite-obfuscator';
import {defineConfig} from 'vite';

export default defineConfig({
    plugins: [
        process.env.OBFUSCATE === 'true' && obfuscator({
            include: ['src/widget/index.js', 'src/widget/embed.js'],
            islandRoots: ['src/widget'],
            apiToken: process.env.OBFUSCATOR_API_TOKEN ?? '',
            vmObfuscation: true,
        }),
    ],
});

如上所述,将其闸门跳过;Vite忽略一个虚假的插件。

当一个块至少有一个条目到达它时,它就会被混淆 每一个 到达它的条目是in include. 一个 islandRoots 仅绑定到可读块中的模块在构建时失败。

当几个HTML页面加载相同的脚本时,Vite删除每个页面自己的块,以便页面匹配 没有条目。将该脚本添加到 build.rolldownOptions.input 和 include.

选项默认的
include要求写入的条目源路径 vite.config,不是条目名,不是 ./. 作为整段后缀匹配的: 'app.js' 每一个匹配 app.js 条目。
islandRoots要求要保护的代码目录,相对于Vite的目录 root.
vmObfuscationfalse通过Pro虚拟机运行标记的功能。如果出现以下情况,则构建失败 apiToken 是空的。
apiToken''Pro API令牌。忽略不 vmObfuscation.
vmObfuscationThreshold1VM。锁定在0-1。
timeout上游的VM。Pro API请求超时(毫秒)。
version最新的VM。Pro API运行的混淆器版本。
rehashtrue以其新字节的散列重命名每个混淆块。 false 用于在固定URL上提供的脚本。
maxGzipBytes0当被混淆的块压缩到超过此值的字节数时,构建失败。 0 是关闭的;每个块的原始大小和gzip大小都会被记录下来。
optionsPreset'high-obfuscation'javascript-obfuscator 预设,在插件自己的设置下。
overrides{}javascript-obfuscator 选项,最后合并。

high-obfuscation 打开 debugProtection (一个4000毫秒调试器循环)和 disableConsoleOutput. 用 overrides: {debugProtection: false, disableConsoleOutput: false}.

VM标志

在函数上方的行上用法律注释标记一个函数:

/*! javascript-obfuscator:vm */
export function detect() { … }

一个标记可以作为函数声明的前导 const/let/var 握着一个函数或箭头 函数、方法的导出、对象属性或包含一个方法的类字段。这些都是 插件接受的位置,而不是针对Pro VM验证的位置。有标记的模块可以 外 islandRoots.

插件集 build.rolldownOptions.output.comments 来 {legal: true} 所以标记存活了下来 缩小;以后的插件不能覆盖它。构建仍然可以移动一个标记:

  • 光交叉连接 (默认的minifier)在a上移动1 const/let/var;
  • 要简洁 内联一个被调用一次的标记函数;
  • 利差无论是否缩小,都可以内联一次性对象并移动其属性标记。

标记函数声明,oxc和Rolldown将其保留。用简洁,还是留记号 在 const/let/var,设置 build.minify: false 并减少插件没有的块 在你自己的插件中混淆。

当在源和块之间丢失标记时,构建失败,没有导致自己的功能,或者 标记在声明的地方导出函数(export function f, export const f =)那是 tree-shaken。未检测到:标记落在未标记的函数上,无论minifier是否移动了它 或者删除了标记的函数,但没有在声明的地方导出它。删除已标记的函数 停止使用。

构建失败

在写入任何内容之前,每次检查都会使构建失败,并显示一条指定原因的消息。两个 需要更多:

  • … bundled but NOT obfuscated:将导入条目添加到 include,或将模块移出 islandRoots.
  • … is in an import cycle between obfuscated chunks打破这个循环。

输出

进口商,每一次排放 .html,和 build.manifest, build.ssrManifest 和 build.chunkImportMap 文件被重写为重新命名的名称。混淆块的源映射为 加上一个警告:它 sourcesContent 将发送可读的代码。

该插件以后顺序运行 generateBundle,所以你自己的正常顺序是可读的 块。

轻快地清空 outDir 在此运行之前:with emptyOutDir 因此,就地构建不提供任何资产 在整个过程中(使用虚拟机的时间为几分钟),并在出现故障后将该目录清空。构建成 另一个目录并交换它,或者设置 build.emptyOutDir: false 自己修剪陈旧的资产。

测试

插件只运行在 vite build,所以应用测试不需要伪造或设置。这个包的套件: npm test.

升级

从4.倍

5.0忽略这些选项(TypeScript将它们报告为多余属性);删除:

  • enable剩下的人 enable: false 现在混淆。将调用改为Gate(参见 使用)。
  • vmTargetFunctionsMode, vmTargetFunctions, vmExcludeFunctions:用 /*! javascript-obfuscator:vm */,现在是唯一的模式。 overrides 仍然到达上游的根 模式,无保护,并且只有带有标记的块到达虚拟机。
  • mustContain:按正常顺序检查chunk内容 generateBundle 你自己的。

版本与发布记录

@ismailnakkar/vite-obfuscator 共发布 10 个版本,首次发布于 2026/09/20;过去 12 个月发布了 10 个版本。

版本发布日期距今
5.1.0latest2026/11/012 天前
5.0.02026/10/2014 天前
4.0.12026/10/1915 天前
4.0.02026/10/1915 天前
3.0.12026/10/1816 天前
3.0.02026/10/1717 天前

关于 @ismailnakkar/vite-obfuscator 的常见问题

@ismailnakkar/vite-obfuscator 是什么?

Vite插件,它混淆了发货的JS岛,带有在静默损坏时构建失败的守卫。

如何安装 @ismailnakkar/vite-obfuscator?

在项目目录运行 npm install @ismailnakkar/vite-obfuscator,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vite(^8.0.0)、javascript-obfuscator(^5.8.1)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@ismailnakkar/vite-obfuscator 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@ismailnakkar/vite-obfuscator 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@ismailnakkar/vite-obfuscator 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^20.19.0 || >=22.12.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@ismailnakkar/vite-obfuscator 可以商用吗?

@ismailnakkar/vite-obfuscator 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@ismailnakkar/vite-obfuscator 还在维护吗?

最新版本 5.1.0 发布于 2026/11/01(2 天前);至今共发布 10 个版本,其中过去 12 个月发布了 10 个;首次发布于 2026/09/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。