Taro
1、官方支持的平台
H5、ReactNative、微信小程序、京东小程序、百度小程序、支付宝小程序、字节跳动小程序、QQ 小程序、钉钉小程序、企业微信小程序、支付宝 IOT 小程序、飞书小程序
2、语法
- 语法与
react/vue
语法保持一致 - 组件库使用小程序组件,目前也已经支持 html
- 小程序接口调用使用
Taro.
- 没有路由,路由是配置在 page 字段中的
- 请求使用小程序请求
Taro.request()
,而不是 axios
3、环境搭建
bash
>> 方式1:全局安装脚手架
npm install -g @tarojs/cli
# 创建项目
taro init myApp(项目名)
# 微信小程序预览
npm run dev:weapp
# 使用 VSCode 开发,使用微信小程序开发工具进行预览(关闭ES6转ES5,代码压缩,格式化检查)
>> 方式2:使用 npx(不全局安装)
npx @tarojs/cli init myApp(项目名)
>> 版本升级
# 使用Taro 升级命令更新CLI版本到最新版本
taro update self
# 使用Taro 升级命令更新CLI版本到指定版本
taro update self [版本号]
# 使用Taro 升级命令将项目依赖升级到与@tarojs/cli一致的版本
taro update project
# 使用Taro 升级命令将项目依赖升级到指定版本
taro update project [版本号]
📔 新建项目选择
bash
? 请输入项目介绍 我的app项目
? 请选择框架 React
? 是否需要使用 TypeScript ? No
? 请选择 CSS 预处理器(Sass/Less/Stylus) Sass
? 请选择编译工具 Webpack5
? 请选择包管理工具 npm
? 请选择模板源 Gitee(最快)
√ 拉取远程模板仓库成功!
? 请选择模板 redux
4、项目目录结构
bash
├── dist 编译结果目录
|
├── config 项目编译配置目录
| ├── index.js 默认配置
| ├── dev.js 开发环境配置
| └── prod.js 生产环境配置
|
├── src 源码目录
| ├── pages 页面文件目录
| | └── index index 页面目录
| | ├── index.js index 页面逻辑
| | ├── index.css index 页面样式
| | └── index.config.js index 页面配置
| |
| ├── app.js 项目入口文件
| ├── app.css 项目总通用样式
| └── app.config.js 项目入口配置(小程序配置文件,js文件可以执行逻辑)
|
├── project.config.json 微信小程序项目配置 project.config.json
├── project.tt.json 字节跳动小程序项目配置 project.tt.json
├── project.swan.json 百度小程序项目配置 project.swan.json
├── project.qq.json QQ 小程序项目配置 project.qq.json
|
├── babel.config.js Babel 配置
├── tsconfig.json TypeScript 配置
├── .eslintrc ESLint 配置
|
└── package.json
📔 新建 page
bash
方式1:手动
方式2:
taro create --name 文件名
5、组件库
react 的 class 组件和 Vue 可直接使用
react 的函数组件需要引入
6、UI 库
NutUI:京东风格的轻量级移动端 Vue 组件库
Taro UI:一套基于 Taro 框架开发的多端 UI 组件库
常见接口调用
1、小程序登录
1)、常见登录
- 自建登录体系(用户名、密码)(手机号,验证码)
- 第三方登录(QQ,微信扫码,微博扫码...)
- 微信静默登录
2)、小程序登录流程(以 Taro 为例)
js
// 第一步、小程序端调用 wx.login() 获取 code
Taro.login({
success(res) {
console.log('获取登录凭证:', res);
// 向后端服务器请求
Taro.request({
url: '', //仅为示例,并非真实的接口地址
data: {
code: res.code
},
// header: {
// 'content-type': 'application/json' // 默认值
// },
success: function (res) {
console.log(res.data)
}
})
}
})
// 第二步、服务器端请求微信服务器
axios({
url: 'https://api.weixin.qq.com/sns/jscode2session',
method: 'GET',
params: {
appid: 'wxd5b8e55fa99824ac',
secret: 'e13c9ab601f444a2ce594dae2ad7d77f',
js_code: code,
grant_type: 'authorization_code'
}
})
.then(resp => {
if (resp.status == 200) {
console.log('微信服务器返回.success', resp.data);
res.json({
code: 200,
msg: 'ok',
data: {
openid: resp.data.openid
}
})
}
})
.catch(err => {
console.log('微信服务器返回.fail', err)
})
内网穿透
地图
js
// app.config.js文件引入
requiredPrivateInfos: ["chooseLocation", "choosePoi"]
js
wx.chooseLocation({
success(res) {
console.log('返回位置:', res)
setAddress({
address: res.address,
latitude: res.latitude,
longitude: res.longitude,
name: res.name
})
},
fail(err) {
console.log('返回位置失败:', err)
}
})
显示位置
js
wx.choosePoi({
success(res) {
console.log('返回位置:', res)
},
fail(err) {
console.log('返回位置失败:', err)
}
})
图片上传
js
Taro.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success(imageRes) {
console.log('选择的图片:', imageRes);
const tem = imageRes.tempFilePaths[0];
uploadHttp({
url: '/wechat/activity/uploadpreview',
filePath: tem,
name: 'img',
formData: {
msg: '活动封面图'
},
success(uploadRes) {
console.log('图片上传成功:', uploadRes.data);
const res = JSON.parse(uploadRes.data)
setImg(res.data);
},
fail(uploadErr) {
console.log('图片上传失败:', uploadErr)
}
})
},
fail(err) {
console.log('选择图片失败', err);
}
})
消息通知
后端会有一张消息表 → 当某个事件发生的时候(点赞、回复。。。),去向消息表添加一条未读消息数据。
前端(如何拿到未读消息数据)→ 及时性
AJAX - 前端主动向后端请求
🔎 解决方案
- 轮询:前端每隔一段时间向后端请求,获取新数据 → 缺点:开销很大
- websocket → 双工通信,前后端双向通信,即时聊天工具、区块链、股票信息等等
订阅消息(模板消息)
1、消息类型
- 一次性订阅消息
- 长期订阅消息
- 设备订阅消息
2、实现步骤
1)、步骤一:获取模板 ID
2)、步骤二:获取下发权限(小程序端)
js
wx.requestSubscribeMessage(Object object)
3)、步骤三:调用接口下发订阅消息(服务器端)
前提- 需要获取 access_token
js
subscribeMessage.send
小程序优化
1、分包加载
js
// app.config.js文件
pages: [ // pages 作为主包,打开小程序就会默认加载,一般tabbar作为主包,其他视情况
"pages/index/index",
// "pages/publicActivity/index",
// "pages/activityDetail/index",
"pages/message/index",
"pages/me/index",
],
subpackages: [ // 分包,只有访问这些页面时才会加载资源
{
"root": "pages/packageA", // 这个分包的根路径
"name": 'packageA', // 分包名字
"pages": [ // 这个分包中的页面路径,其中页面路径为分包根路径的相对路径
"publicActivity/index",
]
},
{
"root": "pages/packageB",
"name": 'packageB',
"pages": [
"activityDetail/index",
]
},
],
2、分包预加载
js
// app.config.js文件
preloadRule: { // 分包预下载
"pages/index/index": { // 访问主页,下载 packageB 包
"network": "all", // 在指定网络下预下载,可选值为 → all:不限网络;wifi:仅 wifi 下预下载
"packages": ["packageB"] // 进入页面后预下载分包的 root 或 name,APP 表示主包
},
},