2015-10-17 5 views
39

Ich benutze 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 ist, aber gibt es einen Weg, dies zu lösen?Wie man index.html mit webpack-dev-server und html-webpack-plugin beobachtet

+1

Hat meine Lösung Ihr Problem beheben? Ich würde gerne wissen, ob Sie eine andere Möglichkeit gefunden haben, dies zu tun. –

+0

Ich bin im selben Boot .. Ich versuche, zwei verschiedene index.html, eine für die Produktion und eine für die Entwicklung zu vermeiden, verschiedene Vermögenswerte zu referenzieren. – Spock

+1

@Spock Siehe meine Antwort unten. Sie können Ihre Vorlage in Ihrem Einstiegspunkt anfordern. Jedes Mal, wenn Sie Ihre Vorlage ändern, sollte der Dev-Server aktualisiert werden. –

Antwort

38

Das Problem ist, dass index.html nicht von Webpack überwacht wird. Es überwacht nur die Dateien, die in Ihrem Code "benötigt" oder "importiert" sind und für die die Loader testen.

Die Lösung besteht aus zwei Teilen.

Zuerst benötigen Sie die index.html Datei in Ihrem Einstiegspunkt. Technisch können Sie es überall in Ihrer Anwendung anfordern, aber das ist ziemlich praktisch. Ich bin sicher, dass Sie auch Ihre Vorlage benötigen könnten, wenn Sie eine Vorlage mit Ihrem html-webpack-plugin verwenden würden.

erforderlich ich meine index.html in meiner index.js-Datei, die mein Einstiegspunkt ist:

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

Schließlich, installieren und die raw-loader mit allen Ihren anderen Ladern, um Ihre Webpack Config hinzufügen Datei. Also:

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

Die rohe loader konvertiert nahezu jede Datei, die „erforderlich“ in eine Kette von Text und dann Webpack wird es beobachten für Sie und aktualisieren Sie die dev-Server jedes Mal, wenn Sie eine Änderung vornehmen .

Weder Webpack selbst noch Ihr Programm wird tatsächlich etwas mit der index.html-Datei (oder Vorlage) in der Phase tun, in der es geladen wird. Es ist völlig unnötig für Ihre Produktion oder Testumgebungen, so dass nur für eine gute Maßnahme, ich kann es nur hinzufügen, wenn ich die Entwicklung Server ausgeführt bin:

/* 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 Sie ein paar andere statische HTML „in require“ kann Dateien, die Sie sehen möchten. ... oder Textdateien für diese Angelegenheit. Ich benutze den row-loader, ich selbst, für Angular-Direktive-Vorlagen, aber ich muss diese nicht am Anfang meines Einstiegspunktes hinzufügen. Ich kann nur innerhalb der Richtlinie Vorlage Eigenschaft benötigen, wie folgt aus:

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!' 
     } 
    } 
    }) 
} 
+0

Jesus, wie die Zeit vergeht! Es tut mir leid, dass ich nicht darauf zurück gekommen bin. Das ist großartig, funktioniert wunderbar! – Spock

+0

nette Abhilfe! – elaijuh

+0

ich bin verwirrt über den Status von process.env hier. Wird das Server-Seite ausgeführt? Verwenden dieses Codeausschnitts in meinem index.js funktioniert nicht.Es gibt keine Erkennung dieser Variablen und es ist undefiniert, da es sich um die Client-Seite handelt, denke ich. Kannst du erklären, wie du das arbeitest? – spb

6

einfach watchContentBase: true auf Ihre devServer ‚s Config hinzuzufügen. webpack-dev-server wird auf Änderungen in allen Dateien achten, die sich in contentBase dir befinden. Hier sehen wir alle Dateien innerhalb ./src

webpack.config.js:

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

+0

Ich habe viel zu lange nach einer einfachen Lösung gesucht, um meinen HTML/Zweig zu sehen (templates) -Verzeichnis und lade einfach die Seite neu, wenn sich diese ändert. Ich benutze webpack & dev-server für eine Nicht-SPA-Site (Craft CMS). Alles, was ich zu tun hatte, war, meine 'contentBase' in' ./templates zu ändern "Eine einfache Lösung, die die ganze Zeit in der Dokumentation war, aber nicht auf den Anwendungsfall für. Danke für diese Antwort!" –