Я использую 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. Но:
- Я понятия не имею, ПОЧЕМУ это работает.
- Тем не менее, я не могу прервать 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 ---
Я забыл упомянуть:
system windows 10 x64;
последняя версия узла;
, когда watcher.close () вызывается в теле функции обратного вызова, данной События watcher, watcher корректно завершает работу после первой сборки, но дочерний процесс плагина run () все еще выполняется, и сервер занимает порт 5000
watcher.on('event', () => {
if (event === 'END') watcher.close()
})