Electron打包Asar不支持worker_threads

978 阅读1分钟

背景

使用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…