支付宝(微信)小程序接入Unocss

620 阅读1分钟

技术栈

小程序原生框架 + TS + unocss + biome

示例

image.png

依赖安装

npm install -D unocss

开始

  1. 在根目录下新建文件unocss.config.{js.ts}
import type { Preset, Rule } from 'unocss'
import { defineConfig, presetAttributify, presetUno } from 'unocss'
import presetRemToRpx from './preset-rem-to-rpx'
const sizeMapping: Record<string, string> = {
  fs: 'font-size'
}
function getSizeRules(Mapping: Record<string, string>): Rule[] {
  return Object.keys(Mapping).map(key => {
    const value = Mapping[key]
    return [new RegExp(
^${key}-(\d+)$
), ([, d]) => ({ [value]: 
${d}rpx
 })]
  })
}
export default defineConfig({
  presets: [
    presetAttributify(),
    presetUno(),
    presetRemToRpx({
      baseFontSize: 4
    }) as Preset
  ],
  theme: {
    preflightRoot: ['page,::before,::after']
  },
  rules: getSizeRules(sizeMapping),
  include: [/.axml$/]
})
  1. 根目录新建preset-rem-to-rpx.ts,配置px转rpx
const remRE = /(-?[.\d]+)rem/g
interface Options {
  baseFontSize?: number
}
function remToRpxPreset(options: Options = {}) {
  const { baseFontSize = 16 } = options
  return {
    name: '@unocss/preset-rem-to-rpx',
    postprocess: util => {
      // biome-ignore lint/complexity/noForEach: <explanation>
      util.entries.forEach(i => {
        const value = i[1]
        if (value && typeof value === 'string' && remRE.test(value))
          i[1] = value.replace(remRE, (_, p1) => 
${p1 * baseFontSize}rpx
)
      })
    }
  }
}
export { remToRpxPreset as default }
  1. package.json添加unocss cli处理脚本,监听项目下的axml文件,将原子化css编译到根目录unocss.acss文件
{
  "name": "alipay-miniprogram",
  "version": "1.0.0",
  "scripts": {
    "unocss": "unocss ./
/*.axml -c unocss.config.ts --watch -o unocss.acss",
**    "unocss:build": "unocss ./**
/*.axml -c unocss.config.ts -o unocss.acss"
  },
  "devDependencies": {
    "unocss": "^0.61.8"
  }
}
  1. 在app.acss引入unocss.acss
@import "./unocss.acss";
page {
  background: #f7f7f7;
}
  1. 配置mini.project.json文件, 使用scripts预处理能力,小程序编译时启动unocss服务,热更新也会更新unocss.acss文件(开启预处理之后即可在小程序编译时就开启unocss cli编译,不需要手动run
{
  "format": 2,
  "developOptions": {
    "hotReload": true
  },
  "compileOptions": {
    "component2": true,
  },
  "scripts": {
    "watch": "npm run unocss",
    "beforeUpload": "npm run unocss:build"
  }
}

示例

alipay-unocss-template