ExternalModule.js 3.4 KB

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