UNPKG

webpack

Version:

Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.

180 lines (154 loc) 4.39 kB
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { OriginalSource, RawSource } = require("webpack-sources"); const Module = require("./Module"); const WebpackMissingModule = require("./dependencies/WebpackMissingModule"); const Template = require("./Template"); /** @typedef {import("./util/createHash").Hash} Hash */ class ExternalModule extends Module { constructor(request, type, userRequest) { super("javascript/dynamic", null); // Info from Factory this.request = request; this.externalType = type; this.userRequest = userRequest; this.external = true; } libIdent() { return this.userRequest; } chunkCondition(chunk) { return chunk.hasEntryModule(); } identifier() { return "external " + JSON.stringify(this.request); } readableIdentifier() { return "external " + JSON.stringify(this.request); } needRebuild() { return false; } build(options, compilation, resolver, fs, callback) { this.built = true; this.buildMeta = {}; this.buildInfo = {}; callback(); } getSourceForGlobalVariableExternal(variableName, type) { if (!Array.isArray(variableName)) { // make it an array as the look up works the same basically variableName = [variableName]; } // needed for e.g. window["some"]["thing"] const objectLookup = variableName .map(r => `[${JSON.stringify(r)}]`) .join(""); return `(function() { module.exports = ${type}${objectLookup}; }());`; } getSourceForCommonJsExternal(moduleAndSpecifiers) { if (!Array.isArray(moduleAndSpecifiers)) { return `module.exports = require(${JSON.stringify( moduleAndSpecifiers )});`; } const moduleName = moduleAndSpecifiers[0]; const objectLookup = moduleAndSpecifiers .slice(1) .map(r => `[${JSON.stringify(r)}]`) .join(""); return `module.exports = require(${JSON.stringify( moduleName )})${objectLookup};`; } checkExternalVariable(variableToCheck, request) { return `if(typeof ${variableToCheck} === 'undefined') {${WebpackMissingModule.moduleCode( request )}}\n`; } getSourceForAmdOrUmdExternal(id, optional, request) { const externalVariable = `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier( `${id}` )}__`; const missingModuleError = optional ? this.checkExternalVariable(externalVariable, request) : ""; return `${missingModuleError}module.exports = ${externalVariable};`; } getSourceForDefaultCase(optional, request) { if (!Array.isArray(request)) { // make it an array as the look up works the same basically request = [request]; } const variableName = request[0]; const missingModuleError = optional ? this.checkExternalVariable(variableName, request.join(".")) : ""; const objectLookup = request .slice(1) .map(r => `[${JSON.stringify(r)}]`) .join(""); return `${missingModuleError}module.exports = ${variableName}${objectLookup};`; } getSourceString(runtime) { const request = typeof this.request === "object" && !Array.isArray(this.request) ? this.request[this.externalType] : this.request; switch (this.externalType) { case "this": case "window": case "self": return this.getSourceForGlobalVariableExternal( request, this.externalType ); case "global": return this.getSourceForGlobalVariableExternal( request, runtime.outputOptions.globalObject ); case "commonjs": case "commonjs2": return this.getSourceForCommonJsExternal(request); case "amd": case "amd-require": case "umd": case "umd2": case "system": return this.getSourceForAmdOrUmdExternal( this.id, this.optional, request ); default: return this.getSourceForDefaultCase(this.optional, request); } } getSource(sourceString) { if (this.useSourceMap) { return new OriginalSource(sourceString, this.identifier()); } return new RawSource(sourceString); } source(dependencyTemplates, runtime) { return this.getSource(this.getSourceString(runtime)); } size() { return 42; } /** * @param {Hash} hash the hash used to track dependencies * @returns {void} */ updateHash(hash) { hash.update(this.externalType); hash.update(JSON.stringify(this.request)); hash.update(JSON.stringify(Boolean(this.optional))); super.updateHash(hash); } } module.exports = ExternalModule;