You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							192 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							192 lines
						
					
					
						
							5.8 KiB
						
					
					
				/* | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php | 
						|
	Author Tobias Koppers @sokra | 
						|
*/ | 
						|
"use strict"; | 
						|
 | 
						|
const Template = require("../Template"); | 
						|
 | 
						|
class WebWorkerMainTemplatePlugin { | 
						|
	apply(mainTemplate) { | 
						|
		const needChunkOnDemandLoadingCode = chunk => { | 
						|
			for (const chunkGroup of chunk.groupsIterable) { | 
						|
				if (chunkGroup.getNumberOfChildren() > 0) return true; | 
						|
			} | 
						|
			return false; | 
						|
		}; | 
						|
		mainTemplate.hooks.localVars.tap( | 
						|
			"WebWorkerMainTemplatePlugin", | 
						|
			(source, chunk) => { | 
						|
				if (needChunkOnDemandLoadingCode(chunk)) { | 
						|
					return Template.asString([ | 
						|
						source, | 
						|
						"", | 
						|
						"// object to store loaded chunks", | 
						|
						'// "1" means "already loaded"', | 
						|
						"var installedChunks = {", | 
						|
						Template.indent( | 
						|
							chunk.ids.map(id => `${JSON.stringify(id)}: 1`).join(",\n") | 
						|
						), | 
						|
						"};" | 
						|
					]); | 
						|
				} | 
						|
				return source; | 
						|
			} | 
						|
		); | 
						|
		mainTemplate.hooks.requireEnsure.tap( | 
						|
			"WebWorkerMainTemplatePlugin", | 
						|
			(_, chunk, hash) => { | 
						|
				const chunkFilename = mainTemplate.outputOptions.chunkFilename; | 
						|
				const chunkMaps = chunk.getChunkMaps(); | 
						|
				return Template.asString([ | 
						|
					"promises.push(Promise.resolve().then(function() {", | 
						|
					Template.indent([ | 
						|
						'// "1" is the signal for "already loaded"', | 
						|
						"if(!installedChunks[chunkId]) {", | 
						|
						Template.indent([ | 
						|
							"importScripts(" + | 
						|
								"__webpack_require__.p + " + | 
						|
								mainTemplate.getAssetPath(JSON.stringify(chunkFilename), { | 
						|
									hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, | 
						|
									hashWithLength: length => | 
						|
										`" + ${mainTemplate.renderCurrentHashCode( | 
						|
											hash, | 
						|
											length | 
						|
										)} + "`, | 
						|
									chunk: { | 
						|
										id: '" + chunkId + "', | 
						|
										hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`, | 
						|
										hashWithLength(length) { | 
						|
											const shortChunkHashMap = Object.create(null); | 
						|
											for (const chunkId of Object.keys(chunkMaps.hash)) { | 
						|
												if (typeof chunkMaps.hash[chunkId] === "string") { | 
						|
													shortChunkHashMap[chunkId] = chunkMaps.hash[ | 
						|
														chunkId | 
						|
													].substr(0, length); | 
						|
												} | 
						|
											} | 
						|
											return `" + ${JSON.stringify( | 
						|
												shortChunkHashMap | 
						|
											)}[chunkId] + "`; | 
						|
										}, | 
						|
										contentHash: { | 
						|
											javascript: `" + ${JSON.stringify( | 
						|
												chunkMaps.contentHash.javascript | 
						|
											)}[chunkId] + "` | 
						|
										}, | 
						|
										contentHashWithLength: { | 
						|
											javascript: length => { | 
						|
												const shortContentHashMap = {}; | 
						|
												const contentHash = chunkMaps.contentHash.javascript; | 
						|
												for (const chunkId of Object.keys(contentHash)) { | 
						|
													if (typeof contentHash[chunkId] === "string") { | 
						|
														shortContentHashMap[chunkId] = contentHash[ | 
						|
															chunkId | 
						|
														].substr(0, length); | 
						|
													} | 
						|
												} | 
						|
												return `" + ${JSON.stringify( | 
						|
													shortContentHashMap | 
						|
												)}[chunkId] + "`; | 
						|
											} | 
						|
										}, | 
						|
										name: `" + (${JSON.stringify( | 
						|
											chunkMaps.name | 
						|
										)}[chunkId]||chunkId) + "` | 
						|
									}, | 
						|
									contentHashType: "javascript" | 
						|
								}) + | 
						|
								");" | 
						|
						]), | 
						|
						"}" | 
						|
					]), | 
						|
					"}));" | 
						|
				]); | 
						|
			} | 
						|
		); | 
						|
		mainTemplate.hooks.bootstrap.tap( | 
						|
			"WebWorkerMainTemplatePlugin", | 
						|
			(source, chunk, hash) => { | 
						|
				if (needChunkOnDemandLoadingCode(chunk)) { | 
						|
					const chunkCallbackName = | 
						|
						mainTemplate.outputOptions.chunkCallbackName; | 
						|
					const globalObject = mainTemplate.outputOptions.globalObject; | 
						|
					return Template.asString([ | 
						|
						source, | 
						|
						`${globalObject}[${JSON.stringify( | 
						|
							chunkCallbackName | 
						|
						)}] = function webpackChunkCallback(chunkIds, moreModules) {`, | 
						|
						Template.indent([ | 
						|
							"for(var moduleId in moreModules) {", | 
						|
							Template.indent( | 
						|
								mainTemplate.renderAddModule( | 
						|
									hash, | 
						|
									chunk, | 
						|
									"moduleId", | 
						|
									"moreModules[moduleId]" | 
						|
								) | 
						|
							), | 
						|
							"}", | 
						|
							"while(chunkIds.length)", | 
						|
							Template.indent("installedChunks[chunkIds.pop()] = 1;") | 
						|
						]), | 
						|
						"};" | 
						|
					]); | 
						|
				} | 
						|
				return source; | 
						|
			} | 
						|
		); | 
						|
		mainTemplate.hooks.hotBootstrap.tap( | 
						|
			"WebWorkerMainTemplatePlugin", | 
						|
			(source, chunk, hash) => { | 
						|
				const hotUpdateChunkFilename = | 
						|
					mainTemplate.outputOptions.hotUpdateChunkFilename; | 
						|
				const hotUpdateMainFilename = | 
						|
					mainTemplate.outputOptions.hotUpdateMainFilename; | 
						|
				const hotUpdateFunction = mainTemplate.outputOptions.hotUpdateFunction; | 
						|
				const globalObject = mainTemplate.outputOptions.globalObject; | 
						|
				const currentHotUpdateChunkFilename = mainTemplate.getAssetPath( | 
						|
					JSON.stringify(hotUpdateChunkFilename), | 
						|
					{ | 
						|
						hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, | 
						|
						hashWithLength: length => | 
						|
							`" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`, | 
						|
						chunk: { | 
						|
							id: '" + chunkId + "' | 
						|
						} | 
						|
					} | 
						|
				); | 
						|
				const currentHotUpdateMainFilename = mainTemplate.getAssetPath( | 
						|
					JSON.stringify(hotUpdateMainFilename), | 
						|
					{ | 
						|
						hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, | 
						|
						hashWithLength: length => | 
						|
							`" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "` | 
						|
					} | 
						|
				); | 
						|
 | 
						|
				return ( | 
						|
					source + | 
						|
					"\n" + | 
						|
					`var parentHotUpdateCallback = ${globalObject}[${JSON.stringify( | 
						|
						hotUpdateFunction | 
						|
					)}];\n` + | 
						|
					`${globalObject}[${JSON.stringify(hotUpdateFunction)}] = ` + | 
						|
					Template.getFunctionContent( | 
						|
						require("./WebWorkerMainTemplate.runtime") | 
						|
					) | 
						|
						.replace(/\/\/\$semicolon/g, ";") | 
						|
						.replace(/\$require\$/g, mainTemplate.requireFn) | 
						|
						.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) | 
						|
						.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename) | 
						|
						.replace(/\$hash\$/g, JSON.stringify(hash)) | 
						|
				); | 
						|
			} | 
						|
		); | 
						|
		mainTemplate.hooks.hash.tap("WebWorkerMainTemplatePlugin", hash => { | 
						|
			hash.update("webworker"); | 
						|
			hash.update("4"); | 
						|
		}); | 
						|
	} | 
						|
} | 
						|
module.exports = WebWorkerMainTemplatePlugin;
 | 
						|
 |