added [chunkhash] support, fixes #90

This commit is contained in:
Tobias Koppers 2013-05-21 01:46:14 +02:00
parent 1133a5606e
commit 6af5702c44
4 changed files with 20 additions and 9 deletions

View File

@ -528,7 +528,11 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
var i, chunk;
for(i = 0; i < this.chunks.length; i++) {
var chunk = this.chunks[i];
chunk.updateHash(hash);
var chunkHash = new (require("crypto").Hash)("md5");
chunk.updateHash(chunkHash);
this.chunkTemplate.updateHash(chunkHash);
chunk.hash = chunkHash.digest("hex");
hash.update(chunk.hash);
}
this.hash = hash = hash.digest("hex");
for(i = 0; i < this.modules.length; i++) {
@ -544,6 +548,7 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
for(i = 0; i < this.chunks.length; i++) {
chunk = this.chunks[i];
chunk.files = [];
var chunkHash = chunk.hash;
var source;
var file;
if(chunk.entry) {
@ -561,18 +566,13 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
this.assets[
file = filename
.replace(Template.REGEXP_HASH, hash)
.replace(Template.REGEXP_CHUNKHASH, chunkHash)
.replace(Template.REGEXP_ID, chunk.id)
.replace(Template.REGEXP_NAME, chunk.name || "")
] = source;
chunk.files.push(file);
this.applyPlugins("chunk-asset", chunk, file);
} else {
if(this.cache) {
var chunkHash = new (require("crypto").Hash)("md5");
chunk.updateHash(chunkHash);
this.chunkTemplate.updateHash(chunkHash);
chunkHash = chunkHash.digest("hex");
}
if(this.cache && this.cache["c" + chunk.id] && this.cache["c" + chunk.id].hash == chunkHash) {
source = this.cache["c" + chunk.id].source;
} else {
@ -587,6 +587,7 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
this.assets[
file = chunkFilename
.replace(Template.REGEXP_HASH, hash)
.replace(Template.REGEXP_CHUNKHASH, chunkHash)
.replace(Template.REGEXP_ID, chunk.id)
] = source;
chunk.files.push(file);
@ -594,6 +595,7 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
if(namedChunkFilename && chunk.name) {
this.assets[
file = namedChunkFilename
.replace(Template.REGEXP_CHUNKHASH, chunkHash)
.replace(Template.REGEXP_HASH, hash)
.replace(Template.REGEXP_ID, chunk.id)
.replace(Template.REGEXP_NAME, chunk.name || "")

View File

@ -29,6 +29,13 @@ JsonpMainTemplate.prototype.renderLocalVars = function(hash, chunk) {
JsonpMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) {
var filename = this.outputOptions.filename || "bundle.js";
var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename;
var chunkHashMap = {};
(function addChunk(c) {
if(chunkHashMap[c.id]) return;
if(c.id > 0)
chunkHashMap[c.id] = c.hash;
c.chunks.forEach(addChunk);
}(chunk));
return [
"// \"0\" is the signal for \"already loaded\"",
"if(installedChunks[chunkId] === 0)",
@ -49,6 +56,7 @@ JsonpMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) {
JSON.stringify(chunkFilename
.replace(Template.REGEXP_HASH, hash)
.replace(Template.REGEXP_NAME, ""))
.replace(Template.REGEXP_CHUNKHASH, "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"")
.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";",
"head.appendChild(script);"
]),

View File

@ -8,6 +8,7 @@ function Template(outputOptions) {
module.exports = Template;
Template.REGEXP_HASH = /\[hash\]/gi;
Template.REGEXP_CHUNKHASH = /\[chunkhash\]/gi;
Template.REGEXP_NAME = /\[name\]/gi;
Template.REGEXP_ID = /\[id\]/gi;
Template.REGEXP_FILE = /\[file\]/gi;

View File

@ -40,7 +40,7 @@ library1.on("exit", function(code) {
bindOutput(main);
}
});
// node ../../bin/webpack --output-pathinfo --colors --output-library library2 --output-public-path js/ --config library2config.js library2b library2 js/library2.js
// node ../../bin/webpack --output-pathinfo --colors --output-library library2 --output-public-path js/ --output-chunk-file [chunkhash].lib2.js --config library2config.js library2b library2 js/library2.js
var library2 = cp.spawn("node", join(["../../bin/webpack.js", "--output-pathinfo", "--colors", "--output-library", "library2",
"--output-public-path", "js/", "--config", "library2config.js", "library2b", "library2", "js/library2.js"], extraArgsNoWatch));
"--output-public-path", "js/", "--output-chunk-file", "[chunkhash].lib2.js", "--config", "library2config.js", "library2b", "library2", "js/library2.js"], extraArgsNoWatch));
bindOutput(library2);