Создание нескольких дочерних процессов для предварительного просмотра проектов Vue.js - PullRequest
0 голосов
/ 22 февраля 2019

Контекст:
Я делаю приложение, похожее на 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, работающими в течение долгого времени до этого »буду убит.Я думал о том, чтобы установить таймаут для этой команды и уничтожить его примерно через минуту, но это может вызвать другую проблему, которая повторно вызывает дочерний процесс, который требует больше ресурсов.

...