Как посмотреть index.html с помощью webpack-dev-server и html-webpack-plugin

Я использую webpack-dev-сервер для разработки с html-webpack-plugin для создания index.html с источниками ревизий. Дело в том, что каждый раз, когда я изменяю index.html, система пакетов не будет перестраиваться снова. Я знаю, что индекс отсутствует в записи, но есть ли способ решить это?

Ответ 1

Проблема в том, что index.html не просматривается Webpack. Он отслеживает только те файлы, которые "требуются" или "импортированы" где-то в вашем коде, и загрузчики тестируют.

Решение состоит из двух частей.

Сначала нужно указать файл index.html в вашей точке входа. Технически вы можете потребовать его в любом месте приложения, но это довольно удобно. Я уверен, что вы также можете просто потребовать свой шаблон, если бы вы использовали шаблон с вашим html-webpack-плагином.

Мне нужен мой index.html в моем файле index.js, который является моей точкой входа:

require('./index.html')
const angular = require('angular')
const app = angular.module('app', [])
//...so on and so forth

Наконец, установите и добавьте raw-loader со всеми вашими другими загрузчиками в ваш конфигурационный файл Webpack. Таким образом:

{
   test: /\.html$/,
   loader: "raw-loader"
}

Необработанный загрузчик преобразует практически любой файл, который "требуется" в строку текста, а затем Webpack будет следить за ним и обновлять dev-сервер каждый раз, когда вы вносите изменения.

Ни сам Webpack, ни ваша программа на самом деле ничего не делают с файлом (или шаблоном) index.html на этапе загрузки. Это совершенно не нужно для вашей производственной или тестовой среды, поэтому для хорошей оценки я добавляю ее только в том случае, если я запускаю сервер разработки:

/* eslint no-undef: 0 */

if (process.env.NODE_ENV === 'development') {
  require('./index.html')
}

const angular = require('angular')
const app = angular.module('app', [])
//...so on and so forth

В теории вы можете "потребовать" кучу других статических html файлов, которые вы хотите просмотреть.... или текстовые файлы. Я использую raw-loader, сам, для шаблонов директив Angular, но мне не нужно добавлять их в начало моей точки входа. Я могу просто потребовать внутри свойства шаблона директивы, например:

module.exports = function(app) {
  app.directive('myDirective', function(aListItem) {
    return {
      template: require('./myTemplate.html'),
      restrict: 'E',
      controller: function($scope) {
        $scope.someThingThatGoesInMyTemplate = 'I love raw-loader!'
      }
    }
  })
}

Ответ 2

Просто добавьте watchContentBase: true в конфигурацию devServer. webpack-dev-server будет следить за изменениями во всех файлах, находящихся в директории contentBase. Здесь мы просматриваем все файлы внутри. /src

webpack.config.js:

... devServer: { port: 8080, contentBase: './src', watchContentBase: true }