ExternalModule.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const Module = require("./Module");
  7. const OriginalSource = require("webpack-sources").OriginalSource;
  8. const RawSource = require("webpack-sources").RawSource;
  9. const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
  10. const Template = require("./Template");
  11. class ExternalModule extends Module {
  12. constructor(request, type) {
  13. super();
  14. this.request = request;
  15. this.type = type;
  16. this.built = false;
  17. this.external = true;
  18. }
  19. chunkCondition(chunk) {
  20. return chunk.hasEntryModule();
  21. }
  22. identifier() {
  23. return "external " + JSON.stringify(this.request);
  24. }
  25. readableIdentifier() {
  26. return "external " + JSON.stringify(this.request);
  27. }
  28. needRebuild() {
  29. return false;
  30. }
  31. build(options, compilation, resolver, fs, callback) {
  32. this.builtTime = Date.now();
  33. callback();
  34. }
  35. getSourceForGlobalVariableExternal(variableName, type) {
  36. if(!Array.isArray(variableName)) {
  37. // make it an array as the look up works the same basically
  38. variableName = [variableName];
  39. }
  40. // needed for e.g. window["some"]["thing"]
  41. const objectLookup = variableName.map(r => `[${JSON.stringify(r)}]`).join("");
  42. return `(function() { module.exports = ${type}${objectLookup}; }());`;
  43. }
  44. getSourceForCommonJsExternal(moduleAndSpecifiers) {
  45. if(!Array.isArray(moduleAndSpecifiers)) {
  46. return `module.exports = require(${JSON.stringify(moduleAndSpecifiers)});`;
  47. }
  48. const moduleName = moduleAndSpecifiers[0];
  49. const objectLookup = moduleAndSpecifiers.slice(1).map(r => `[${JSON.stringify(r)}]`).join("");
  50. return `module.exports = require(${moduleName})${objectLookup};`;
  51. }
  52. checkExternalVariable(variableToCheck, request) {
  53. return `if(typeof ${variableToCheck} === 'undefined') {${WebpackMissingModule.moduleCode(request)}}\n`;
  54. }
  55. getSourceForAmdOrUmdExternal(id, optional, request) {
  56. const externalVariable = Template.toIdentifier(`__WEBPACK_EXTERNAL_MODULE_${id}__`);
  57. const missingModuleError = optional ? this.checkExternalVariable(externalVariable, request) : "";
  58. return `${missingModuleError}module.exports = ${externalVariable};`;
  59. }
  60. getSourceForDefaultCase(optional, request) {
  61. const missingModuleError = optional ? this.checkExternalVariable(request, request) : "";
  62. return `${missingModuleError}module.exports = ${request};`;
  63. }
  64. getSourceString() {
  65. const request = typeof this.request === "object" ? this.request[this.type] : this.request;
  66. switch(this.type) {
  67. case "this":
  68. case "window":
  69. case "global":
  70. return this.getSourceForGlobalVariableExternal(request, this.type);
  71. case "commonjs":
  72. case "commonjs2":
  73. return this.getSourceForCommonJsExternal(request);
  74. case "amd":
  75. case "umd":
  76. case "umd2":
  77. return this.getSourceForAmdOrUmdExternal(this.id, this.optional, request);
  78. default:
  79. return this.getSourceForDefaultCase(this.optional, request);
  80. }
  81. }
  82. getSource(sourceString) {
  83. if(this.useSourceMap) {
  84. return new OriginalSource(sourceString, this.identifier());
  85. }
  86. return new RawSource(sourceString);
  87. }
  88. source() {
  89. return this.getSource(
  90. this.getSourceString()
  91. );
  92. }
  93. size() {
  94. return 42;
  95. }
  96. }
  97. module.exports = ExternalModule;