|
5 | 5 | var MainTemplate = require("../MainTemplate"); |
6 | 6 | var Template = require("../Template"); |
7 | 7 |
|
8 | | -function NodeMainTemplate(outputOptions) { |
| 8 | +function NodeMainTemplate(outputOptions, asyncChunkLoading) { |
9 | 9 | MainTemplate.call(this, outputOptions); |
| 10 | + this.asyncChunkLoading = asyncChunkLoading; |
10 | 11 | } |
11 | 12 | module.exports = NodeMainTemplate; |
12 | 13 |
|
@@ -35,25 +36,63 @@ NodeMainTemplate.prototype.renderLocalVars = function(hash, chunk) { |
35 | 36 | NodeMainTemplate.prototype.renderRequireEnsure = function(hash, chunk) { |
36 | 37 | var filename = this.outputOptions.filename || "bundle.js"; |
37 | 38 | var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename; |
38 | | - return [ |
39 | | - "// \"1\" is the signal for \"already loaded\"", |
40 | | - "if(!installedChunks[chunkId]) {", |
41 | | - this.indent([ |
42 | | - "var chunk = require(" + |
43 | | - JSON.stringify("./" + chunkFilename |
44 | | - .replace(Template.REGEXP_HASH, hash) |
45 | | - .replace(Template.REGEXP_NAME, "")) |
46 | | - .replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");", |
47 | | - "var moreModules = chunk.modules, chunkIds = chunk.ids;", |
48 | | - "for(var moduleId in moreModules) {", |
49 | | - this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), |
50 | | - "}", |
51 | | - "for(var i = 0; i < chunkIds.length; i++)", |
52 | | - this.indent("installedChunks[chunkIds[i]] = 1;"), |
53 | | - ]), |
54 | | - "}", |
55 | | - "callback.call(null, " + this.requireFn + ");", |
| 39 | + var insertMoreModules = [ |
| 40 | + "var moreModules = chunk.modules, chunkIds = chunk.ids;", |
| 41 | + "for(var moduleId in moreModules) {", |
| 42 | + this.indent(this.renderAddModule(hash, chunk, "moduleId", "moreModules[moduleId]")), |
| 43 | + "}" |
56 | 44 | ]; |
| 45 | + if(this.asyncChunkLoading) { |
| 46 | + return [ |
| 47 | + "if(installedChunks[chunkId] === 1) callback.call(null, " + this.requireFn + ");", |
| 48 | + "else if(!installedChunks[chunkId]) {", |
| 49 | + this.indent([ |
| 50 | + "installedChunks[chunkId] = [callback];", |
| 51 | + "var filename = __dirname + " + JSON.stringify("/" + chunkFilename |
| 52 | + .replace(Template.REGEXP_HASH, hash) |
| 53 | + .replace(Template.REGEXP_NAME, "")) |
| 54 | + .replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";", |
| 55 | + "require('fs').readFile(filename, 'utf-8', function(err, content) {", |
| 56 | + this.indent([ |
| 57 | + "if(err) { if(" + this.requireFn + ".onerror) return " + this.requireFn + ".onerror(err); else throw err; }", |
| 58 | + "var chunk = {};", |
| 59 | + "require('vm').runInThisContext('(function(exports) {' + content + '\\n})', filename)(chunk);", |
| 60 | + ].concat(insertMoreModules).concat([ |
| 61 | + "var callbacks = [];", |
| 62 | + "for(var i = 0; i < chunkIds.length; i++) {", |
| 63 | + this.indent([ |
| 64 | + "if(Array.isArray(installedChunks[chunkIds[i]]))", |
| 65 | + this.indent([ |
| 66 | + "callbacks = callbacks.concat(installedChunks[chunkIds[i]]);" |
| 67 | + ]), |
| 68 | + "installedChunks[chunkIds[i]] = 1;" |
| 69 | + ]), |
| 70 | + "}", |
| 71 | + "for(i = 0; i < callbacks.length; i++)", |
| 72 | + this.indent("callbacks[i].call(null, " + this.requireFn + ");") |
| 73 | + ])), |
| 74 | + "});" |
| 75 | + ]), |
| 76 | + "} else installedChunks[chunkId].push(callback);", |
| 77 | + ]; |
| 78 | + } else { |
| 79 | + return [ |
| 80 | + "// \"1\" is the signal for \"already loaded\"", |
| 81 | + "if(!installedChunks[chunkId]) {", |
| 82 | + this.indent([ |
| 83 | + "var chunk = require(" + |
| 84 | + JSON.stringify("./" + chunkFilename |
| 85 | + .replace(Template.REGEXP_HASH, hash) |
| 86 | + .replace(Template.REGEXP_NAME, "")) |
| 87 | + .replace(Template.REGEXP_ID, "\" + chunkId + \"") + ");" |
| 88 | + ].concat(insertMoreModules).concat([ |
| 89 | + "for(var i = 0; i < chunkIds.length; i++)", |
| 90 | + this.indent("installedChunks[chunkIds[i]] = 1;"), |
| 91 | + ])), |
| 92 | + "}", |
| 93 | + "callback.call(null, " + this.requireFn + ");", |
| 94 | + ]; |
| 95 | + } |
57 | 96 | }; |
58 | 97 |
|
59 | 98 | NodeMainTemplate.prototype.renderRequireExtensions = function(hash, chunk) { |
|
0 commit comments