一、依赖安装要求
webpack: ^4.44.1
webpack-obfuscator: ^2.6.0
javascript-obfuscator: ^2.10.0
terser-webpack-plugin:^4.2.3
npm i webpack@^4.44.1 javascript-obfuscator@^2.10.0 webpack-obfuscator@^2.6.0 terser-webpack-plugin@^4.2.3 -save-dev
二、配置
vue.config.js
- 注意: 该配置只加到正式打包环境中,测试环境不打包
const TerserPlugin = require('terser-webpack-plugin')
const WebpackObfuscator = require('webpack-obfuscator');
const isProd = process.env.NODE_ENV === "production";
module.exports = {
configureWebpack: config => {
config.name = name;
config.resolve = {
...config.resolve,
alias: {
'@': resolve('src'),
'@components': resolve('src/components'),
'@view': resolve('src/view')
}
};
// 压缩
config.optimization = {
...config.optimization,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true // 打包时删除所有的 console
}
}
})
]
};
if (isProd) {
config.plugins.push(new WebpackObfuscator({
compact: true, // 启用代码压缩
controlFlowFlattening: false, // 启用控制流扁平化
deadCodeInjection: false, // 启用死代码注入
debugProtection: false, // 启用调试保护
debugProtectionInterval: false, // 启用调试保护(以间隔暂停)
disableConsoleOutput: true, // 禁用控制台输出
identifierNamesGenerator: 'hexadecimal', // 标识符名称生成器
log: false, // 禁用日志记录
renameGlobals: false, // 启用全局变量重命名
rotateStringArray: true, // 启用字符串数组旋转
selfDefending: true, // 启用自我防御模式
stringArray: true, // 启用字符串数组
// rotateUnicodeArray: false, // 启用Unicode数组旋转
stringArrayEncoding: ['base64'], // 字符串数组编码方法
stringArrayThreshold: 0.75, // 字符串数组转换的阈值
unicodeEscapeSequence: false, // 禁用Unicode转义序列
transformObjectKeys: true, // 启用对象键转换
exclude: [/node_modules/, /dist/, /\.min\.js$/] // 排除的文件或目录
}, []))
}
}
}
注意
chainWebpack下的ScriptExtHtmlWebpackPlugin相关代码要去掉,不然会报错无法打包
image.png
WebpackObfuscator配置
高度混淆
低性能:性能比没有模糊处理慢 50%-100%
new JavaScriptObfuscator({
// 压缩代码
compact: true,
// 是否启用控制流扁平化(降低1.5倍的运行速度)
controlFlowFlattening: true,
// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
controlFlowFlatteningThreshold: 1,
// 随机的死代码块(增加了混淆代码的大小)
deadCodeInjection: true,
// 死代码块的影响概率
deadCodeInjectionThreshold: 1,
// 此选项几乎不可能使用开发者工具的控制台选项卡
debugProtection: true,
// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
debugProtectionInterval: true,
// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
disableConsoleOutput: true,
// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
identifierNamesGenerator: 'hexadecimal',
log: false,
// 是否启用全局变量和函数名称的混淆
renameGlobals: false,
// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
rotateStringArray: true,
// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
selfDefending: true,
// 删除字符串文字并将它们放在一个特殊的数组中
stringArray: true,
stringArrayEncoding: 'rc4',
stringArrayThreshold: 1,
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
transformObjectKeys: true,
unicodeEscapeSequence: false
}, [])
中度混淆
最佳性能:性能比没有模糊处理慢 30%-35%
new JavaScriptObfuscator({
// 压缩代码
compact: true,
// 是否启用控制流扁平化(降低1.5倍的运行速度)
controlFlowFlattening: true,
// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
controlFlowFlatteningThreshold: 0.75,
// 随机的死代码块(增加了混淆代码的大小)
deadCodeInjection: true,
// 死代码块的影响概率
deadCodeInjectionThreshold: 0.4,
// 此选项几乎不可能使用开发者工具的控制台选项卡
debugProtection: false,
// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
debugProtectionInterval: false,
// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
disableConsoleOutput: true,
// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
identifierNamesGenerator: 'hexadecimal',
log: false,
// 是否启用全局变量和函数名称的混淆
renameGlobals: false,
// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
rotateStringArray: true,
// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
selfDefending: true,
// 删除字符串文字并将它们放在一个特殊的数组中
stringArray: true,
stringArrayEncoding: 'base64',
stringArrayThreshold: 0.75,
transformObjectKeys: true,
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
unicodeEscapeSequence: false
}, []),
低混淆
高性能: 性能稍微慢于没有混淆
new JavaScriptObfuscator({
// 压缩代码
compact: true,
// 是否启用控制流扁平化(降低1.5倍的运行速度)
controlFlowFlattening: false,
// 随机的死代码块(增加了混淆代码的大小)
deadCodeInjection: false,
// 此选项几乎不可能使用开发者工具的控制台选项卡
debugProtection: false,
// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
debugProtectionInterval: false,
// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
disableConsoleOutput: true,
// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
identifierNamesGenerator: 'hexadecimal',
log: false,
// 是否启用全局变量和函数名称的混淆
renameGlobals: false,
// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
rotateStringArray: true,
// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
selfDefending: true,
// 删除字符串文字并将它们放在一个特殊的数组中
stringArray: true,
stringArrayEncoding: false,
stringArrayThreshold: 0.75,
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
unicodeEscapeSequence: false
}, [])
主要属性
{
// 压缩,无换行
compact: true,
// 是否启用控制流扁平化(降低1.5倍的运行速度)
controlFlowFlattening: false,
// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
controlFlowFlatteningThreshold: 0.75,
// 随机的死代码块(增加了混淆代码的大小)
deadCodeInjection: false,
// 死代码块的影响概率
deadCodeInjectionThreshold: 0.4,
// 此选项几乎不可能使用开发者工具的控制台选项卡
debugProtection: false,
// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
debugProtectionInterval: false,
// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
disableConsoleOutput: false,
//锁定混淆的源代码,使其仅在特定域和/或子域上运行。这使得某人只需复制并粘贴您的源代码并在其他地方运行就变得非常困难。
domainLock: [],
//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
identifierNamesGenerator: 'hexadecimal',
//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀
identifiersPrefix: '',
inputFileName: '',
// 允许将信息记录到控制台。
log: false,
// 是否启用全局变量和函数名称的混淆
renameGlobals: false,
// 禁用模糊处理和生成标识符
reservedNames: [],
// 禁用字符串文字的转换
reservedStrings: [],
// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
rotateStringArray: true,
// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
seed: 0,
selfDefending: false,
sourceMap: false,
sourceMapBaseUrl: '',
sourceMapFileName: '',
sourceMapMode: 'separate',
// 删除字符串文字并将它们放在一个特殊的数组中
stringArray: true,
// 编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。
stringArrayEncoding: false,
// 调整字符串文字将插入stringArray的概率
stringArrayThreshold: 0.75,
// 您可以将混淆代码的目标环境设置为以下之一:Browser;Browser No Eval;Node
target: 'browser',
// 是否启用混淆对象键
transformObjectKeys: false,
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
unicodeEscapeSequence: false
}
options
compact (boolean): 是否压缩输出的代码,默认为 true。
controlFlowFlattening (boolean): 是否启用控制流扁平化,默认为 false。
controlFlowFlatteningThreshold (number): 控制流扁平化的阈值,默认为 0.75。
deadCodeInjection (boolean): 是否注入死代码,默认为 false。
deadCodeInjectionThreshold (number): 死代码注入的阈值,默认为 0.4。
debugProtection (boolean): 是否启用调试保护,默认为 false。
debugProtectionInterval (boolean): 是否启用调试保护间隔,默认为 false。
domainLock (Array<string>): 锁定指定的域名,默认为空数组。
identifierNamesGenerator (string): 生成标识符名称的方式,默认为 'mangled'。
log (boolean): 是否记录混淆过程,默认为 false。
numbersToExpressions (boolean): 是否将数字转换为表达式,默认为 false。
renameGlobals (boolean): 是否重命名全局变量,默认为 false。
rotateStringArray (boolean): 是否启用字符串数组旋转,默认为 false。
selfDefending (boolean): 是否启用自我防御,默认为 false。
simplify (boolean): 是否简化输出代码,默认为 true。
sourceMap (boolean | string): 是否生成源映射,默认为 false。
sourceMapMode (string): 源映射模式,默认为 'separate'。
splitStrings (boolean): 是否将字符串分割成多个较小的字符串,默认为 false。
stringArrayEncoding (Array<string>): 字符串数组编码方式,默认为空数组。
stringArrayEncodingThreshold (number): 字符串数组编码的阈值,默认为 0.75。
stringArrayThreshold (number): 字符串数组阈值,默认为 0.75。
stringArrayWrappersCount (number): 字符串数组包装器的数量,默认为 2。
stringArrayWrappersChainedCalls (number): 字符串数组包装器链式调用的数量,默认为 2。
stringArrayWrappersParametersMaxCount (number): 字符串数组包装器参数的最大数量,默认为 2。
stringArrayWrappersParametersMinCount (number): 字符串数组包装器参数的最小数量,默认为 1。
stringArrayWrappersType (string): 字符串数组包装器的类型,默认为 ‘variable’。
stringArrayWrappersVarNames (Array<string>): 字符串数组包装器变量名称,默认为空数组。
stringArrayIndexShift (boolean): 是否对字符串数组索引进行偏移,默认为 false。
shuffleStringArray (boolean): 是否打乱字符串数组,默认为 false。
transformObjectKeys (boolean): 是否转换对象键,默认为 false。
transformObjectKeysBlackList (Array<string>): 不转换的对象键黑名单,默认为空数组。
transformObjectKeysRecursive (boolean): 是否递归转换对象键,默认为 false。
transformObjectKeysWhitelist (Array<string>): 转换的对象键白名单,默认为空数组。
unicodeEscapeSequence (boolean): 是否使用 Unicode 逃逸序列,默认为 false。
useStrictSemicolons (boolean): 是否使用严格的分号,默认为 false。
wrapCode (boolean): 是否包裹代码,默认为 false。
wrapComments (boolean): 是否包裹注释,默认为 false。