多模态检索系统构建与性能优化实战
2026/5/5 0:11:10
在 uni-app 项目中集成 UnoCSS 后,H5 端样式正常显示,但小程序端样式完全加载失败。
Web (H5):
<style>标签小程序:
.wxss文件.wxss文件UnoCSS 默认采用全局模式 (global mode):
uno.css文件这种模式在 Web 环境完美运行,但在小程序中会失败,因为:
per-module模式UnoCSS({mode:'per-module'// 关键配置})原理:
uno.css包含所有样式ComponentA.vue→ComponentA.wxssComponentB.vue→ComponentB.wxss为什么这样能解决问题:
.wxss文件plugins:[uni(),// 必须在前UnoCSS(),// 必须在后]原理:
uni() 插件:负责将 Vue SFC 转换为小程序组件
.vue文件<template>→.wxml<script>→.js<style>→.wxssUnoCSS 插件:负责生成原子 CSS
<style>块为什么顺序重要:
presets:[presetUni(),// uni-app 专用预设]@uni-helper/unocss-preset-uni 解决的问题:
px、rem、emrpx(响应式像素)rpx// 你写的代码<viewclass="w-100 h-50">// presetUni 转换后.w-100{width:100rpx;}// 不是 100px.h-50{height:50rpx;}// 某些 CSS 特性在小程序中不支持backdrop-filter// 部分小程序不支持position:sticky// 小程序支持有限presetUni 会自动处理这些差异。
envMode:'build'原理:
为什么小程序需要这个:
源码 → UnoCSS 扫描 → 生成 uno.css → 全局导入 → 浏览器渲染源码 → uni() 解析组件 ↓ UnoCSS (per-module) 为每个组件生成样式 ↓ ComponentA.vue → ComponentA.wxss ComponentB.vue → ComponentB.wxss ↓ 小程序运行时加载独立样式文件// ❌ 错误:排除小程序// #ifndef MP-WEIXINimport"uno.css";// #endif// ✅ 正确:所有平台都导入import"uno.css";原因:per-module 模式下,uno.css只是一个入口标识,实际样式已经分散到各个组件中。
exportdefaultdefineConfig(async()=>{constUnoCSS=awaitimport("unocss/vite").then((m)=>m.default);return{plugins:[uni(),// 1. 先处理 uni-app 转换UnoCSS({mode:'per-module'// 2. 按组件生成样式}),],};});exportdefaultdefineConfig({presets:[presetUni(),// uni-app 适配presetAttributify(),// 属性化模式presetIcons(),// 图标支持],transformers:[transformerDirectives(),// @apply 等指令transformerVariantGroup(),// 变体组语法],envMode:'build',// 强制构建模式});配置正确后,编译输出:
dist/dev/mp-weixin/ ├── components/ │ ├── AudioPlayer.wxss ← 独立样式 │ ├── ModeSelector.wxss ← 独立样式 ├── pages/ │ ├── practice/ │ │ └── practice.wxss ← 独立样式每个.wxss文件只包含该组件使用的原子类,实现了样式隔离。
{"unocss":"^66.5.10","@uni-helper/unocss-preset-uni":"^0.2.11","@dcloudio/vite-plugin-uni":"3.0.0-4080420251103001"}小程序集成 UnoCSS 的核心是理解: