什么是 uni-app
uni-app 是 DCloud 推出的跨端框架,使用 Vue 语法编写,一套代码可编译到微信小程序、H5、App(iOS/Android)、支付宝小程序等十余个平台。底层原理是:编写时用统一 API,编译时针对各平台生成对应代码。
一、创建项目
两种方式:
方式一:HBuilderX(官方 IDE,可视化)
新建项目 → 选择 uni-app 模板(推荐 Vue3 + Vite 版)。
方式二:命令行 CLI
1 2 3 4 5
| npx degit dcloudio/uni-preset-vue#vite my-uni-app cd my-uni-app npm install npm run dev:mp-weixin npm run dev:h5
|
推荐 CLI 方式,方便用自己熟悉的编辑器。
二、目录结构
1 2 3 4 5 6 7 8 9 10 11 12
| my-uni-app/ ├── src/ │ ├── pages/ # 页面,每个页面一个目录 │ │ └── index/ │ │ └── index.vue │ ├── static/ # 静态资源 │ ├── App.vue # 应用入口(全局生命周期、全局样式) │ ├── main.js # Vue 入口 │ ├── pages.json # 页面路由与导航栏配置(类似小程序的 app.json) │ ├── manifest.json # 应用配置(appid、各平台配置) │ └── uni.scss # 全局样式变量 └── package.json
|
三、pages.json:路由与导航栏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| { "pages": [ { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页", "enablePullDownRefresh": true } }, { "path": "pages/detail/detail", "style": { "navigationBarTitleText": "详情" } } ], "globalStyle": { "navigationBarTextStyle": "black", "navigationBarBackgroundColor": "#ffffff" }, "tabBar": { "color": "#7A7E83", "selectedColor": "#3cc51f", "list": [ { "pagePath": "pages/index/index", "text": "首页" }, { "pagePath": "pages/detail/detail", "text": "详情" } ] } }
|
第一项 pages 是首页(启动页),tabBar 配置底部导航。
四、写一个页面
页面就是一个 Vue 单文件组件,用 template + script + style:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <template> <view class="container"> <text class="title">今日待办</text>
<view class="item" v-for="todo in todos" :key="todo.id"> <checkbox :checked="todo.done" @click="toggle(todo)" /> <text :class="{ done: todo.done }">{{ todo.title }}</text> </view>
<input v-model="newTodo" placeholder="输入新待办" confirm-type="done" @confirm="addTodo" /> <button type="primary" @click="addTodo">添加</button> </view> </template>
<script setup> import { ref } from 'vue'
const todos = ref([ { id: 1, title: '学习 uni-app', done: false }, { id: 2, title: '发布到微信小程序', done: false } ]) const newTodo = ref('')
function toggle(todo) { todo.done = !todo.done }
function addTodo() { const title = newTodo.value.trim() if (!title) return todos.value.push({ id: Date.now(), title, done: false }) newTodo.value = '' } </script>
<style scoped> .container { padding: 24rpx; } .title { font-size: 40rpx; font-weight: bold; } .done { text-decoration: line-through; color: #999; } </style>
|
注意事项:
- 标签用 view、text、input、button 等 uni-app 内置组件,不是 HTML 的 div/span;
- 单位用 rpx(响应式像素),750rpx = 屏幕宽度,跨端自适应;
- 部分 Web 特性(如 v-html)在各端支持不一致,跨端场景尽量不用。
五、API 调用:uni.xxx 统一接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| uni.request({ url: 'https://api.example.com/todos', method: 'GET', success: (res) => { console.log(res.data) }, fail: (err) => { uni.showToast({ title: '请求失败', icon: 'none' }) } })
uni.setStorageSync('token', token) const token = uni.getStorageSync('token')
uni.navigateTo({ url: '/pages/detail/detail?id=1' })
uni.showToast({ title: '保存成功', icon: 'success' }) uni.showLoading({ title: '加载中' })
|
六、条件编译:处理平台差异
少数场景各平台实现不同,用条件编译注释区分:
1 2 3 4 5 6 7
| <view>只在微信小程序编译</view>
<view>只在 H5 编译</view>
|
1 2 3
| console.log('App 端(iOS/Android)专用逻辑')
|
常用条件值:MP-WEIXIN(微信小程序)、H5、APP-PLUS(App)、MP-ALIPAY(支付宝小程序)。
七、运行与发布
微信小程序:
- npm run dev:mp-weixin 生成 dist/dev/mp-weixin;
- 用微信开发者工具”导入项目”选择该目录,填入自己的小程序 AppID;
- 真机预览调试;
- 发布时 npm run build:mp-weixin,在微信开发者工具里上传审核。
H5:
- npm run dev:h5 本地调试;
- npm run build:h5 构建 dist/build/h5,部署到任意静态服务器即可。
常见坑
- 样式不一致:各端对 CSS 支持有差异,涉及兼容性的样式用条件编译单独处理;
- uni.request 在小程序里需要配置合法域名(微信公众平台 → 开发设置 → 服务器域名),本地调试要勾选”不校验合法域名”;
- 组件不能随便用 HTML 标签:跨端场景务必使用 uni-app 内置组件;
- App 端发布:需要 DCloud 开发者账号打包,或者用云打包生成安装包。
总结
uni-app 的核心价值是”一份代码,多端覆盖”。上手重点:pages.json 路由配置、内置组件、uni.xxx API、条件编译。业务简单、追求多端覆盖的项目,用 uni-app 比分别维护小程序和 H5 高效得多。