vite-plugin-bundle-obfuscator

December 17, 2025 Β· View on GitHub

vite-plugin-bundle-obfuscator logo

vite-plugin-bundle-obfuscator

JavaScript obfuscator plugin for Vite environments

awesome-vite npm version npm downloads GitHub Release Date codecov GitHub License

πŸ“ Changelog Β· πŸ› Report Bug Β· ✨ Request Feature

English | δΈ­ζ–‡

⭐️ Features

  • βœ… ⚑ Supports JavaScript obfuscation in Vite projects.
  • βœ… πŸš€ Multi-threading support for better performance.
  • βœ… βš™οΈ Customizable obfuscator options to fit your needs.
  • βœ… πŸ›‘οΈ Auto-excludes node_modules.
  • βœ… πŸ“¦ Support the node_modules split chunk.

⚠️ Notice

  • If a memory overflow occurs, modify the packaging command to "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build", where max-old-space-size is set according to the configuration.
  • When setting up node_modules split chunk, please place the accurate package name at the front. For example: ["vue-router", "vue"], "vue" can match both "vue" and "vue-router" at the same time.

🌐 Online

✦ Vite - Vanilla ✦ Vite - Vue ✦ Vite - React ✦ Vite - PReact ✦ Vite - lit ✦ Vite - Svelte ✦ Vite - Solid ✦ Vite - Qwik ✦ ...

πŸ“¦ Installation

# Using npm
npm install vite-plugin-bundle-obfuscator -D

# Using pnpm
pnpm add vite-plugin-bundle-obfuscator -D

# Using yarn
yarn add vite-plugin-bundle-obfuscator -D

πŸ‘¨β€πŸ’» Usage

  1. Install the plugin using your preferred package manager.
  2. Register the plugin in vite.config.js
  3. Customize the obfuscator configuration or use the default options.

Example:

import vitePluginBundleObfuscator from 'vite-plugin-bundle-obfuscator';

// All configurations
const allObfuscatorConfig = {
  excludes: [],
  enable: true,
  log: true,
  autoExcludeNodeModules: true,
  // autoExcludeNodeModules: { enable: true, manualChunks: ['vue'] }
  threadPool: true,
  // threadPool: { enable: true, size: 4 }
  options: {
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 1,
    deadCodeInjection: false,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: false,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: false,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: false,
    ignoreImports: true,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayCallsTransformThreshold: 0.5,
    stringArrayEncoding: [],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 1,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 2,
    stringArrayWrappersType: 'variable',
    stringArrayThreshold: 0.75,
    unicodeEscapeSequence: false,
  }
};

export default {
  plugins: [
    vitePluginBundleObfuscator(allObfuscatorConfig)
  ]
};

// Simplified configurations
const minimizeObfuscatorConfig = {
  autoExcludeNodeModules: true,
  // autoExcludeNodeModules: { enable: true, manualChunks: ['vue'] }
  threadPool: true,
  // threadPool: { enable: true, size: 4 }
};

export default {
  plugins: [
    vitePluginBundleObfuscator(minimizeObfuscatorConfig)
  ]
};

// Default configurations
export default {
  plugins: [
    vitePluginBundleObfuscator()
  ]
};

🧡 Web Worker Support

By default, worker bundles generated from ?worker / new Worker(new URL(...)) are not obfuscated.

Enable worker obfuscation:

import vitePluginBundleObfuscator from 'vite-plugin-bundle-obfuscator';

export default {
  plugins: [
    vitePluginBundleObfuscator({
      obfuscateWorker: true,
    }),
  ],
};

Exclude extra files only for workers:

vitePluginBundleObfuscator({
  obfuscateWorkerExcludes: [/comlink\\.worker.*\\.js$/],
});

πŸš€ Performance Comparison

With 7000+ modules and 400+ bundles on a 4C 8G machine:

  • ThreadPool Enabled : 🟩🟩🟩⬜⬜⬜⬜⬜⬜ (About 30 seconds)
  • ThreadPool Disabled : πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯ (About 90 seconds)

πŸ› οΈ Options

Property NameDescriptionTypeDefaultVersion
threadPoolConfiguration for the thread pool.boolean | ({ enable: true; size: number } | { enable: false })falsev1.2.0
applyApply the plugin only for serve or build, or on certain conditions.'serve' | 'build' | ((this: void, config: UserConfig, env: ConfigEnv) => boolean)buildv1.1.0
autoExcludeNodeModulesEnable auto exclude node_modules.boolean | ({ enable: true; manualChunks: string[] } | { enable: false })falsev1.0.9 (originally boolean, extended to current type in v1.3.0)
obfuscateWorkerEnable or disable obfuscation for Web Worker bundles.boolean | { enable: boolean }falsev1.10.0
obfuscateWorkerExcludesAdditional excludes only for workers (final: excludes + obfuscateWorkerExcludes).(RegExp | string)[][]v1.10.0
logShow or hide log output.booleantruev1.0.4
enableEnable or disable the obfuscator.booleantruev1.0.1
excludesBundle names to be excluded. Starting from v1.0.8, RegExp is supported.(RegExp | string)[][]v1.0.0
optionsOptions for the JavaScript obfuscator.ObfuscatorOptionsdefaultObfuscatorConfigv1.0.0

πŸ“„ License

MIT License Copyright (c) 2024-present, Zoffy