• 多线程
    • 多线程的Node.js
    • 可用的API
    • 原生Node.js模块

    多线程

    通过Web Workers,可以实现用操作系统级别的线程来跑JavaScript

    多线程的Node.js

    可以在Electron的Web Workers里使用Node.js的特性。要用的话,需把webPreferences中的nodeIntegrationInWorker选项设置为true

    1. let win = new BrowserWindow({
    2. webPreferences: {
    3. nodeIntegrationInWorker: true
    4. }
    5. })

    nodeIntegrationInWorker 可以独立于nodeIntegration使用,但sandbox必须不能设置为true

    可用的API

    Web Workers支持Node.js的所有内置模块,而且asar档案也仍通过Node.js的API来读取。 不过所有的Electron内置模块不可以用在多线程环境中。

    原生Node.js模块

    在Web Workers里可以直接加载任何原生Node.js模块,但不推荐这样做。 大多数现存的原生模块是在假设单线程环境的情况下编写的,如果把它们用在Web Workers里会导致崩溃和内存损坏。

    请注意, 即使原生Node.js模块如果考虑到了线程安全问题, 但在 Web Worker中加载它仍然不安全, 因为 process.dlopen 函数并没有考虑线程安全。

    现在安全顺利地加载原生模块的唯一办法,就是确保在Web Workers启动后app不加载原生模块。

    1. process.dlopen = () => {
    2. throw new Error('Load native module is not safe')
    3. }
    4. let worker = new Worker('script.js')