在子进程中利用ES6

时间:2017-07-10 16:03:12

标签: node.js electron babeljs

我有一个基于electron-vue构建的node.js项目,该项目使用电子,babel,webpack和vue。我已经构建了一个简单的vue SPA,但我发现单线程性质并不适合它需要做的大量数据提取和处理。

我的第一个想法是创建子进程。我创建了一个产生和管理子进程的vue组件:

startProcess() {
            const path          = require('path');
            const fs            = require('fs');
            const child_process = require('child_process');
            const app_root      = require('app-root-path');

            const service_root  = '/src/main/services/';

            const service_path = app_root.resolve(path.format({dir: service_root, name: this.service, ext: '.js'}));

            if (fs.existsSync(service_path)) {

                this.service_process = child_process.fork(service_path, [], { silent: true });

                this.service_process.on('close', this.onChildClose);
                this.service_process.on('error', this.onChildError);
                this.service_process.on('disconnect', this.onChildDisconnect);
                this.service_process.on('message', this.onChildMessage);

                this.service_process.send({ message: "hello" });

                console.log(`${this.service} started successfully`);

            } else {
                console.log(`${service_path} does not exist`);
                console.log(`${this.service} cannot start!`);
            }
        }

我的示例流程:

const path = require('path');
const service = path.basename(__filename);

process.on('disconnect', (m) => {
    console.log(`${service} disconnected, exiting...`);
    process.exit();
});

process.on('exit', (m) => {
    console.log(`${service} has stopped`);
});

process.on('message', (m) => {
    if (m.message === "ping") {
        process.send({message:"pong"});
    } else {
    }
    console.log(`parent > ${service}:`, m);
});

function tick()
{
    //process.send({ message: `${service} update` });

}

setInterval(tick, 500);

这非常有效。 IPC允许我向每个子进程泵送消息,允许我跨多个进程委派大型数据任务。但是,有一个问题。

我无法在子进程中使用ES6功能。

例如,尝试importexport类会导致错误。通过使用babel-node运行这些子进程,它们似乎正常工作,但我宁愿不要从我的应用程序单独安装babel。根据{{​​3}},这些应该在nodejs v8.1.2下兼容。

如何利用这些功能?有没有更好的方法来构建我的应用程序,以便我在这里尝试做什么?

1 个答案:

答案 0 :(得分:2)

importexport目前不属于es6规范。有关详细信息,请参阅此issue。这就是为什么节点不支持它。即使在http://node.green,也没有此功能。