Как вручную запустить просмотр / перезагрузку сервера webpack? - PullRequest
0 голосов
/ 28 декабря 2018

У меня довольно простой веб-пакет, настроенный с некоторой изюминкой.У меня есть несколько разных способов создания предполагаемого поведения, но мне интересно, есть ли лучшие подходы (я все еще довольно новичок в веб-пакете).

У меня есть базовый TypeScript / Scssapplication и все файлы src находятся в каталоге src.У меня также есть комплект библиотек компонентов, который динамически генерируется с помощью отдельного процесса сборки (запускается через Node).Этот пакет также попадает в каталог src (он содержит некоторые переменные sass и несколько других ресурсов, принадлежащих src).Это src/custom-library-bundle.Моя текущая настройка веб-пакета перемещает соответствующие файлы пакета в каталог public (dist) через CopyWebpackPlugin.Мой веб-сервер разработчиков отслеживает изменения и перезагружается, как и ожидалось.Все это прекрасно работает.

Теперь для поворота.Я установил пользовательский наблюдатель, который существует в другом месте, чтобы отслеживать изменения в пакете библиотеки пользовательских компонентов.Когда происходит изменение, оно запускает тот процесс пользовательской сборки, упомянутый выше.Это (как и ожидалось) изменяет каталог src/custom-library-bundle и запускает несколько просмотров / перезагрузок при заполнении пакета.Технически это работает?И поведение ожидается, но в идеале я мог бы сказать, что нужно дождаться, когда пользовательская работа по установке будет «сделана», и только затем заставит ее выполнить компиляцию / перезагрузку.

Фу.Это не легко объяснить.Вот конфиг веб-пакета, который (надеюсь) поможет уточнить:

devServer: {
  contentBase: path.join(__dirname, 'public'),
  port: 9000,
  host: '127.0.0.1',
  after: (app, server) => {
    new MyCustomWatcherForOtherThings().watch(() => {
      // invoked after the src/custom-library-bundle is done doing its thing (each time)
      // now that I know it's done, I want to trigger the normal compilation/reload
    })
  },
  watchOptions: {
    ignored: [
      /node_modules/
      // I've been experimenting with the ignored feature a bit
      // path.resolve(__dirname, 'src/custom-library-bundle/')
    ]
  }
}

Идеальный подход: В моем наиболее идеальном сценарии я хочу просто вручную запустить сервер разработки веб-пакетов, чтобы сделать свое дело вмой заказ обратного звонка;пусть он игнорирует src/custom-library-bundle, пока я не скажу ему обратить внимание.Однако я не могу найти способ сделать это.Возможно ли это?

Альтернативный подход # 1: Я мог бы проигнорировать каталог src/custom-library-bundle, переместить обновленные файлы в public (не используя подход webpack), а затем вызвать простоперезагрузка, когда я знаю, что это завершено.Мне это не нравится, потому что я хочу использовать один и тот же процесс, независимо от того, наблюдаю ли я или просто выполняю разовую сборку (я хочу, чтобы все заканчивалось в каталоге public, потому что webpack сделал это, а не потому, что я написалсценарий, чтобы поставить его там под конкретные сценарии).Но, допустим, я преодолел это, как я могу запустить перезагрузку браузера для сервера dev?Возможно ли это?

Альтернативный подход # 2 Я склоняюсь к этому, но мне кажется, что это лишняя, ненужная работа.Я мог бы вывести свой пользовательский процесс сборки в другой каталог (тот, который настраивал мой веб-пакет, вообще не заботился).Когда процесс сборки будет завершен, я могу переместить все файлы в src/custom-library-bundle, где часы получат 1 изменение и выполнят одну услугу / перезагрузку.Это так близко ко мне, но кажется, что я добавляю шаг, который мне не нужен.

Альтернативный подход № 3? Можете ли вы придумать лучший способ решить эту проблему?

Обновление (включая версии):

  • webpack 4.26.1
  • webpack-dev-server 3.1.14

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Добавьте следующий server.sockWrite вызов к вашему after методу:

devServer: {
  after: (app, server) => {
    new MyCustomWatcherForOtherThings().watch(() => {
      // invoked after the src/custom-library-bundle is done doing its thing (each time)
      // now that I know it's done, I want to trigger the normal compilation/reload

      // calling this on `server` triggers a full page refresh
      server.sockWrite(server.sockets, "content-changed");
    });
  };
}

Я никогда не встречал этого в документации, но один из основных разработчиков webpack упомянул об этом в комментариина GitHub , так что это как бы санкционировано.

0 голосов
/ 29 декабря 2018

Полезные вещи, которые предоставляет веб-пакет, приходят на ум: мультикомпилятор сборок, создание дочернего компилятора из экземпляра Compiler или CompilationDllPlugin и программным управлением компилятором путем вызова webpack.watch() или webpack.compile().

  • настройка компилятора полезна, когда вы хотите собрать несколько компиляций за один прогон, выходные данные которых не зависят друг от друга
  • дочерние компиляторы позволяют вам устанавливать зависимости между компиляторами и использовать хуки, которые позволяют блокировать родительский компилятор доскажем, дочерняя компиляция завершила отправку последнего пакета в ресурсы
  • DllPlugin позволяет создать компиляцию, и ее манифест может создавать чанки, которые могут содержать модули, которые могут использоваться в качестве зависимых для еще не построенныхкомпиляции (манифест должен быть подготовлен и передан им заранее)
  • программное управление компилятором позволяет вам писатьпростой скрипт Node.js, который может выполнить большую часть этого вручную.

Если я правильно понял, ваш компилятор webpack на самом деле не имеет никаких зависимостей от вашего комплекта, кроме того, что он ожидает, что в него будет что-то добавленовыходные ресурсы, так что вы можете рассмотреть возможность построения мультикомпилятора.Если это не работает для вас, вы можете написать простой плагин, который создает дочерний компилятор, который отслеживает все зависимости комплекта компонентов и выдает встроенный комплект в основные ресурсы компиляции при изменениях.В конечном итоге, как вы упомянули сами, вы можете написать простой сценарий и программно сплетать все вместе.Все эти подходы снимают отслеживание зависимостей сборки с веб-пакета, поэтому, если вы поместите компиляторы в режим наблюдения, веб-пакет будет отслеживать, когда что-то требует обновления.

Если вы заинтересованы в более внимательном рассмотрении того, как дочерние компиляторыСоздал и использовал, я бы настоятельно рекомендовал прочитать источники плагина html-webpack-plugin.Не похоже, что плагин обрабатывает те же настройки сборки, что и вы, но стоит отметить, что плагин HTML работает с файлами, которые не являются частью зависимостей сборки (ничто в источниках не ссылается или не зависит отфайлы / шаблоны, которые используются для создания файлов HTML, добавляемых в вывод).

...