uno.config.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // uno.config.ts
  2. import {
  3. type Preset,
  4. defineConfig,
  5. presetUno,
  6. presetAttributify,
  7. presetIcons,
  8. transformerDirectives,
  9. transformerVariantGroup,
  10. SourceCodeTransformer,
  11. cssIdRE,
  12. } from 'unocss'
  13. import { presetApplet, presetRemRpx, transformerAttributify } from 'unocss-applet'
  14. // const common = require('./scripts/common.js')
  15. // @see https://unocss.dev/presets/legacy-compat
  16. // import { presetLegacyCompat } from '@unocss/preset-legacy-compat'
  17. const isMp = process.env?.UNI_PLATFORM?.startsWith('mp') ?? false
  18. const presets: Preset[] = []
  19. if (isMp) {
  20. // 使用小程序预设
  21. presets.push(presetApplet(), presetRemRpx())
  22. } else {
  23. presets.push(
  24. // 非小程序用官方预设
  25. presetUno({
  26. transition: '',
  27. }),
  28. // 支持css class属性化
  29. presetAttributify(),
  30. )
  31. }
  32. // const index = 0
  33. /** 性能优化,
  34. * 去掉unocss全局变量,解决浏览器调试卡顿问题
  35. */
  36. function optimization(): SourceCodeTransformer {
  37. return {
  38. name: 'my-transformer',
  39. enforce: 'pre', // enforce before other transformers
  40. idFilter(id) {
  41. // 样式文件
  42. return cssIdRE.test(id)
  43. },
  44. async transform(code, id, { uno }) {
  45. // common.files.write(common.files.getPath(`temp/${index++}.html`), code.toString())
  46. code.replace(/\/\* layer: preflights \*\/[\s\S]+un-backdrop-sepia: ;\}\n/, '')
  47. },
  48. }
  49. }
  50. /** __uno.css中的样式名称增加.container 前缀,提高样式权重 */
  51. function classNamePreContainer(): SourceCodeTransformer {
  52. return {
  53. name: 'classNamePreContainer',
  54. enforce: 'pre', // enforce before other transformers
  55. idFilter(id) {
  56. // __uno.css
  57. return id.includes('__uno.css')
  58. },
  59. async transform(code, id, { uno }) {
  60. code.replace(/(\.(?:(?!container).+))\{/g, '.container $1{')
  61. },
  62. }
  63. }
  64. export default defineConfig({
  65. presets: [
  66. ...presets,
  67. // 支持图标,需要搭配图标库,eg: @iconify-json/carbon, 使用 `<button class="i-carbon-sun dark:i-carbon-moon" />`
  68. presetIcons({
  69. scale: 1.2,
  70. warn: true,
  71. extraProperties: {
  72. display: 'inline-block',
  73. 'vertical-align': 'middle',
  74. },
  75. }),
  76. // 将颜色函数 (rgb()和hsl()) 从空格分隔转换为逗号分隔,更好的兼容性app端,example:
  77. // `rgb(255 0 0)` -> `rgb(255, 0, 0)`
  78. // `rgba(255 0 0 / 0.5)` -> `rgba(255, 0, 0, 0.5)`
  79. // 与群友的正常写法冲突,先去掉!(2024-05-25)
  80. // presetLegacyCompat({
  81. // commaStyleColorFunction: true,
  82. // }) as Preset,
  83. ],
  84. /**
  85. * 自定义快捷语句
  86. * @see https://github.com/unocss/unocss#shortcuts
  87. */
  88. shortcuts: [['center', 'flex justify-center items-center']],
  89. transformers: [
  90. classNamePreContainer(),
  91. optimization(),
  92. // 启用 @apply 功能
  93. transformerDirectives(),
  94. // 启用 () 分组功能
  95. // 支持css class组合,eg: `<div class="hover:(bg-gray-400 font-medium) font-(light mono)">测试 unocss</div>`
  96. transformerVariantGroup(),
  97. // Don't change the following order
  98. transformerAttributify({
  99. // 解决与第三方框架样式冲突问题
  100. prefixedOnly: true,
  101. prefix: 'fg',
  102. }),
  103. ],
  104. rules: [
  105. [
  106. 'p-safe',
  107. {
  108. padding:
  109. 'env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)',
  110. },
  111. ],
  112. ['pt-safe', { 'padding-top': 'env(safe-area-inset-top)' }],
  113. ['pb-safe', { 'padding-bottom': 'env(safe-area-inset-bottom)' }],
  114. ],
  115. })
  116. /**
  117. * 最终这一套组合下来会得到:
  118. * mp 里面:mt-4 => margin-top: 32rpx == 16px
  119. * h5 里面:mt-4 => margin-top: 1rem == 16px
  120. *
  121. * 如果是传统方式写样式,则推荐设计稿设置为 750,这样设计稿1px,代码写1rpx。
  122. * rpx是响应式的,可以让不同设备的屏幕显示效果保持一致。
  123. */