上下文:
我正在制作类似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个子进程被杀死的时间。我当时正在考虑为此命令设置超时,并在大约一分钟后将其杀死,但这可能会导致另一个问题,该问题是多次重生子进程,这需要更多资源。