appCss.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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.uniAppCssPlugin = exports.APP_CSS_JS = void 0;
  7. const fs_extra_1 = __importDefault(require("fs-extra"));
  8. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  9. exports.APP_CSS_JS = './app.css.js';
  10. function uniAppCssPlugin() {
  11. const inputDir = process.env.UNI_INPUT_DIR;
  12. const appVueFilename = (0, uni_cli_shared_1.resolveAppVue)(inputDir);
  13. return {
  14. name: 'uni:app-nvue-app-style',
  15. // 提前到 @vite/plugin-vue 之前执行,因为在 nvue 编译时,仅 import 了 App.vue 的 styles,这样导致 descriptor
  16. // 一直使用的是上一次的(plugin-vue 会在 transformMain 中生成新的 descriptor),故不再交由 plugin-vue 来 load
  17. // 而是当前插件直接处理
  18. enforce: 'pre',
  19. resolveId(id) {
  20. if (id === exports.APP_CSS_JS) {
  21. return exports.APP_CSS_JS;
  22. }
  23. },
  24. load(id) {
  25. if (id === exports.APP_CSS_JS) {
  26. return genAppStylesCode(appVueFilename, this);
  27. }
  28. const { filename, query } = (0, uni_cli_shared_1.parseVueRequest)(id);
  29. if (query.vue && query.type === 'style' && appVueFilename === filename) {
  30. const descriptor = createAppDescriptor(filename, this);
  31. const block = descriptor.styles[query.index];
  32. if (block) {
  33. return {
  34. code: block.content,
  35. map: '',
  36. };
  37. }
  38. }
  39. },
  40. };
  41. }
  42. exports.uniAppCssPlugin = uniAppCssPlugin;
  43. const defaultAppStylesCode = `exports.styles = []`;
  44. async function genAppStylesCode(filename, pluginContext) {
  45. pluginContext.addWatchFile(filename);
  46. const descriptor = createAppDescriptor(filename, pluginContext);
  47. if (!descriptor.styles.length) {
  48. return defaultAppStylesCode;
  49. }
  50. let stylesCode = ``;
  51. const styleVars = [];
  52. for (let i = 0; i < descriptor.styles.length; i++) {
  53. const style = descriptor.styles[i];
  54. const src = style.src || descriptor.filename;
  55. const attrsQuery = attrsToQuery(style.attrs, 'css');
  56. const srcQuery = style.src ? `&src=${descriptor.id}` : ``;
  57. const query = `?vue&type=style&index=${i}${srcQuery}&inline`;
  58. const styleRequest = src + query + attrsQuery;
  59. stylesCode += `\nimport _style_${i} from ${JSON.stringify(styleRequest)}`;
  60. styleVars.push(`_style_${i}`);
  61. }
  62. return `
  63. ${stylesCode}
  64. exports.styles = [${styleVars.join(',')}]
  65. `;
  66. }
  67. function readAppCode(filename) {
  68. if (!fs_extra_1.default.existsSync(filename)) {
  69. return ``;
  70. }
  71. const source = fs_extra_1.default.readFileSync(filename, 'utf8');
  72. if (source.includes('#endif')) {
  73. return (0, uni_cli_shared_1.preNVueJs)((0, uni_cli_shared_1.preNVueHtml)(source));
  74. }
  75. return source;
  76. }
  77. let appDescriptor;
  78. function createAppDescriptor(filename, pluginContext) {
  79. const source = readAppCode(filename);
  80. const id = (0, uni_cli_shared_1.hash)(source);
  81. if (!appDescriptor || appDescriptor.id !== id) {
  82. const { descriptor, errors } = require('@vue/compiler-sfc').parse(source, {
  83. filename,
  84. });
  85. descriptor.id = id;
  86. if (errors.length) {
  87. errors.forEach((error) => pluginContext.error((0, uni_cli_shared_1.createRollupError)('uni:app-nvue-app-style', filename, error)));
  88. }
  89. appDescriptor = descriptor;
  90. }
  91. return appDescriptor;
  92. }
  93. // these are built-in query parameters so should be ignored
  94. // if the user happen to add them as attrs
  95. const ignoreList = ['id', 'index', 'src', 'type', 'lang', 'module'];
  96. function attrsToQuery(attrs, langFallback, forceLangFallback = false) {
  97. let query = ``;
  98. for (const name in attrs) {
  99. const value = attrs[name];
  100. if (!ignoreList.includes(name)) {
  101. query += `&${encodeURIComponent(name)}${value ? `=${encodeURIComponent(value)}` : ``}`;
  102. }
  103. }
  104. if (langFallback || attrs.lang) {
  105. query +=
  106. `lang` in attrs
  107. ? forceLangFallback
  108. ? `&lang.${langFallback}`
  109. : `&lang.${attrs.lang}`
  110. : `&lang.${langFallback}`;
  111. }
  112. return query;
  113. }