uni_modules.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.resolveExtApiProvider = exports.buildUniExtApiProviders = exports.uniUTSUniModulesPlugin = exports.utsPlugins = void 0;
  7. const fs_1 = __importDefault(require("fs"));
  8. const path_1 = __importDefault(require("path"));
  9. const uni_shared_1 = require("@dcloudio/uni-shared");
  10. const uts_1 = require("../../../uts");
  11. const utils_1 = require("../../utils");
  12. const uni_modules_1 = require("../../../uni_modules");
  13. const UTSProxyRE = /\?uts-proxy$/;
  14. function isUTSProxy(id) {
  15. return UTSProxyRE.test(id);
  16. }
  17. const utsModuleCaches = new Map();
  18. exports.utsPlugins = new Set();
  19. let uniExtApiCompiler = async () => { };
  20. function uniUTSUniModulesPlugin(options = {}) {
  21. process.env.UNI_UTS_USING_ROLLUP = 'true';
  22. const compilePlugin = (pluginDir) => {
  23. exports.utsPlugins.add(path_1.default.basename(pluginDir));
  24. const pkgJson = require(path_1.default.join(pluginDir, 'package.json'));
  25. const extApiProvider = resolveExtApiProvider(pkgJson);
  26. // 如果是 provider 扩展,需要判断 provider 的宿主插件是否在本地,在的话,自动导入该宿主插件包名
  27. let uniExtApiProviderServicePlugin = '';
  28. if (extApiProvider?.servicePlugin) {
  29. if (fs_1.default.existsSync(path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules', extApiProvider.servicePlugin))) {
  30. uniExtApiProviderServicePlugin = extApiProvider.servicePlugin;
  31. }
  32. }
  33. return (0, uts_1.resolveUTSCompiler)().compile(pluginDir, {
  34. isX: !!options.x,
  35. isSingleThread: !!options.isSingleThread,
  36. isPlugin: true,
  37. extApis: options.extApis,
  38. sourceMap: process.env.NODE_ENV === 'development',
  39. transform: {
  40. uniExtApiProviderName: extApiProvider?.name,
  41. uniExtApiProviderService: extApiProvider?.service,
  42. uniExtApiProviderServicePlugin,
  43. },
  44. });
  45. };
  46. uniExtApiCompiler = async () => {
  47. // 获取 provider 扩展
  48. const plugins = (0, uni_modules_1.getUniExtApiProviders)().filter((provider) => !exports.utsPlugins.has(provider.plugin));
  49. for (const plugin of plugins) {
  50. const result = await compilePlugin(path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules', plugin.plugin));
  51. if (result) {
  52. // 时机不对,不能addWatch
  53. // result.deps.forEach((dep) => {
  54. // this.addWatchFile(dep)
  55. // })
  56. }
  57. }
  58. };
  59. return {
  60. name: 'uni:uts-uni_modules',
  61. apply: 'build',
  62. enforce: 'pre',
  63. resolveId(id, importer) {
  64. if (isUTSProxy(id)) {
  65. return id;
  66. }
  67. const module = (0, uts_1.resolveUTSAppModule)(id, importer ? path_1.default.dirname(importer) : process.env.UNI_INPUT_DIR, options.x !== true);
  68. if (module) {
  69. // prefix the polyfill id with \0 to tell other plugins not to try to load or transform it
  70. return module + '?uts-proxy';
  71. }
  72. },
  73. load(id) {
  74. if (isUTSProxy(id)) {
  75. return '';
  76. }
  77. },
  78. buildEnd() {
  79. utsModuleCaches.clear();
  80. },
  81. async transform(_, id, opts) {
  82. if (opts && opts.ssr) {
  83. return;
  84. }
  85. if (!isUTSProxy(id)) {
  86. return;
  87. }
  88. const { filename: pluginDir } = (0, utils_1.parseVueRequest)(id.replace('\0', ''));
  89. // 当 vue 和 nvue 均引用了相同 uts 插件,解决两套编译器会编译两次 uts 插件的问题
  90. // 通过缓存,保证同一个 uts 插件只编译一次
  91. if (utsModuleCaches.get(pluginDir)) {
  92. return utsModuleCaches.get(pluginDir)().then((result) => {
  93. if (result) {
  94. result.deps.forEach((dep) => {
  95. this.addWatchFile(dep);
  96. });
  97. return {
  98. code: result.code,
  99. map: null,
  100. syntheticNamedExports: result.encrypt,
  101. meta: result.meta,
  102. };
  103. }
  104. });
  105. }
  106. const compile = (0, uni_shared_1.once)(() => {
  107. return compilePlugin(pluginDir);
  108. });
  109. utsModuleCaches.set(pluginDir, compile);
  110. const result = await compile();
  111. if (result) {
  112. result.deps.forEach((dep) => {
  113. this.addWatchFile(dep);
  114. });
  115. return {
  116. code: result.code,
  117. map: null,
  118. syntheticNamedExports: result.encrypt,
  119. meta: result.meta,
  120. };
  121. }
  122. },
  123. async generateBundle() { },
  124. };
  125. }
  126. exports.uniUTSUniModulesPlugin = uniUTSUniModulesPlugin;
  127. async function buildUniExtApiProviders() {
  128. await uniExtApiCompiler();
  129. }
  130. exports.buildUniExtApiProviders = buildUniExtApiProviders;
  131. function resolveExtApiProvider(pkg) {
  132. const provider = pkg.uni_modules?.['uni-ext-api']?.provider;
  133. if (provider?.service) {
  134. if (provider.name && !provider.servicePlugin) {
  135. provider.servicePlugin = 'uni-' + provider.service;
  136. }
  137. return provider;
  138. }
  139. }
  140. exports.resolveExtApiProvider = resolveExtApiProvider;