mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
	
	
		
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const RuntimeGlobals = require("../RuntimeGlobals"); | ||
|  | const RuntimeModule = require("../RuntimeModule"); | ||
|  | const Template = require("../Template"); | ||
|  | 
 | ||
|  | class OnChunksLoadedRuntimeModule extends RuntimeModule { | ||
|  | 	constructor() { | ||
|  | 		super("chunk loaded"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @returns {string} runtime code | ||
|  | 	 */ | ||
|  | 	generate() { | ||
|  | 		const { compilation } = this; | ||
|  | 		const { runtimeTemplate } = compilation; | ||
|  | 		return Template.asString([ | ||
|  | 			"var deferred = [];", | ||
|  | 			`${ | ||
|  | 				RuntimeGlobals.onChunksLoaded | ||
|  | 			} = ${runtimeTemplate.basicFunction("result, chunkIds, fn, priority", [ | ||
|  | 				"if(chunkIds) {", | ||
|  | 				Template.indent([ | ||
|  | 					"priority = priority || 0;", | ||
|  | 					"for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];", | ||
|  | 					"deferred[i] = [chunkIds, fn, priority];", | ||
|  | 					"return;" | ||
|  | 				]), | ||
|  | 				"}", | ||
|  | 				"var notFulfilled = Infinity;", | ||
|  | 				"for (var i = 0; i < deferred.length; i++) {", | ||
|  | 				Template.indent([ | ||
|  | 					runtimeTemplate.destructureArray( | ||
|  | 						["chunkIds", "fn", "priority"], | ||
|  | 						"deferred[i]" | ||
|  | 					), | ||
|  | 					"var fulfilled = true;", | ||
|  | 					"for (var j = 0; j < chunkIds.length; j++) {", | ||
|  | 					Template.indent([ | ||
|  | 						`if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(${ | ||
|  | 							RuntimeGlobals.onChunksLoaded | ||
|  | 						}).every(${runtimeTemplate.returningFunction( | ||
|  | 							`${RuntimeGlobals.onChunksLoaded}[key](chunkIds[j])`, | ||
|  | 							"key" | ||
|  | 						)})) {`,
 | ||
|  | 						Template.indent(["chunkIds.splice(j--, 1);"]), | ||
|  | 						"} else {", | ||
|  | 						Template.indent([ | ||
|  | 							"fulfilled = false;", | ||
|  | 							"if(priority < notFulfilled) notFulfilled = priority;" | ||
|  | 						]), | ||
|  | 						"}" | ||
|  | 					]), | ||
|  | 					"}", | ||
|  | 					"if(fulfilled) {", | ||
|  | 					Template.indent(["deferred.splice(i--, 1)", "result = fn();"]), | ||
|  | 					"}" | ||
|  | 				]), | ||
|  | 				"}", | ||
|  | 				"return result;" | ||
|  | 			])};`
 | ||
|  | 		]); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = OnChunksLoadedRuntimeModule; |