文章目录
- 1. 今日目标
- 2. 使用 npm
- 2.1 小程序对 npm 的支持和限制
- 问题
- 2.2 了解什么是 vant Weapp
- 2.3 安装 Vant 组件库
- 问题
- 2.4 使用 Vant 组件
- 问题
- 2.5 定义和使用 CSS 变量
- 问题
- 2.6 使用 CSS 变量定制 Vant 的主题样式
- 问题
- 2.7 什么是小程序 API 的 Promise 化
- 2.8 安装并构建 miniprogram-api-promise
- 2.9 三个步骤实现 API 的 Promise 化
- 2.10 调用 Promise 化之后的异步 API
- 3. 全局数据共享
- 3.1 什么是全局数据共享
- 3.2 小程序中的全局数据共享方案
- 3.3 安装并构建 Mobx 相关的包
- 3.4 创建 Store 实例对象
- 问题
- 3.5 定义计算属性
- 问题
- 3.6 定义 actions 方法
- 问题
- 3.7 将 Store 中的成员绑定到页面上的实现思路
- 问题
- 3.8 将 Store 中的成员绑定到页面上
- 3.9 在页面中使用 Store 的成员
- 3.10 了解 Store 中成员绑定到组件上的实现思路
- 问题
- 3.11 将 Store 中的成员绑定到组件上
- 3.12 在组件中使用 Store 中的成员
- 4. 分包
- 4.1 了解分包的概念和好处
- 问题
- 4.2 分包前后项目的构成
- 4.3 分包的加载规则
- 4.4 分包的体积限制
- 问题
- 4.5 了解如何配置分包
- 问题
- 4.6 演示在项目中如何配置分包
- 4.7 设置分包的别名并查看分包体积
- 4.8 打包原则
- 4.9 引用原则
- 4.10 了解什么是独立分包以及它和普通分包的区别
- 4.11 了解独立分包的应用场景
- 4.12 将普通分包改造成独立分包
- 问题
- 4.13 独立分包的引用原则
- 问题
- 4.14 介绍分包预下载的概念以及好处
- 4.15 配置分包的预下载
- 4.16 分包预下载的限制
vant-weapp
组件库MobX
实现全局数据共享API
进行 Promise
化tabBar
的效果小程序使用npm包有哪些限制?
目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序 中使用 npm 包有如下 3 个限制:
总结:虽然 npm 上的包有千千万,但是能供小程序使用的包却“为数不多”
Vant
是有赞前端团队开源的移动端组件库,于 2016 年开源,已持续维护 4 年时间。Vant
对内承载了有赞所有核心业务,对外服务十多万开发者,是业界主流的移动端组件库之一MIT
开源许可协议,对商业使用比较友好二维码这里不能发,可以自行百度搜一下
如何安装Vant组件库?
在小程序项目中,安装 Vant 组件库主要分为如下几步
通过 npm
安装
npm init -y
npm i @vant/[email protected] -S --production
使用–production会只安装dependences不会安装devDependences
构建 npm
包功能
微信开发者工具
--> 详情
--> 本地设置
--> 使用 npm 模块
微信开发者工具
--> 菜单栏
--> 工具
--> 构建npm
构建成功,耗时 xxx 秒
且控制台没有任何的错误,说明包构建成功,可以进行使用
node_modules
、miniprogram_npm
删除工具
--> 构建npm
,进行重新构建修改 app.json
styles: v2
进行移除,防止 小程序本身的 UI 样式和 Vant 的组件样式库 冲突
详细的操作地址:安装 vant
安装完 Vant
组件库之后,可以在 app.json
的 usingComponents
节点中引入需要的组件,即可在 wxml
中直接使用组件
"usingComponents": {
"van-button": "@vant/weapp/button/index"
}
<van-button type="default">默认按钮van-button>
<van-button type="primary">主要按钮van-button>
<van-button type="info">信息按钮van-button>
<van-button type="warning">警告按钮van-button>
<van-button type="danger">危险按钮van-button>
Vant Weapp
使用 CSS
变量来实现定制主题。 关于 CSS
变量的基本用法,请参考 MDN
文档
https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_propertiesopen
在 app.wxss
中,写入 CSS
变量,即可对全局生效
所有可用的颜色变量,请参考 Vant 官方提供的配置文件
https://github.com/youzan/vant-weapp/blob/dev/packages/common/style/var.less
API
的缺点
API Promise
化进行改造API Promise
化
API Promise
化,指的是通过额外的配置,将官方提供的、基于回调函数的异步 API
,升级改造为基于 Promise
的异步 API
,从而提高代码的可读性、维护性,避免回调地狱的问题在小程序中,实现 API Promise
化主要依赖于 miniprogram-api-promise
这个第三方的 npm
包
npm i --save [email protected]
下载完成,我们不能直接使用这个包,而是需要再次重新构建npm包
miniprogram_npm
npm
在小程序入口文件中调用一次 promisifyAll()
方法
import { promisifyAll } from 'miniprogram-api-promise'
声明一个常量,为一个空对象
const wxp = wx.p = {}
调用 promisifyAll()
方法
promisifyAll(wx, wxp)
上述代码是什么含义呢 ?
promisifyAll
: 做的事就是将 wx
拥有的属性方法都 copy
并改造了一份给了 wxp
这个对象wxp
只是当前 js
文件的一个常量,只能在当前文件使用wx
上挂载一个属性 p
让他和 wxp
指向同一个空对象wx
点出 p
来访问到 wxp
wx.p
发起异步的请求时,得到的是一个 promise
对象async/await
简化 Promise
语法<van-button type="warning" bindtap="getInfo">警告按钮van-button>
async getInfo () {
const { data: res } = await wx.p.request({
url: 'https://www.escook.cn/api/get',
method: 'GET',
data: {
name: 'zs',
age: 19
}
})
console.log(res)
}
全局数据共享
,又叫做:状态管理
,是为了解决组件之间数据共享
的问题Vuex
、 Redux
、 MobX
等mobx-miniprogram
配合mobx-miniprogram-bindings
实现全局数据共享。其中:
mobx-miniprogram
用来创建 Store
实例对象mobx-miniprogram-bindings
用来把 Store
中的共享数据或方法,绑定到组件或页面中使用在项目中运行如下的命令,安装 MobX
相关的包
npm install --save [email protected] [email protected]
注意: MobX
相关的包安装完毕之后,记得删除 miniprogram_npm
目录后,重新构建 npm
store
文件夹,在文件夹中创建 store.js
文件mobx-miniprogram
创建 Store
实例的包Store
仓库,声明全局共享的数据,并导入import { observable } from 'mobx-miniprogram'
export const store = observable({
numA: 1,
numB: 2
})
get
修饰符,代表 sum
的值是只读的,无法进行修改sum
依赖于 numA
和 numB
的值,因此 sum
函数的返回值就是最终的值import { observable } from 'mobx-miniprogram'
export const store = observable({
// 数据字段
numA: 1,
numB: 2,
// 计算属性
get sum() {
return this.numA + this.numB
}
})
action
函数action
函数,专门用来修改 store
中数据的值import { observable, action } from 'mobx-miniprogram'
export const store = observable({
// 数据字段
numA: 1,
numB: 2,
// 计算属性
get sum() {
return this.numA + this.numB
},
// actions 方法,用来修改 store 中的数据
updateNumA: action(function (step) {
this.numA += step
}),
updateNumB: action(function (step) {
this.numB += step
})
})
createStoreBindings
方法
this
,当前页面的实例对象fields(数据)
,actions(修改方法)
}
createStoreBindings
方法的返回值,进行清理销毁的工作import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Page({
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.storeBindings = createStoreBindings(this, {
store,
fields: ['numA', 'numB', 'sum'],
actions: ['updateNumA']
})
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
this.storeBindings.destroyStoreBindings()
}
})
<view>{{ numA }} + {{ numB }} = {{ sum }}view>
<van-button type="warning" bindtap="btnHandler1" data-step="{{ 1 }}">
numA + 1
van-button>
<van-button type="primary" bindtap="btnHandler1" data-step="{{ -1 }}">
numA -1
van-button>
btnHandler1 (e) {
this.updateNumA(e.target.dataset.step)
}
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Component({
// 通过 storeBindingsBehavior 来实现自动绑定
behaviors: [storeBindingsBehavior],
storeBindings: {
store, // 指定要绑定的 Store
// 指定要绑定的字段数据
fields: {
numA: () => store.numA, // 绑定字段的第 1 种方式
numB: (store) => store.numB, // 绑定数据的第 2 个方式
sum: 'sum' // 绑定数据的第 3 个方式
},
// 指定要绑定的方法
actions: {
updateNumA: 'updateNumA'
}
}
})
<view>{{ numA }} + {{ numB }} = {{ sum }}view>
<van-button type="warning" bindtap="btnHandler1" data-step="{{ 1 }}">
numA + 1
van-button>
<van-button type="primary" bindtap="btnHandler1" data-step="{{ -1 }}">
numA -1
van-button>
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Component({
// 通过 storeBindingsBehavior 来实现自动绑定
behaviors: [storeBindingsBehavior],
storeBindings: {
store, // 指定要绑定的 Store
// 指定要绑定的字段数据
fields: {
numA: () => store.numA, // 绑定字段的第 1 种方式
numB: (store) => store.numB, // 绑定数据的第 2 个方式
sum: 'sum' // 绑定数据的第 3 个方式
},
// 指定要绑定的方法
actions: {
updateNumA: 'updateNumA'
}
},
/**
* 组件的方法列表
*/
methods: {
btnHandler1 (e) {
this.updateNumA(e.target.dataset.step)
}
}
})
什么是分包
分包指的是把一个 完整的小程序项目
,按照需求划分为不同的子包
,在构建时打包成不同的分包,用户在使用时按需进行加载
分包的好处
分包前项目的构成
分包前,小程序项目中 所有的页面
和 资源
都被打包到了一起,导致整个项目体积过大
,影响小程序首次启动的下载时间
分包后项目的构成
1 个主包
+ 多个分包
组成:
主包
:一般只包含项目的启动页面
或 TabBar 页面
、以及所有分包都需要用到的一些公共资源
分包
:只包含和当前分包有关的页面和私有资源主包并启动主包内页面
客户端会把对应分包下载下来
,下载完成后再进行展示
app.json
的 subpackages
节点中声明分包的结构{
"pages": [
"pages/home/home",
"pages/message/message",
"pages/contact/contact",
"pages/shoplist/shoplist"
],
"subPackages": [
{
"root": "pkgA",
"pages": [
"pages/cat/cat",
"pages/dog/dog"
]
},
{
"root": "pkgB",
"pages": [
"pages/apple/apple"
]
}
]
"sitemapLocation": "sitemap.json"
}
name
属性即可设置别名微信开发者工具 --> 基本信息 --> 本地代码
中就可以查看分包的体积{
"pages": [
"pages/home/home",
"pages/message/message",
"pages/contact/contact",
"pages/shoplist/shoplist"
],
"subPackages": [
{
"root": "pkgA",
"name": "A",
"pages": [
"pages/cat/cat",
"pages/dog/dog"
]
},
{
"root": "pkgB",
"name": "B",
"pages": [
"pages/apple/apple"
]
}
]
"sitemapLocation": "sitemap.json"
}
subpackages
的配置进行分包, subpackages
之外的目录将被打包到主包中pages
(即最外层的 pages
字段)tabBar
页面必须在主包内是否依赖于主包才能运行
subpackages
数组中,是否配置了independent
这个属性
相互隔绝
的,不能相互引用彼此的资源
!例如:
无法引用
独立分包内的私有资源不能相互引用
私有资源不能相互引用
私有资源特别注意:
独立分包中不能引用主包内的公共资源由框架自动预下载可能需要的分包
,从而提升进入后续分包页面时的启动速度app.json
中,使用 preloadRule
节点定义分包的预下载规则// 分包预下载的规则
"preloadRule": {
// 触发分包预下载的页面路径
"pages/contact/contact": {
// network 表示在指定的网络模式下进行预下载
// 可选值有: all(不限网络)和wifi(仅 wifi 模式下进行预下载)
// 默认值为: wifi
"network": "all",
// packages 表示进入页面后, 预下载哪些分包
// 可以通过root 或name 指定预下载哪些分包
"packages": [
"pkgA"
]
}
}
2M