diff --git a/lib/Compilation.js b/lib/Compilation.js index ca14499c102..b182380b9a1 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -2254,24 +2254,28 @@ class Compilation extends Tapable { for (let i = 0; i < chunks.length; i++) { const chunk = chunks[i]; const chunkHash = createHash(hashFunction); - if (outputOptions.hashSalt) { - chunkHash.update(outputOptions.hashSalt); + try { + if (outputOptions.hashSalt) { + chunkHash.update(outputOptions.hashSalt); + } + chunk.updateHash(chunkHash); + const template = chunk.hasRuntime() + ? this.mainTemplate + : this.chunkTemplate; + template.updateHashForChunk( + chunkHash, + chunk, + this.moduleTemplates.javascript, + this.dependencyTemplates + ); + this.hooks.chunkHash.call(chunk, chunkHash); + chunk.hash = chunkHash.digest(hashDigest); + hash.update(chunk.hash); + chunk.renderedHash = chunk.hash.substr(0, hashDigestLength); + this.hooks.contentHash.call(chunk); + } catch (err) { + this.errors.push(new ChunkRenderError(chunk, "", err)); } - chunk.updateHash(chunkHash); - const template = chunk.hasRuntime() - ? this.mainTemplate - : this.chunkTemplate; - template.updateHashForChunk( - chunkHash, - chunk, - this.moduleTemplates.javascript, - this.dependencyTemplates - ); - this.hooks.chunkHash.call(chunk, chunkHash); - chunk.hash = chunkHash.digest(hashDigest); - hash.update(chunk.hash); - chunk.renderedHash = chunk.hash.substr(0, hashDigestLength); - this.hooks.contentHash.call(chunk); } this.fullHash = hash.digest(hashDigest); this.hash = this.fullHash.substr(0, hashDigestLength); diff --git a/test/configCases/errors/exception-in-chunk-renderer/errors.js b/test/configCases/errors/exception-in-chunk-renderer/errors.js new file mode 100644 index 00000000000..d9088af16b8 --- /dev/null +++ b/test/configCases/errors/exception-in-chunk-renderer/errors.js @@ -0,0 +1,4 @@ +module.exports = [ + [/Test exception/], + [/Test exception/] +]; diff --git a/test/configCases/errors/exception-in-chunk-renderer/index.js b/test/configCases/errors/exception-in-chunk-renderer/index.js new file mode 100644 index 00000000000..d4f42bbdd05 --- /dev/null +++ b/test/configCases/errors/exception-in-chunk-renderer/index.js @@ -0,0 +1,3 @@ +it("should not crash when renderer throws exception", function(done) { + done(); +}); diff --git a/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js b/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js new file mode 100644 index 00000000000..6a98bf6ebc8 --- /dev/null +++ b/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js @@ -0,0 +1,16 @@ +class ThrowsExceptionInRender { + apply(compiler) { + compiler.hooks.compilation.tap("ThrowsException", compilation => { + compilation.mainTemplate.hooks.requireExtensions.tap( + "ThrowsException", + () => { + throw new Error("Test exception"); + } + ); + }); + } +} + +module.exports = { + plugins: [new ThrowsExceptionInRender()] +};