1. uni-app小程序前端开发实战指南
作为一款基于Vue.js的跨平台开发框架,uni-app让开发者能够使用一套代码同时发布到iOS、Android以及各种小程序平台。我在过去两年中主导了7个uni-app项目的开发,从电商商城到社交应用,踩过不少坑也积累了一些实用经验。本文将分享uni-app开发微信小程序时那些官方文档没写清楚但实际开发中必须掌握的技巧。
2. 开发环境与项目初始化
2.1 开发工具选型与配置
HBuilderX是官方推荐的IDE,但实际开发中我发现VSCode + uni-app插件组合更符合前端开发者的习惯。配置要点:
-
必须安装的VSCode插件:
- Volar(Vue3支持)
- uni-app-snippets(代码片段)
- WXML - Language Services(小程序模板支持)
-
项目配置文件
manifest.json的隐藏技巧:
json复制{
"mp-weixin": {
"appid": "你的小程序ID",
"setting": {
"urlCheck": false, // 关闭域名校验(开发阶段)
"es6": true, // 必开选项
"postcss": true, // 样式自动补全
"minified": true // 代码压缩
},
"usingComponents": true,
"lazyCodeLoading": "requiredComponents" // 组件懒加载
}
}
注意:生产环境必须开启域名校验,否则审核会被拒
2.2 项目目录结构优化
官方模板的目录结构在实际业务中往往不够用,我推荐的进阶结构:
code复制├── common
│ ├── api # 接口封装
│ ├── config # 环境配置
│ ├── constants # 常量定义
│ └── utils # 工具函数
├── components
│ ├── base # 基础组件
│ └── business # 业务组件
├── pages
│ └── moduleA # 按模块划分
├── static
│ ├── icons # 字体图标
│ └── images # 图片资源
└── store # 状态管理
关键点:业务组件按功能划分目录,避免全部堆在components下导致维护困难。
3. 核心开发技巧与性能优化
3.1 双Token认证实现方案
微信小程序对网络请求有严格限制,传统的JWT续签方案在小程序中会遇到问题。我的解决方案:
javascript复制// utils/request.js
let isRefreshing = false
let requests = []
const request = (options) => {
return new Promise((resolve, reject) => {
const _request = () => {
uni.request({
url: options.url,
method: options.method,
data: options.data,
header: {
'Authorization': `Bearer ${store.state.token}`
},
success: (res) => {
if (res.statusCode === 401) {
if (!isRefreshing) {
refreshToken().then(() => {
requests.forEach(cb => cb())
requests = []
})
}
return new Promise(resolve => {
requests.push(() => {
resolve(request(options))
})
})
}
resolve(res.data)
}
})
}
_request()
})
}
const refreshToken = () => {
isRefreshing = true
return uni.request({
url: '/api/auth/refresh',
method: 'POST',
header: {
'Authorization': `Refresh ${store.state.refreshToken}`
}
}).then(res => {
store.commit('SET_TOKEN', res.data.token)
isRefreshing = false
})
}
3.2 图片优化实战方案
小程序包体积限制严格,图片处理是关键:
- 自动压缩方案:
javascript复制// 在vue.config.js中配置
module.exports = {
chainWebpack: (config) => {
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: [0.65, 0.9], speed: 4 },
gifsicle: { interlaced: false },
webp: { quality: 75 }
})
}
}
- CDN加速方案:
html复制<image :src="imgUrl" mode="aspectFill" lazy-load></image>
<script>
export default {
computed: {
imgUrl() {
return this.imagePath.startsWith('http')
? this.imagePath
: `https://your-cdn.com/${this.imagePath}?x-oss-process=image/resize,w_300/quality,q_80`
}
}
}
</script>
4. 调试与发布技巧
4.1 小程序抓包解决方案
由于微信限制,传统抓包工具无法直接捕获小程序请求。我的解决方案:
- 配置代理:
bash复制# 使用Charles配置
Proxy -> SSL Proxying Settings -> Add
Host: *.qq.com
Port: 443
- 手机端配置:
- iOS:安装Charles证书后,在"关于本机->证书信任设置"中启用
- Android:将Charles证书安装为系统证书
- 微信开发者工具配置:
json复制// 项目根目录创建proxy.config.js
module.exports = {
proxy: {
'/api': {
target: 'http://your.proxy.server',
changeOrigin: true,
secure: false
}
}
}
4.2 隐私合规处理
最新审核要求必须处理用户隐私协议,推荐方案:
- 在
manifest.json中声明:
json复制{
"mp-weixin": {
"privacy": {
"prompt": "custom",
"template": {
"title": "用户隐私保护指引",
"content": "我们需要收集您的设备信息..."
}
}
}
}
- 代码中主动触发授权:
javascript复制uni.requirePrivacyAuthorize({
success: () => {
console.log('授权成功')
},
fail: (err) => {
console.error('授权失败', err)
}
})
5. 常见问题解决方案
5.1 跨平台兼容问题
- H5端
uni.downloadFile限制解决方案:
javascript复制function downloadFile(url) {
// #ifdef H5
return new Promise((resolve) => {
const link = document.createElement('a')
link.href = url
link.download = ''
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
resolve()
})
// #endif
// #ifdef MP-WEIXIN
return uni.downloadFile({ url })
// #endif
}
- 导航栏高度适配方案:
javascript复制// utils/system.js
export function getNavBarHeight() {
// #ifdef MP-WEIXIN
const { statusBarHeight, platform } = uni.getSystemInfoSync()
let menuButton = uni.getMenuButtonBoundingClientRect()
return menuButton.bottom + menuButton.top - statusBarHeight
// #endif
// #ifdef H5
return 44
// #endif
}
5.2 性能优化指标
通过实测得出的优化建议:
| 优化项 | 实施前 | 实施后 | 提升幅度 |
|---|---|---|---|
| 图片懒加载 | 2.1s | 1.3s | 38% |
| 组件按需加载 | 1.8s | 1.2s | 33% |
| 减少setData调用 | 450ms | 280ms | 38% |
| 使用自定义组件 | 1.5s | 0.9s | 40% |
实现这些优化的关键代码:
javascript复制// 优化setData调用
this.setData({
'obj.key': value // 局部更新而非整个对象
})
// 组件懒加载
{
"usingComponents": {
"my-component": "/components/my-component?lazy"
}
}
在最近的一个电商项目中,通过上述优化手段将首屏加载时间从2.8秒降低到1.5秒,用户留存率提升了22%。特别是在列表页实现图片懒加载后,滚动流畅度明显改善,FPS从45提升到了55左右。
