readme.txt 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. replace -> @dcloudio/uni-mp-vite/dist/plugin/configResolved.js
  2. "use strict";
  3. var __importDefault = (this && this.__importDefault) || function (mod) {
  4. return (mod && mod.__esModule) ? mod : { "default": mod };
  5. };
  6. Object.defineProperty(exports, "__esModule", { value: true });
  7. exports.createConfigResolved = void 0;
  8. const debug_1 = __importDefault(require("debug"));
  9. const shared_1 = require("@vue/shared");
  10. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  11. const pagesJson_1 = require("../plugins/pagesJson");
  12. const entry_1 = require("../plugins/entry");
  13. const debugNVueCss = (0, debug_1.default)('uni:nvue-css');
  14. const cssVars = `page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}`;
  15. const uvueCssVars = `page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px;--uni-safe-area-inset-top:0px;--uni-safe-area-inset-left:0px;--uni-safe-area-inset-right:0px;--uni-safe-area-inset-bottom:0px;}`;
  16. const genShadowCss = (cdn) => {
  17. const url = (0, uni_cli_shared_1.createShadowImageUrl)(cdn, 'grey');
  18. return `page::after{position:fixed;content:'';left:-1000px;top:-1000px;-webkit-animation:shadow-preload .1s;-webkit-animation-delay:3s;animation:shadow-preload .1s;animation-delay:3s}@-webkit-keyframes shadow-preload{0%{background-image:url(${url})}100%{background-image:url(${url})}}@keyframes shadow-preload{0%{background-image:url(${url})}100%{background-image:url(${url})}}`;
  19. };
  20. const genComponentCustomHiddenCss = (name) => `[${name.replace(':', '')}="true"]{display: none !important;}`;
  21. function createConfigResolved({ cdn, style: { extname }, template: { component }, }) {
  22. function normalizeCssChunkFilename(id, extname) {
  23. return ((0, uni_cli_shared_1.removeExt)((0, uni_cli_shared_1.normalizeMiniProgramFilename)(id, process.env.UNI_INPUT_DIR)) +
  24. extname);
  25. }
  26. return (config) => {
  27. const mainPath = (0, uni_cli_shared_1.resolveMainPathOnce)(process.env.UNI_INPUT_DIR);
  28. fixUnocss(config);
  29. (0, uni_cli_shared_1.injectCssPlugin)(config, process.env.UNI_COMPILE_TARGET === 'uni_modules'
  30. ? {
  31. createUrlReplacer: uni_cli_shared_1.createEncryptCssUrlReplacer,
  32. }
  33. : {});
  34. let unocssGlobalBuildBundleIndex = config.plugins.findIndex((p) => p.name === 'unocss:global:build:bundle');
  35. if (unocssGlobalBuildBundleIndex === -1) {
  36. unocssGlobalBuildBundleIndex = config.plugins.findIndex((p) => p.name === 'unocss:global:build:generate');
  37. }
  38. const hasUnocssGlobalBuildBundle = unocssGlobalBuildBundleIndex > -1;
  39. // unocss 是根据 .css 后缀来编译文件,需要先保持 css 文件后缀为 .css,等 unocss 处理完后,再重置回正确的文件后缀
  40. const cssExtname = hasUnocssGlobalBuildBundle ? '.css' : extname;
  41. (0, uni_cli_shared_1.injectCssPostPlugin)(config, (0, uni_cli_shared_1.cssPostPlugin)(config, {
  42. platform: process.env.UNI_PLATFORM,
  43. chunkCssFilename(id) {
  44. if (id === mainPath) {
  45. return 'app' + cssExtname;
  46. }
  47. else if ((0, entry_1.isUniPageUrl)(id)) {
  48. return normalizeCssChunkFilename((0, entry_1.parseVirtualPagePath)(id), cssExtname);
  49. }
  50. else if ((0, entry_1.isUniComponentUrl)(id)) {
  51. return normalizeCssChunkFilename((0, entry_1.parseVirtualComponentPath)(id), cssExtname);
  52. }
  53. else if (id.startsWith('uni_modules://')) {
  54. return normalizeCssChunkFilename(id.replace('uni_modules://', ''), cssExtname);
  55. }
  56. },
  57. chunkCssCode(filename, cssCode) {
  58. // 如果是加密组件,不生成css
  59. if (filename.startsWith('uni_modules')) {
  60. const pluginId = filename.split('/')[1];
  61. const encryptType = (0, uni_cli_shared_1.getUniModulesEncryptType)(pluginId);
  62. if (encryptType === 'easycom') {
  63. return '';
  64. }
  65. }
  66. const isX = process.env.UNI_APP_X === 'true';
  67. cssCode = (0, uni_cli_shared_1.transformScopedCss)(cssCode);
  68. if (filename === 'app' + cssExtname) {
  69. const componentCustomHiddenCss = (component &&
  70. component.vShow &&
  71. genComponentCustomHiddenCss(component.vShow)) ||
  72. '';
  73. const realCssVars = isX ? uvueCssVars : cssVars;
  74. if (config.isProduction) {
  75. return (cssCode +
  76. (process.env.UNI_PLATFORM !== 'mp-weixin'
  77. ? genShadowCss(cdn || 0)
  78. : '') +
  79. realCssVars +
  80. componentCustomHiddenCss);
  81. }
  82. else {
  83. return cssCode + realCssVars + componentCustomHiddenCss;
  84. }
  85. }
  86. if (isX) {
  87. if (component?.[':host']) {
  88. const flexDirection = (0, uni_cli_shared_1.parseUniXFlexDirection)((0, uni_cli_shared_1.parseManifestJsonOnce)(process.env.UNI_INPUT_DIR));
  89. cssCode = `:host{display:flex;flex-direction:${flexDirection}}\n${cssCode}`;
  90. }
  91. if (!(0, uni_cli_shared_1.isMiniProgramPageFile)(filename)) {
  92. return cssCode;
  93. }
  94. /**
  95. * 此方法将subPackages中的页面合并到了pages内
  96. */
  97. const pagesJson = (0, uni_cli_shared_1.parsePagesJsonOnce)(process.env.UNI_INPUT_DIR, process.env.UNI_PLATFORM);
  98. const page = pagesJson.pages.find((page) => page.path === (0, uni_cli_shared_1.removeExt)(filename));
  99. if (!page) {
  100. return cssCode;
  101. }
  102. /**
  103. * 何时不重置样式?
  104. * - page.style.enabelUcssReset为false
  105. * - page.style.enableUcssReset为空,pagesJson.globalStyle.enableUcssReset为false
  106. * - page.style.enableUcssReset为空,pagesJson.globalStyle.enableUcssReset为空,page.style.renderer为skyline
  107. */
  108. const shouldNotResetStyle = page.style.enableUcssReset === false ||
  109. (page.style.enableUcssReset == null &&
  110. pagesJson.globalStyle.enableUcssReset === false) ||
  111. (page.style.enableUcssReset == null &&
  112. pagesJson.globalStyle.enableUcssReset == null &&
  113. page.style.renderer === 'skyline');
  114. if (!shouldNotResetStyle) {
  115. /**
  116. * 兼容发布为小程序分包模式
  117. */
  118. const uvueCssPath = (0, uni_cli_shared_1.relativeFile)(filename, `uvue${extname}`);
  119. cssCode = `@import "${uvueCssPath}";\n` + cssCode;
  120. }
  121. return cssCode;
  122. }
  123. const nvueCssPaths = (0, pagesJson_1.getNVueCssPaths)(config);
  124. if (!nvueCssPaths || !nvueCssPaths.length) {
  125. return cssCode;
  126. }
  127. const normalized = (0, uni_cli_shared_1.normalizePath)(filename);
  128. if (nvueCssPaths.find((pageCssPath) => pageCssPath === normalized)) {
  129. debugNVueCss(normalized);
  130. return (`@import "${(0, uni_cli_shared_1.relativeFile)(normalized, 'nvue' + extname)}";\n` +
  131. cssCode);
  132. }
  133. return cssCode;
  134. },
  135. }));
  136. (0, uni_cli_shared_1.injectAssetPlugin)(config);
  137. if (hasUnocssGlobalBuildBundle && extname !== '.css') {
  138. ;
  139. config.plugins.splice(unocssGlobalBuildBundleIndex + 1, 0, adjustCssExtname(extname));
  140. }
  141. };
  142. }
  143. exports.createConfigResolved = createConfigResolved;
  144. function adjustCssExtname(extname) {
  145. return {
  146. name: 'uni:adjust-css-extname',
  147. generateBundle: {
  148. order: 'post',
  149. handler(_, bundle) {
  150. const files = Object.keys(bundle);
  151. files.forEach((name) => {
  152. if (name.endsWith('.css')) {
  153. const asset = bundle[name];
  154. (0, shared_1.isString)(asset.source) &&
  155. (asset.source = asset.source.replace(/\*\,/g, 'page,'));
  156. this.emitFile({
  157. fileName: name.replace('.css', extname),
  158. type: 'asset',
  159. source: asset.source,
  160. });
  161. delete bundle[name];
  162. }
  163. });
  164. },
  165. },
  166. };
  167. }
  168. function fixUnocss(config) {
  169. const unocssGlobalBuildScan = config.plugins.find((p) => p.name === 'unocss:global:build:scan');
  170. // TODO 原始的 scan 的 buildStart 会清空 vfsLayerMap,导致 watch 时,load 阶段 /__uno.css 获取不到
  171. // https://github.com/antfu/unocss/blob/main/packages/vite/src/modes/global/build.ts#L25
  172. if (unocssGlobalBuildScan) {
  173. // 隐患: task 未被清空
  174. unocssGlobalBuildScan.buildStart = () => { };
  175. }
  176. }