renderjs.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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.uniRenderjsPlugin = exports.APP_RENDERJS_JS = exports.APP_WXS_JS = void 0;
  7. const path_1 = __importDefault(require("path"));
  8. const debug_1 = __importDefault(require("debug"));
  9. const uni_shared_1 = require("@dcloudio/uni-shared");
  10. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  11. const debugRenderjs = (0, debug_1.default)('uni:app-renderjs');
  12. exports.APP_WXS_JS = 'app-wxs.js';
  13. exports.APP_RENDERJS_JS = 'app-renderjs.js';
  14. const wxsModulesCache = new WeakMap();
  15. const renderjsModulesCache = new WeakMap();
  16. function uniRenderjsPlugin() {
  17. let resolvedConfig;
  18. let userConfig;
  19. let changed = false;
  20. return {
  21. name: 'uni:app-vue-renderjs',
  22. config(config) {
  23. userConfig = config;
  24. },
  25. configResolved(config) {
  26. resolvedConfig = config;
  27. wxsModulesCache.set(resolvedConfig, new Map());
  28. renderjsModulesCache.set(resolvedConfig, new Map());
  29. },
  30. async transform(code, id) {
  31. const { type, name, filename } = (0, uni_cli_shared_1.parseRenderjs)(id);
  32. if (!type) {
  33. return;
  34. }
  35. if (type !== 'wxs' && type !== 'renderjs') {
  36. return;
  37. }
  38. debugRenderjs(id);
  39. this.addWatchFile((0, uni_cli_shared_1.cleanUrl)(id));
  40. if (!name) {
  41. this.error((0, uni_cli_shared_1.missingModuleName)(type, code));
  42. }
  43. const modulePath = (0, uni_cli_shared_1.normalizePath)(path_1.default.normalize(path_1.default.relative(process.env.UNI_INPUT_DIR, id)));
  44. const moduleHashId = (0, uni_cli_shared_1.hash)(modulePath);
  45. const globalName = type === 'wxs' ? uni_shared_1.WXS_MODULES : uni_shared_1.RENDERJS_MODULES;
  46. const { isProduction } = resolvedConfig;
  47. const resultCode = normalizeCode(type === 'wxs'
  48. ? await transformWxs(code, filename, `__${globalName}['${moduleHashId}']`, isProduction, userConfig)
  49. : await transformRenderjs(code, filename, `__${globalName}['${moduleHashId}']`, isProduction, userConfig), globalName, isProduction);
  50. if (type === 'wxs') {
  51. wxsModulesCache.get(resolvedConfig).set(moduleHashId, resultCode);
  52. }
  53. else {
  54. renderjsModulesCache.get(resolvedConfig).set(moduleHashId, resultCode);
  55. }
  56. changed = true;
  57. debugRenderjs(type, modulePath, moduleHashId);
  58. return {
  59. code: `export default Comp => {
  60. ;(Comp.$${type} || (Comp.$${type} = [])).push('${name}')
  61. ;(Comp.$${globalName} || (Comp.$${globalName} = {}))['${name}'] = '${moduleHashId}'
  62. }`,
  63. map: { mappings: '' },
  64. };
  65. },
  66. generateBundle() {
  67. if (!changed) {
  68. return;
  69. }
  70. const wxsCode = [...wxsModulesCache.get(resolvedConfig).values()].join('\n');
  71. if (wxsCode) {
  72. this.emitFile({
  73. fileName: exports.APP_WXS_JS,
  74. source: `var __${uni_shared_1.WXS_MODULES}={};\n` + wxsCode,
  75. type: 'asset',
  76. });
  77. }
  78. const renderjsCode = [
  79. ...renderjsModulesCache.get(resolvedConfig).values(),
  80. ].join('\n');
  81. if (renderjsCode) {
  82. this.emitFile({
  83. fileName: exports.APP_RENDERJS_JS,
  84. source: `var __${uni_shared_1.RENDERJS_MODULES}={};\n` + renderjsCode,
  85. type: 'asset',
  86. });
  87. }
  88. },
  89. };
  90. }
  91. exports.uniRenderjsPlugin = uniRenderjsPlugin;
  92. function normalizeCode(code, globalName, isProduction) {
  93. return code.replace(isProduction
  94. ? `var __${globalName}=__${globalName}||{};`
  95. : `var __${globalName} = __${globalName} || {};`, '');
  96. }
  97. function transformWxs(code, filename, globalName, isProduction, config) {
  98. return (0, uni_cli_shared_1.transformWithEsbuild)(code, filename, {
  99. format: 'iife',
  100. globalName,
  101. target: config.build?.target || 'es6',
  102. minify: isProduction ? true : false,
  103. bundle: true,
  104. write: false,
  105. }).then((res) => {
  106. if (res.outputFiles) {
  107. return res.outputFiles[0].text;
  108. }
  109. return '';
  110. });
  111. }
  112. function transformRenderjs(code, filename, globalName, isProduction, config) {
  113. return (0, uni_cli_shared_1.transformWithEsbuild)(code, filename, {
  114. format: 'iife',
  115. globalName,
  116. target: config.build?.target || 'es6',
  117. minify: isProduction ? true : false,
  118. bundle: true,
  119. write: false,
  120. }).then((res) => {
  121. if (res.outputFiles) {
  122. return res.outputFiles[0].text;
  123. }
  124. return '';
  125. });
  126. }