背景
使用worker_threads对一个electron项目进行性能优化的时候,由于开启了asar压缩,worker_thread无法加载asar中的代码,导致报错。
代码
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const path = require('path')
if (isMainThread) {
worker = new Worker( // 加载文件路径报错
path.resolve(__dirname, 'xxx.js'),
{
workerData: {w:1},
},
);
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`));
});
} else {
// 子线程执行代码
}
报错是:加载不到xxx.js
解决方案
其实是new Worker(filePath) 不是像require一样对读取asar里的文件做了特殊处理。
只能把xxx.js 放到asar外面,或者干脆不要asar。
如果是放在asar外,就要在electron-builder的配置文件里,asar打包时排除该文件
files: [{ filter: [
'!src/utils/xxx.js',
] }],
再单独拷贝到asar同级目录下
extraResources: [
{
from: path.resolve(__dirname, './src/utils/xxx.js'),
to: './js/xxx.js',
},
],
在代码里调用的时候
const xxx = process.env.NODE_ENV === 'development' ? require('./utils/xxx')
: require(path.resolve(process.resourcesPath, 'js/xxx.js'))
扩展
放到asar外面,就会有代码泄露和反向破解的风险,大家可以使用压缩混淆工具进行适当的处理。但这治标不治本,终极的解决方案是,将其编译为字节码 www.npmjs.com/package/byt… 。