resolveScript.js 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.resolveScript = exports.canInlineTemplate = exports.typeDepToSFCMap = exports.clientCache = void 0;
  4. const util_1 = require("./util");
  5. const compiler_1 = require("./compiler");
  6. const { compileScript } = compiler_1.compiler;
  7. exports.clientCache = new WeakMap();
  8. const serverCache = new WeakMap();
  9. exports.typeDepToSFCMap = new Map();
  10. /**
  11. * inline template mode can only be enabled if:
  12. * - is production (separate compilation needed for HMR during dev)
  13. * - template has no pre-processor (separate loader chain required)
  14. * - template is not using src
  15. */
  16. function canInlineTemplate(descriptor, isProd) {
  17. const templateLang = descriptor.template && descriptor.template.lang;
  18. const templateSrc = descriptor.template && descriptor.template.src;
  19. return isProd && !!descriptor.scriptSetup && !templateLang && !templateSrc;
  20. }
  21. exports.canInlineTemplate = canInlineTemplate;
  22. function resolveScript(descriptor, scopeId, options, loaderContext) {
  23. var _a;
  24. if (!descriptor.script && !descriptor.scriptSetup) {
  25. return null;
  26. }
  27. const isProd = loaderContext.mode === 'production' || process.env.NODE_ENV === 'production';
  28. const isServer = (_a = options.isServerBuild) !== null && _a !== void 0 ? _a : loaderContext.target === 'node';
  29. const enableInline = canInlineTemplate(descriptor, isProd);
  30. const cacheToUse = isServer ? serverCache : exports.clientCache;
  31. const cached = cacheToUse.get(descriptor);
  32. if (cached) {
  33. return cached;
  34. }
  35. let resolved = null;
  36. let templateCompiler;
  37. if (typeof options.compiler === 'string') {
  38. templateCompiler = require(options.compiler);
  39. }
  40. else {
  41. templateCompiler = options.compiler;
  42. }
  43. try {
  44. resolved = compileScript(descriptor, {
  45. id: scopeId,
  46. isProd,
  47. inlineTemplate: enableInline,
  48. reactivityTransform: options.reactivityTransform,
  49. propsDestructure: options.propsDestructure,
  50. defineModel: options.defineModel,
  51. babelParserPlugins: options.babelParserPlugins,
  52. templateOptions: {
  53. ssr: isServer,
  54. compiler: templateCompiler,
  55. compilerOptions: Object.assign(Object.assign({}, options.compilerOptions), (0, util_1.resolveTemplateTSOptions)(descriptor, options)),
  56. transformAssetUrls: options.transformAssetUrls || true,
  57. },
  58. });
  59. }
  60. catch (e) {
  61. loaderContext.emitError(e);
  62. }
  63. if (!isProd && (resolved === null || resolved === void 0 ? void 0 : resolved.deps)) {
  64. for (const [key, sfcs] of exports.typeDepToSFCMap) {
  65. if (sfcs.has(descriptor.filename) && !resolved.deps.includes(key)) {
  66. sfcs.delete(descriptor.filename);
  67. if (!sfcs.size) {
  68. exports.typeDepToSFCMap.delete(key);
  69. }
  70. }
  71. }
  72. for (const dep of resolved.deps) {
  73. const existingSet = exports.typeDepToSFCMap.get(dep);
  74. if (!existingSet) {
  75. exports.typeDepToSFCMap.set(dep, new Set([descriptor.filename]));
  76. }
  77. else {
  78. existingSet.add(descriptor.filename);
  79. }
  80. }
  81. }
  82. cacheToUse.set(descriptor, resolved);
  83. return resolved;
  84. }
  85. exports.resolveScript = resolveScript;