Rollup Javascript API: процесс rollup.watch никогда не умирает - PullRequest
1 голос
/ 01 мая 2020

Я использую Rollup для комплектации моего express серверного приложения. Я пытаюсь использовать накопительный Javascript API. У меня есть два отдельных скрипта для управления действиями свертки: один для создания проекта по требованию, а другой для постоянного просмотра каталога sr c. Каждый из них, если необходимо, запускается из командной строки как процесс узла, например: "node [file.name.js]".

Package. json:

 "scripts": {
    "watch:exp": "env NODE_ENV=DEVELOPMENT node project_configuration/rollup.watch.js",
    "build:exp": "env NODE_ENV=PRODUCTION node project_configuration/rollup.build.js",
  },

Содержимое обоих файлов фактически совпадает с предложенным в сводной документации. Для сценария режима просмотра это будет:

    let counter = 0;
    const watcher = rollup.watch(watchOptions); // param contains entry, output dir, externals and plugins, according to docs.

    watcher.on('event', event => {
        const evs = ['END', 'ERROR'];

        if (evs.includes(event.code)) {
            counter += 1;
            console.log(`Rollup watcher now bundled ${counter} times`);
        }
    });

    watcher.close();

Когда я использую команду "npm run watch: exp", проект запускается, но когда я использую "ctrl + c" для команды bash строка, процесс не прерван - сохранение каталога sr c вызывает пересоздание проекта и запись строки с увеличенным счетчиком на консоль. Более того, я хотел бы не только перестраивать, но и запускать свой проект при каждом сохранении, поэтому я использую плагин:

@rollup/plugin-run

для запуска моего сервера на порту 5000 после каждая перестройка. И происходит сбой с ошибкой:

Error: listen EADDRINUSE: address already in use :::5000

Для ясности: на всякий случай я несколько раз терпеливо перезагружал машину (чтобы убить любые «странные», неконтролируемые процессы узлов) и изменил порт после этого. Я пробовал несколько портов между 5001 и 8080, но это не удалось. Это всегда заканчивалось EADDRINUSE с текущим номером порта.

Итак, я попытался поместить все в asyn c функцию, например так:

let counter = 0;
async function watchMe () {
    const watcher = await rollup.watch(watchOptions);

    watcher.on( ...counter stuff here )

    watcher.close();
}

watchMe();

Теперь я все еще не могу прервать процесс (Ctrl + c в bash CLI ), но исправлена ​​ошибка «eddrinuse» как минимум. Поэтому, когда я запускаю «npm run watch: exp», процесс запускается, пакет создается, счетчик увеличивается, и сервер запускается на порту 5000. После сохранения sr c dir запускается перестроение, счетчик увеличивается, и сервер снова работает правильно на порту 5000. Но:

  1. Я понятия не имею, ПОЧЕМУ это работает.
  2. Тем не менее, я не могу прервать watcher (и из-за этого я не могу прервать процесс, вызванный плагином watcher @ rollup / plugin-run), при прерывании процесса "npm run watch: exp" с помощью ctrl + c.

Я не нашел буквально ничего в сводных документах: только эти строки примера кода что я скопировал в свой проект, а затем изменил функцию asyn c. Кажется, что нет ни do c, ни учебного пособия о том, как использовать API rollup.watch или где (и как) правильно использовать метод close (). Буду признателен за любые советы, а также за примеры исходного кода (ссылки на репо), чтобы просто проверить, как API накопительного кода js используется в существующем проекте. Прямо сейчас я не вижу таких примеров нигде. С другой стороны, я не вижу проблем или угроз, похожих на мою проблему на statck, github или npm.

PS Для ясности: мой конфиг работает с файлом rollup.config. js и способом "rollup --config rollup.config. js". Но это не так. Я хочу знать, как использовать его через js API

--- edit ---

Я забыл упомянуть:

  1. system windows 10 x64;

  2. последняя версия узла;

  3. , когда watcher.close () вызывается в теле функции обратного вызова, данной События watcher, watcher корректно завершает работу после первой сборки, но дочерний процесс плагина run () все еще выполняется, и сервер занимает порт 5000

watcher.on('event', () => { 
   if (event === 'END') watcher.close() 
})

...