Ich verwende webpack-dev-server für die Entwicklung mit html-webpack-plugin, um die index.html mit Revisionsquellen zu generieren. Die Sache ist, jedes Mal, wenn ich die index.html ändere, wird das Bundle-System nicht erneut aufgebaut. Ich weiß, dass der Index nicht im Eintrag enthalten ist, aber gibt es eine Möglichkeit, dies zu lösen?
Das Problem ist, dass index.html von Webpack nicht überwacht wird. Es überwacht nur die Dateien, die irgendwo in Ihrem Code "erforderlich" oder "importiert" sind, und die Ladeprogramme testen.
Die Lösung besteht aus zwei Teilen.
First erfordert die index.html-Datei in Ihrem Einstiegspunkt. Technisch gesehen können Sie es an einer beliebigen Stelle in Ihrer Anwendung benötigen, aber das ist ziemlich praktisch. Ich bin mir sicher, Sie könnten auch nur Ihre Vorlage anfordern, wenn Sie eine Vorlage mit Ihrem HTML-Webpack-Plugin verwenden.
Ich habe meine index.html in meiner index.js-Datei benötigt, die mein Einstiegspunkt ist:
require('./index.html')
const angular = require('angular')
const app = angular.module('app', [])
//...so on and so forth
Schließlich, installiere und füge den raw-loader mit allen anderen Loadern deiner Webpack-Konfigurationsdatei hinzu. Somit:
{
test: /\.html$/,
loader: "raw-loader"
}
Der Raw-Loader konvertiert fast jede Datei, die "erforderlich" ist, in eine Textzeichenfolge. Webpack überwacht sie dann und aktualisiert den Dev-Server bei jeder Änderung.
Weder Webpack selbst noch Ihr Programm wird in der Phase, in der es geladen wird, tatsächlich etwas mit der Datei index.html (oder der Vorlage) tun. Für Ihre Produktions- oder Testumgebungen ist dies völlig unnötig. Ich füge es nur hinzu, wenn ich den Entwicklungsserver betreibe:
/* 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
Theoretisch können Sie eine Reihe anderer statischer HTML-Dateien "anfordern", die Sie anzeigen möchten. ... oder Textdateien für diese Angelegenheit. Ich verwende den Raw-Loader für Angular-Direktiven, ich muss sie jedoch nicht am Anfang meines Einstiegspunkts hinzufügen. Ich kann nur innerhalb der Direktive Vorlageneigenschaft wie folgt verlangen:
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!'
}
}
})
}
Fügen Sie einfach watchContentBase: true
zur Konfiguration Ihrer devServer
hinzu. webpack-dev-server überwacht alle Dateien, die sich in contentBase
dir befinden, auf Änderungen. Hier sehen wir uns alle Dateien in ./src an
webpack.config.js:
...
devServer: {
port: 8080,
contentBase: './src',
watchContentBase: true
}
Eine andere Lösung ist die Verwendung von file-loader , um die HTML-Datei in der Javascript-Eintragsdatei zu importieren.
import 'file-loader!../templates/index.html';
Sie können Ihre html-webpack-plugin -Konfiguration wie gewohnt verwenden
plugins: [
new HtmlWebPackPlugin({
template: path.resolve(__dirname, 'src/templates/index.html'),
filename: path.resolve(__dirname, 'dist/index.html'),
files: {
css: ['style.css'],
js: ['main.js'],
}
})
]
Dies schreibt nichts auf die Disc, wenn webpack-dev-server ausgeführt wird