You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const { ConcatSource, PrefixSource, RawSource } = require("webpack-sources");
 | |
| const { RuntimeGlobals } = require("..");
 | |
| const HotUpdateChunk = require("../HotUpdateChunk");
 | |
| const Template = require("../Template");
 | |
| const { getCompilationHooks } = require("./JavascriptModulesPlugin");
 | |
| const {
 | |
| 	generateEntryStartup,
 | |
| 	updateHashForEntryStartup
 | |
| } = require("./StartupHelpers");
 | |
| 
 | |
| /** @typedef {import("../Compiler")} Compiler */
 | |
| 
 | |
| class ArrayPushCallbackChunkFormatPlugin {
 | |
| 	/**
 | |
| 	 * Apply the plugin
 | |
| 	 * @param {Compiler} compiler the compiler instance
 | |
| 	 * @returns {void}
 | |
| 	 */
 | |
| 	apply(compiler) {
 | |
| 		compiler.hooks.thisCompilation.tap(
 | |
| 			"ArrayPushCallbackChunkFormatPlugin",
 | |
| 			compilation => {
 | |
| 				compilation.hooks.additionalChunkRuntimeRequirements.tap(
 | |
| 					"ArrayPushCallbackChunkFormatPlugin",
 | |
| 					(chunk, set, { chunkGraph }) => {
 | |
| 						if (chunk.hasRuntime()) return;
 | |
| 						if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
 | |
| 							set.add(RuntimeGlobals.onChunksLoaded);
 | |
| 							set.add(RuntimeGlobals.require);
 | |
| 						}
 | |
| 						set.add(RuntimeGlobals.chunkCallback);
 | |
| 					}
 | |
| 				);
 | |
| 				const hooks = getCompilationHooks(compilation);
 | |
| 				hooks.renderChunk.tap(
 | |
| 					"ArrayPushCallbackChunkFormatPlugin",
 | |
| 					(modules, renderContext) => {
 | |
| 						const { chunk, chunkGraph, runtimeTemplate } = renderContext;
 | |
| 						const hotUpdateChunk =
 | |
| 							chunk instanceof HotUpdateChunk ? chunk : null;
 | |
| 						const globalObject = runtimeTemplate.globalObject;
 | |
| 						const source = new ConcatSource();
 | |
| 						const runtimeModules =
 | |
| 							chunkGraph.getChunkRuntimeModulesInOrder(chunk);
 | |
| 						if (hotUpdateChunk) {
 | |
| 							const hotUpdateGlobal =
 | |
| 								runtimeTemplate.outputOptions.hotUpdateGlobal;
 | |
| 							source.add(
 | |
| 								`${globalObject}[${JSON.stringify(hotUpdateGlobal)}](`
 | |
| 							);
 | |
| 							source.add(`${JSON.stringify(chunk.id)},`);
 | |
| 							source.add(modules);
 | |
| 							if (runtimeModules.length > 0) {
 | |
| 								source.add(",\n");
 | |
| 								const runtimePart = Template.renderChunkRuntimeModules(
 | |
| 									runtimeModules,
 | |
| 									renderContext
 | |
| 								);
 | |
| 								source.add(runtimePart);
 | |
| 							}
 | |
| 							source.add(")");
 | |
| 						} else {
 | |
| 							const chunkLoadingGlobal =
 | |
| 								runtimeTemplate.outputOptions.chunkLoadingGlobal;
 | |
| 							source.add(
 | |
| 								`(${globalObject}[${JSON.stringify(
 | |
| 									chunkLoadingGlobal
 | |
| 								)}] = ${globalObject}[${JSON.stringify(
 | |
| 									chunkLoadingGlobal
 | |
| 								)}] || []).push([`
 | |
| 							);
 | |
| 							source.add(`${JSON.stringify(chunk.ids)},`);
 | |
| 							source.add(modules);
 | |
| 							const entries = Array.from(
 | |
| 								chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
 | |
| 							);
 | |
| 							if (runtimeModules.length > 0 || entries.length > 0) {
 | |
| 								const runtime = new ConcatSource(
 | |
| 									(runtimeTemplate.supportsArrowFunction()
 | |
| 										? `${RuntimeGlobals.require} =>`
 | |
| 										: `function(${RuntimeGlobals.require})`) +
 | |
| 										" { // webpackRuntimeModules\n"
 | |
| 								);
 | |
| 								if (runtimeModules.length > 0) {
 | |
| 									runtime.add(
 | |
| 										Template.renderRuntimeModules(runtimeModules, {
 | |
| 											...renderContext,
 | |
| 											codeGenerationResults: compilation.codeGenerationResults
 | |
| 										})
 | |
| 									);
 | |
| 								}
 | |
| 								if (entries.length > 0) {
 | |
| 									const startupSource = new RawSource(
 | |
| 										generateEntryStartup(
 | |
| 											chunkGraph,
 | |
| 											runtimeTemplate,
 | |
| 											entries,
 | |
| 											chunk,
 | |
| 											true
 | |
| 										)
 | |
| 									);
 | |
| 									runtime.add(
 | |
| 										hooks.renderStartup.call(
 | |
| 											startupSource,
 | |
| 											entries[entries.length - 1][0],
 | |
| 											{
 | |
| 												...renderContext,
 | |
| 												inlined: false
 | |
| 											}
 | |
| 										)
 | |
| 									);
 | |
| 									if (
 | |
| 										chunkGraph
 | |
| 											.getChunkRuntimeRequirements(chunk)
 | |
| 											.has(RuntimeGlobals.returnExportsFromRuntime)
 | |
| 									) {
 | |
| 										runtime.add(`return ${RuntimeGlobals.exports};\n`);
 | |
| 									}
 | |
| 								}
 | |
| 								runtime.add("}\n");
 | |
| 								source.add(",\n");
 | |
| 								source.add(new PrefixSource("/******/ ", runtime));
 | |
| 							}
 | |
| 							source.add("])");
 | |
| 						}
 | |
| 						return source;
 | |
| 					}
 | |
| 				);
 | |
| 				hooks.chunkHash.tap(
 | |
| 					"ArrayPushCallbackChunkFormatPlugin",
 | |
| 					(chunk, hash, { chunkGraph, runtimeTemplate }) => {
 | |
| 						if (chunk.hasRuntime()) return;
 | |
| 						hash.update(
 | |
| 							`ArrayPushCallbackChunkFormatPlugin1${runtimeTemplate.outputOptions.chunkLoadingGlobal}${runtimeTemplate.outputOptions.hotUpdateGlobal}${runtimeTemplate.globalObject}`
 | |
| 						);
 | |
| 						const entries = Array.from(
 | |
| 							chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
 | |
| 						);
 | |
| 						updateHashForEntryStartup(hash, chunkGraph, entries, chunk);
 | |
| 					}
 | |
| 				);
 | |
| 			}
 | |
| 		);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = ArrayPushCallbackChunkFormatPlugin;
 |