Skip to content

z0ffy/vite-plugin-bundle-obfuscator

Repository files navigation

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 Name Description Type Default Version
threadPool Configuration for the thread pool. boolean | ({ enable: true; size: number } | { enable: false }) false v1.2.0
apply Apply the plugin only for serve or build, or on certain conditions. 'serve' | 'build' | ((this: void, config: UserConfig, env: ConfigEnv) => boolean) build v1.1.0
autoExcludeNodeModules Enable auto exclude node_modules. boolean | ({ enable: true; manualChunks: string[] } | { enable: false }) false v1.0.9 (originally boolean, extended to current type in v1.3.0)
obfuscateWorker Enable or disable obfuscation for Web Worker bundles. boolean | { enable: boolean } false v1.10.0
obfuscateWorkerExcludes Additional excludes only for workers (final: excludes + obfuscateWorkerExcludes). (RegExp | string)[] [] v1.10.0
log Show or hide log output. boolean true v1.0.4
enable Enable or disable the obfuscator. boolean true v1.0.1
excludes Bundle names to be excluded. Starting from v1.0.8, RegExp is supported. (RegExp | string)[] [] v1.0.0
options Options for the JavaScript obfuscator. ObfuscatorOptions defaultObfuscatorConfig v1.0.0

πŸ“„ License

MIT License Copyright (c) 2024-present, Zoffy