Контекст:
Я делаю приложение, похожее на Codepen, но я хочу, чтобы оно поддерживало сложные библиотеки / фреймворки JS, например, Vue или Angular 2+.Я хочу получить предварительный просмотр моего фрагмента, который обновляется в разумные сроки.Поэтому у меня возникла идея, что при создании нового фрагмента я инициализирую пустой стартовый проект на своем внутреннем сервере и запускаю npm start
, чтобы включить Горячая перезагрузка .Когда я обновляю код моего фрагмента на стороне внешнего интерфейса, я делаю запрос к внутреннему серверу и обновляю файлы в стартовом проекте, который заставляет Горячая перезагрузка обновить предварительный просмотр в реальном времени.Это то, что я получил в данный момент, и оно работает.
То, что я придумал:
Это моя функция, которая сначала копирует стартовый проект в новое местоположение, выполняет поискдля свободного порта и в конечном итоге порождает 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
, который потенциально может длиться даже несколько часов, и мне интересно, является ли это хорошей практикой для потенциально порождать, скажем, 50 или 100 дочерних процессов с npm start
, работающими в течение долгого времени до этого »буду убит.Я думал о том, чтобы установить таймаут для этой команды и уничтожить его примерно через минуту, но это может вызвать другую проблему, которая повторно вызывает дочерний процесс, который требует больше ресурсов.