From 5693285436e7fb111b681f74f80856967409a0e1 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 09:32:21 +0100 Subject: [PATCH 01/10] Fix variable name - Rename compiler to compilation --- index.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 0f63ba3..69c2079 100644 --- a/index.js +++ b/index.js @@ -8,34 +8,34 @@ function HtmlWebpackPlugin(options) { HtmlWebpackPlugin.prototype.apply = function(compiler) { var self = this; - compiler.plugin('emit', function(compiler, callback) { - var webpackStatsJson = compiler.getStats().toJson(); + compiler.plugin('emit', function(compilation, callback) { + var webpackStatsJson = compilation.getStats().toJson(); var templateParams = {}; templateParams.webpack = webpackStatsJson; templateParams.htmlWebpackPlugin = {}; - templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginAssets(compiler, webpackStatsJson); + templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginAssets(compilation, webpackStatsJson); templateParams.htmlWebpackPlugin.options = self.options; var outputFilename = self.options.filename || 'index.html'; if (self.options.templateContent && self.options.template) { - compiler.errors.push(new Error('HtmlWebpackPlugin: cannot specify both template and templateContent options')); + compilation.errors.push(new Error('HtmlWebpackPlugin: cannot specify both template and templateContent options')); callback(); } else if (self.options.templateContent) { - self.emitHtml(compiler, self.options.templateContent, templateParams, outputFilename); + self.emitHtml(compilation, self.options.templateContent, templateParams, outputFilename); callback(); } else { var templateFile = self.options.template; if (!templateFile) { templateFile = path.join(__dirname, 'default_index.html'); } - compiler.fileDependencies.push(templateFile); + compilation.fileDependencies.push(templateFile); fs.readFile(templateFile, 'utf8', function(err, htmlTemplateContent) { if (err) { - compiler.errors.push(new Error('HtmlWebpackPlugin: Unable to read HTML template "' + templateFile + '"')); + compilation.errors.push(new Error('HtmlWebpackPlugin: Unable to read HTML template "' + templateFile + '"')); } else { - self.emitHtml(compiler, htmlTemplateContent, templateParams, outputFilename); + self.emitHtml(compilation, htmlTemplateContent, templateParams, outputFilename); } callback(); }); @@ -55,7 +55,8 @@ HtmlWebpackPlugin.prototype.emitHtml = function(compiler, htmlTemplateContent, t }; }; -HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compiler, webpackStatsJson) { + +HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compilation, webpackStatsJson) { var assets = {}; for (var chunk in webpackStatsJson.assetsByChunkName) { var chunkValue = webpackStatsJson.assetsByChunkName[chunk]; @@ -66,8 +67,8 @@ HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compiler, webpack chunkValue = chunkValue[0]; } - if (compiler.options.output.publicPath) { - chunkValue = compiler.options.output.publicPath + chunkValue; + if (compilation.options.output.publicPath) { + chunkValue = compilation.options.output.publicPath + chunkValue; } assets[chunk] = chunkValue; } From f88225fe3eaceffa750eafb8fb178fe78e06978f Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 10:48:52 +0100 Subject: [PATCH 02/10] Refactor asset helper to support .css (extract-text-webpack-plugin) and .manifest (appcache-webpack-plugin) files Unfortunately this breaks the old template structure --- default_index.html | 9 ++++++--- index.js | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/default_index.html b/default_index.html index e32adc3..6dd89de 100644 --- a/default_index.html +++ b/default_index.html @@ -1,12 +1,15 @@ - + {%=o.htmlWebpackPlugin.options.title || 'Webpack App'%} + {% for (var css in o.htmlWebpackPlugin.assets.css) { %} + + {% } %} - {% for (var chunk in o.htmlWebpackPlugin.assets) { %} - + {% for (var chunk in o.htmlWebpackPlugin.assets.chunks) { %} + {% } %} diff --git a/index.js b/index.js index 69c2079..fe79799 100644 --- a/index.js +++ b/index.js @@ -57,20 +57,40 @@ HtmlWebpackPlugin.prototype.emitHtml = function(compiler, htmlTemplateContent, t HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compilation, webpackStatsJson) { - var assets = {}; + var assets = { + // Will contain all js & css files by chunk + chunks: [], + // Will contain all js files + js: [], + // Will contain all css files + css: [], + // Will contain the html5 appcache manifest files if it exists + manifest: Object.keys(compilation.assets).filter(function(assetFile){ + return path.extname(assetFile) === '.appcache'; + })[0] + }; + var publicPath = compilation.options.output.publicPath || ''; + for (var chunk in webpackStatsJson.assetsByChunkName) { - var chunkValue = webpackStatsJson.assetsByChunkName[chunk]; + assets.chunks[chunk] = {}; + + // Prepend the public path to all chunk files + var chunkFiles = [].concat(webpackStatsJson.assetsByChunkName[chunk]).map(function(chunkFile) { + return publicPath + chunkFile; + }); // Webpack outputs an array for each chunk when using sourcemaps - if (chunkValue instanceof Array) { - // Is the main bundle always the first element? - chunkValue = chunkValue[0]; - } + // But we need only the entry file + var entry = chunkFiles[0]; + assets.chunks[chunk].entry = entry; + assets.js.push(entry); - if (compilation.options.output.publicPath) { - chunkValue = compilation.options.output.publicPath + chunkValue; - } - assets[chunk] = chunkValue; + // Gather all css files + var css = chunkFiles.filter(function(chunkFile){ + return path.extname(chunkFile) === '.css'; + }); + assets.chunks[chunk].css = css; + assets.css = assets.css.concat(css); } return assets; From 3947d27cf21997f5a601e9132dab1c624ecad6dc Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 10:50:01 +0100 Subject: [PATCH 03/10] Use the webpack hash for automated cache busting --- default_index.html | 6 +++--- index.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/default_index.html b/default_index.html index 6dd89de..e79eae8 100644 --- a/default_index.html +++ b/default_index.html @@ -1,15 +1,15 @@ - + {%=o.htmlWebpackPlugin.options.title || 'Webpack App'%} {% for (var css in o.htmlWebpackPlugin.assets.css) { %} - + {% } %} {% for (var chunk in o.htmlWebpackPlugin.assets.chunks) { %} - + {% } %} diff --git a/index.js b/index.js index fe79799..c1ae587 100644 --- a/index.js +++ b/index.js @@ -12,6 +12,7 @@ HtmlWebpackPlugin.prototype.apply = function(compiler) { var webpackStatsJson = compilation.getStats().toJson(); var templateParams = {}; templateParams.webpack = webpackStatsJson; + templateParams.hash = webpackStatsJson.hash; templateParams.htmlWebpackPlugin = {}; templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginAssets(compilation, webpackStatsJson); templateParams.htmlWebpackPlugin.options = self.options; From c082bb8cccaf02dd5b08523fa238cac684d86919 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 10:54:20 +0100 Subject: [PATCH 04/10] Allow filter methods in jshint --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index c1ae587..641347d 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,4 @@ +/*jshint -W083 */ var fs = require('fs'); var path = require('path'); var tmpl = require('blueimp-tmpl').tmpl; From 19aef72570d7874ad64461f16ad4c60faa3f2162 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 11:23:52 +0100 Subject: [PATCH 05/10] Catch template errors --- index.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 641347d..2d3cd30 100644 --- a/index.js +++ b/index.js @@ -45,9 +45,14 @@ HtmlWebpackPlugin.prototype.apply = function(compiler) { }); }; -HtmlWebpackPlugin.prototype.emitHtml = function(compiler, htmlTemplateContent, templateParams, outputFilename) { - var html = tmpl(htmlTemplateContent, templateParams); - compiler.assets[outputFilename] = { +HtmlWebpackPlugin.prototype.emitHtml = function(compilation, htmlTemplateContent, templateParams, outputFilename) { + var html; + try { + html = tmpl(htmlTemplateContent, templateParams); + } catch(e) { + compilation.errors.push(new Error('HtmlWebpackPlugin: template error ' + e)); + } + compilation.assets[outputFilename] = { source: function() { return html; }, From 1debf35bdfdf20e175d3009ac2a8e08e0d258c5a Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 11:26:52 +0100 Subject: [PATCH 06/10] Adjust tests for hash urls --- spec/HtmlWebpackPluginSpec.js | 30 ++++++++++++++++-------------- spec/fixtures/test.html | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/spec/HtmlWebpackPluginSpec.js b/spec/HtmlWebpackPluginSpec.js index e737806..96a2cd0 100644 --- a/spec/HtmlWebpackPluginSpec.js +++ b/spec/HtmlWebpackPluginSpec.js @@ -17,7 +17,7 @@ function testHtmlPlugin(webpackConfig, expectedResults, outputFile, done) { if (expectedResult instanceof RegExp) { expect(htmlContent).toMatch(expectedResult); } else { - expect(htmlContent).toContain(expectedResult); + expect(htmlContent).toContain(expectedResult.replace('%hash%', stats.hash)); } } done(); @@ -37,7 +37,7 @@ describe('HtmlWebpackPlugin', function() { filename: 'index_bundle.js' }, plugins: [new HtmlWebpackPlugin()] - }, [' + From 55f316d3962118647ff0402729e6dc9042e353ad Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 11:36:55 +0100 Subject: [PATCH 07/10] Rename the assets template to support old templates files --- default_index.html | 10 ++++----- index.js | 19 +++++++++++++++-- spec/HtmlWebpackPluginSpec.js | 28 +++++++++++++++++++++++++ spec/fixtures/legacy.html | 11 ++++++++++ spec/fixtures/legacy_default_index.html | 12 +++++++++++ spec/fixtures/test.html | 2 +- 6 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 spec/fixtures/legacy.html create mode 100644 spec/fixtures/legacy_default_index.html diff --git a/default_index.html b/default_index.html index e79eae8..8cbdc80 100644 --- a/default_index.html +++ b/default_index.html @@ -1,15 +1,15 @@ - + {%=o.htmlWebpackPlugin.options.title || 'Webpack App'%} - {% for (var css in o.htmlWebpackPlugin.assets.css) { %} - + {% for (var css in o.htmlWebpackPlugin.files.css) { %} + {% } %} - {% for (var chunk in o.htmlWebpackPlugin.assets.chunks) { %} - + {% for (var chunk in o.htmlWebpackPlugin.files.chunks) { %} + {% } %} diff --git a/index.js b/index.js index 2d3cd30..e5b8360 100644 --- a/index.js +++ b/index.js @@ -15,7 +15,8 @@ HtmlWebpackPlugin.prototype.apply = function(compiler) { templateParams.webpack = webpackStatsJson; templateParams.hash = webpackStatsJson.hash; templateParams.htmlWebpackPlugin = {}; - templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginAssets(compilation, webpackStatsJson); + templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginLegacyAssets(compilation, webpackStatsJson); + templateParams.htmlWebpackPlugin.files = self.htmlWebpackPluginAssets(compilation, webpackStatsJson); templateParams.htmlWebpackPlugin.options = self.options; var outputFilename = self.options.filename || 'index.html'; @@ -66,7 +67,7 @@ HtmlWebpackPlugin.prototype.emitHtml = function(compilation, htmlTemplateContent HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compilation, webpackStatsJson) { var assets = { // Will contain all js & css files by chunk - chunks: [], + chunks: {}, // Will contain all js files js: [], // Will contain all css files @@ -103,4 +104,18 @@ HtmlWebpackPlugin.prototype.htmlWebpackPluginAssets = function(compilation, webp return assets; }; +/** + * A helper to support the templates written for html-webpack-plugin <= 1.1.0 + */ +HtmlWebpackPlugin.prototype.htmlWebpackPluginLegacyAssets = function(compilation, webpackStatsJson) { + var assets = this.htmlWebpackPluginAssets(compilation, webpackStatsJson); + var legacyAssets = {}; + Object.keys(assets.chunks).forEach(function(chunkName){ + legacyAssets[chunkName] = assets.chunks[chunkName].entry; + }); + return legacyAssets; +}; + + + module.exports = HtmlWebpackPlugin; diff --git a/spec/HtmlWebpackPluginSpec.js b/spec/HtmlWebpackPluginSpec.js index 96a2cd0..717e105 100644 --- a/spec/HtmlWebpackPluginSpec.js +++ b/spec/HtmlWebpackPluginSpec.js @@ -83,6 +83,34 @@ describe('HtmlWebpackPlugin', function() { [' + + diff --git a/spec/fixtures/legacy_default_index.html b/spec/fixtures/legacy_default_index.html new file mode 100644 index 0000000..2595dd7 --- /dev/null +++ b/spec/fixtures/legacy_default_index.html @@ -0,0 +1,12 @@ + + + + + {%=o.htmlWebpackPlugin.options.title || 'Webpack App'%} + + + {% for (var chunk in o.htmlWebpackPlugin.assets) { %} + + {% } %} + + \ No newline at end of file diff --git a/spec/fixtures/test.html b/spec/fixtures/test.html index c209f70..2764033 100644 --- a/spec/fixtures/test.html +++ b/spec/fixtures/test.html @@ -6,6 +6,6 @@

Some unique text

- + From e3325b86f229c96a67484e28c30ab54365bb2832 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Wed, 11 Mar 2015 11:41:43 +0100 Subject: [PATCH 08/10] Update readme --- README.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 335609e..21a5c2e 100644 --- a/README.md +++ b/README.md @@ -113,10 +113,10 @@ HTML as well as the body. Your template might look like this: My App - + - + ``` @@ -153,14 +153,24 @@ Note the plugin will throw an error if you specify both `template` _and_ The `o` variable in the template is the data that is passed in when the template is rendered. This variable has the following attributes: - `htmlWebpackPlugin`: data specific to this plugin - - `htmlWebpackPlugin.assets`: a massaged representation of the + - `htmlWebpackPlugin.files`: a massaged representation of the `assetsByChunkName` attribute of webpack's [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object. It contains a mapping from entry point name to the bundle filename, eg: ```json "htmlWebpackPlugin": { - "assets": { - "head": "assets/head_bundle.js", - "main": "assets/main_bundle.js" + "files": { + "css": [ "main.css" ], + "js": [ "assets/head_bundle.js", "assets/main_bundle.js"] + "chunks": { + "head": { + "entry": "assets/head_bundle.js", + "css": [ "main.css" ] + }, + "main": { + "entry": "assets/main_bundle.js", + "css": [] + }, + } } } ``` From 1427d4e3d7077b00e0766cded72af3e73c082d41 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Fri, 27 Mar 2015 19:39:02 +0100 Subject: [PATCH 09/10] Add .jshintrc file --- .jshintrc | 93 +++++++++++++++++++++++++++++++++++ index.js | 2 +- package.json | 2 +- spec/HtmlWebpackPluginSpec.js | 1 + 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 .jshintrc diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..e21bdca --- /dev/null +++ b/.jshintrc @@ -0,0 +1,93 @@ +{ + // From JSHint Default Configuration File + // See http://jshint.com/docs/ for more details + + "maxerr" : 50, // {int} Maximum error before stopping + + // Enforcing + "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) + "camelcase" : false, // true: Identifiers must be in camelCase + "curly" : true, // true: Require {} for every new block or scope + "eqeqeq" : true, // true: Require triple equals (===) for comparison + "forin" : false, // true: Require filtering for..in loops with obj.hasOwnProperty() + "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. + "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` + "indent" : 2, // {int} Number of spaces to use for indentation + "latedef" : false, // true: Require variables/functions to be defined before being used + "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` + "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` + "noempty" : true, // true: Prohibit use of empty blocks + "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. + "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) + "plusplus" : false, // true: Prohibit use of `++` & `--` + "quotmark" : false, // Quotation mark consistency: + // false : do nothing (default) + // true : ensure whatever is used is consistent + // "single" : require single quotes + // "double" : require double quotes + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : true, // true: Require all defined variables be used + "strict" : true, // true: Requires all functions run in ES5 Strict Mode + "maxparams" : false, // {int} Max number of formal params allowed per function + "maxdepth" : false, // {int} Max depth of nested blocks (within functions) + "maxstatements" : false, // {int} Max number statements per function + "maxcomplexity" : false, // {int} Max cyclomatic complexity per function + "maxlen" : false, // {int} Max number of characters per line + + // Relaxing + "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) + "boss" : false, // true: Tolerate assignments where comparisons would be expected + "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. + "eqnull" : false, // true: Tolerate use of `== null` + "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) + "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) + "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) + // (ex: `for each`, multiple try/catch, function expression…) + "evil" : false, // true: Tolerate use of `eval` and `new Function()` + "expr" : false, // true: Tolerate `ExpressionStatement` as Programs + "funcscope" : false, // true: Tolerate defining variables inside control statements + "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "iterator" : false, // true: Tolerate using the `__iterator__` property + "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block + "laxbreak" : false, // true: Tolerate possibly unsafe line breakings + "laxcomma" : false, // true: Tolerate comma-first style coding + "loopfunc" : true, // true: Tolerate functions being defined in loops + "multistr" : false, // true: Tolerate multi-line strings + "noyield" : false, // true: Tolerate generator functions with no yield statement in them. + "notypeof" : false, // true: Tolerate invalid typeof operator values + "proto" : false, // true: Tolerate using the `__proto__` property + "scripturl" : false, // true: Tolerate script-targeted URLs + "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` + "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation + "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` + "validthis" : false, // true: Tolerate using this in a non-constructor function + + // Environments + "browser" : true, // Web Browser (window, document, etc) + "browserify" : false, // Browserify (node.js code in the browser) + "couch" : false, // CouchDB + "devel" : true, // Development/debugging (alert, confirm, etc) + "dojo" : false, // Dojo Toolkit + "jasmine" : false, // Jasmine + "jquery" : false, // jQuery + "mocha" : true, // Mocha + "mootools" : false, // MooTools + "node" : true, // Node.js + "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) + "prototypejs" : false, // Prototype and Scriptaculous + "qunit" : false, // QUnit + "rhino" : false, // Rhino + "shelljs" : false, // ShellJS + "worker" : false, // Web Workers + "wsh" : false, // Windows Scripting Host + "yui" : false, // Yahoo User Interface + + // Custom Globals + "globals" : { + // jasmine helpers + "expect": false, + "describe": false, + "beforeEach": false, + "it": false + } +} \ No newline at end of file diff --git a/index.js b/index.js index e5b8360..52a3abf 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ -/*jshint -W083 */ +'use strict'; var fs = require('fs'); var path = require('path'); var tmpl = require('blueimp-tmpl').tmpl; diff --git a/package.json b/package.json index 7c21803..233d48d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Simplifies creation of HTML files to serve your webpack bundles", "main": "index.js", "scripts": { - "test": "jshint *.js spec && jasmine-node --captureExceptions spec" + "test": "jshint -c .jshintrc *.js spec && jasmine-node --captureExceptions spec" }, "repository": { "type": "git", diff --git a/spec/HtmlWebpackPluginSpec.js b/spec/HtmlWebpackPluginSpec.js index 717e105..1f5aec8 100644 --- a/spec/HtmlWebpackPluginSpec.js +++ b/spec/HtmlWebpackPluginSpec.js @@ -1,3 +1,4 @@ +'use strict'; var path = require('path'); var fs = require('fs'); var webpack = require('webpack'); From 442f016683dd8452b93ee0ed9ee175d7b17f4272 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Fri, 27 Mar 2015 19:47:34 +0100 Subject: [PATCH 10/10] Don't append a hash by default --- default_index.html | 6 +++--- index.js | 3 ++- spec/HtmlWebpackPluginSpec.js | 31 +++++++++++++++++++++---------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/default_index.html b/default_index.html index 8cbdc80..7609a39 100644 --- a/default_index.html +++ b/default_index.html @@ -1,15 +1,15 @@ - + {%=o.htmlWebpackPlugin.options.title || 'Webpack App'%} {% for (var css in o.htmlWebpackPlugin.files.css) { %} - + {% } %} {% for (var chunk in o.htmlWebpackPlugin.files.chunks) { %} - + {% } %} diff --git a/index.js b/index.js index 52a3abf..e74c4eb 100644 --- a/index.js +++ b/index.js @@ -13,11 +13,12 @@ HtmlWebpackPlugin.prototype.apply = function(compiler) { var webpackStatsJson = compilation.getStats().toJson(); var templateParams = {}; templateParams.webpack = webpackStatsJson; - templateParams.hash = webpackStatsJson.hash; templateParams.htmlWebpackPlugin = {}; templateParams.htmlWebpackPlugin.assets = self.htmlWebpackPluginLegacyAssets(compilation, webpackStatsJson); templateParams.htmlWebpackPlugin.files = self.htmlWebpackPluginAssets(compilation, webpackStatsJson); templateParams.htmlWebpackPlugin.options = self.options; + // If the hash option is true append the webpack hash to all assets + templateParams.htmlWebpackPlugin.querystring = self.options.hash ? '?' + webpackStatsJson.hash : ''; var outputFilename = self.options.filename || 'index.html'; diff --git a/spec/HtmlWebpackPluginSpec.js b/spec/HtmlWebpackPluginSpec.js index 1f5aec8..091978c 100644 --- a/spec/HtmlWebpackPluginSpec.js +++ b/spec/HtmlWebpackPluginSpec.js @@ -38,7 +38,7 @@ describe('HtmlWebpackPlugin', function() { filename: 'index_bundle.js' }, plugins: [new HtmlWebpackPlugin()] - }, ['