产生多个子进程以预览Vue.js项目

时间:2019-02-22 08:30:56

标签: javascript node.js vue.js child-process

上下文:
我正在制作类似Codepen的应用程序,但我希望它支持复杂的JS库/框架,例如Vue或Angular 2+。我想实时预览我的代码段,并在合理的时间内进行更新。因此,我想到了一个想法,当我创建一个新代码段时,我将在后端服务器上初始化一个空白入门项目,然后运行npm start以启用Hot reload。当我在前端更新代码段的代码时,我正在向后端服务器发出请求,并更新了启动程序项目中的文件,该项目使 Hot reload 刷新实时预览。这是我目前所获得的,并且正在运行。

我想到的是
这是我的功能,它首先将启动程序项目复制到新位置,搜索可用端口,最后生成npm start

function createStarter(request, snippetId, callback) {

    const fs = require('fs');
    const path = require('path');
    const portfinder = require('portfinder');
    const { technology } = request.params;

    const snippetPath = path.join(__dirname, '../../static/snippets/vue', snippetId.toString());

    spawnProcess('cp', ['-r', 'vue-starter/', snippetPath], { cwd: snippetPath.slice(0, snippetPath.lastIndexOf('/')) })
        .then(async () => {

            const lastPort = process.env.STARTER_LAST_USED_PORT || 1e4;
            const port = await portfinder.getPortPromise({ port: +lastPort + 1 }).catch(console.error);
            process.env.STARTER_LAST_USED_PORT = port;

            const packageJson = require(`${snippetPath}/package.json`);
            packageJson.scripts.dev += ` --port ${port}`;

            fs.writeFileSync(`${snippetPath}/package.json`, JSON.stringify(packageJson), 'utf8');

            console.log(`Starting project ${snippetId} at port ${port}`);

            spawnProcess('npm', ['start'], { cwd: snippetPath });
        })
        .catch(console.error);

    callback();
}

其中spawnProcess()只是执行spawn(...args)并将事件绑定到流的简单助手。

实际问题:
并行生成多个子进程是一个好主意吗?我不担心上面的函数中的cp -r,因为它的命令很短并且持续几秒钟。我担心的是npm start可能会持续数小时,并且我想知道这是否是一个好习惯,可能会产生npm start且运行很长时间的50或100个子进程被杀死的时间。我当时正在考虑为此命令设置超时,并在大约一分钟后将其杀死,但这可能会导致另一个问题,该问题是多次重生子进程,这需要更多资源。

0 个答案:

没有答案