前端代码混淆加密
思路:使用node来获取初始化打包(dist)文件里面的所有js文件,然后利用加密插件进行代码的混淆加密
使用到的库:
- fast-glob:文件系统遍历工具
- javascript-obfuscator:代码混淆工具
- fs:本地文件以及文件夹的相关操作
- chalk:颜色插件
- progress:显示进度条插件
代码如下:
const {sync} = require("fast-glob")
var JavaScriptObfuscator = require('javascript-obfuscator');
var {readFileSync, writeFileSync} = require('fs');
var {resolve} = require('path');
var Chalk = require('chalk');
var ProgressBar = require('progress');
const log = console.log;
import {Compiler} from "webpack"
const JavascriptObfuscatorServe = function (){
}
JavascriptObfuscatorServe.prototype.apply = function ({hooks}:Compiler){
if (process.env.NODE_ENV === 'production') {
hooks.done.tap('代码混淆钩子', () => {
setTimeout(() => {
const dir = 'dist'
const dirArr = [`${dir}/**/*.js`]
const files = sync(dirArr,{
ignore:[
`${dir}/*.js`,
`${dir}/js/chunk-vendors*.js`,
`${dir}/js/maps.js`,
]
})
log(Chalk.blue('正在启动【javascript-obfuscator】代码混淆加密'));
log(Chalk.yellow(`混淆加密对象:${dirArr}\n已扫描文件:${files.length} 个\n正在执行混淆加密,请稍等...`));
const bar = new ProgressBar(`当前进度:percent :bar 已处理(${Chalk.green(':current/:total')})文件`, {
total: files.length,
width: 50
});
if(files.length === 0){
bar.tick();
if (bar.complete) {
log(Chalk.blue('【javascript-obfuscator】代码混淆加密完成'));
setTimeout(() => {
process.exit()
})
}
return
}
let index = 0;
while (index < files.length){
const file = files[index]
const time = Date.now()
log(Chalk.yellow(`\n当前正在加密:${file}`));
const fileCode = readFileSync(file).toString('utf-8')
const obfuscationResult = JavaScriptObfuscator.obfuscate(fileCode,{
compact: true,
numbersToExpressions: true,
simplify: true,
stringArrayShuffle: true,
splitStrings: true,
stringArrayThreshold: 1,
unicodeEscapeSequence:true
});
writeFileSync(file, obfuscationResult.getObfuscatedCode(), 'utf-8')
log(Chalk.blue(`文件加密完成:${file}\n加密耗时:${Date.now() - time}ms`));
bar.tick();
if (bar.complete) {
log(Chalk.blue('【javascript-obfuscator】代码混淆加密完成'));
setTimeout(() => {
process.exit()
})
}
index ++;
}
})
})
}
}
module.exports = JavascriptObfuscatorServe