05_基础加强(2)
使用 npm 包
小程序对 npm 的支持与限制
目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用 npm 包有如下 3 个限制:
- 不支持依赖于 Node.js 内置库的包
- 不支持依赖于浏览器内置对象的包
- 不支持依赖于 C++ 插件的包
总结:虽然 npm 上的包有千千万,但是能供小程序使用的包却“为数不多”。
Vant Weapp
1. 什么是 Vant Weapp
Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库,助力开发者快速搭建小程序应用。它所使用的是 MIT 开源许可协议,对商业使用比较友好。
官方文档地址 https://youzan.github.io/vant-weapp
扫描下方的小程序二维码,体验组件库示例:

2. 安装 Vant 组件库
这里我跟视频里以及官网不一样,可能是因为vant和微信开发者工具的版本原因,按照我这样做就可以使用vant组件库
刚构建一个新的小程序项目长这个样子:

步骤一:
在项目根目录右键,点击打开终端

步骤二:
终端中输入命令 npm i @vant/weapp -S --production,如果直接输入这条指令则安装的是最新的vant组件,想要安装特定版本的组件库,则输入类似指令 npm i @vant/weapp@1.3.1 -S --production,下面都是以最新版的演示,过去的版本哪里不一样我也没探究过。

安装完以后,项目架构变成这样了

这些都是多出来的
每个想要开发的项目都要在项目的根目录下执行这样一条命令,安装一份
步骤三:
构建npm包,点击开发工具顶部的工具按钮,选择构建npm

构建完毕后项目目录变成这样

圈出来的就是多出来的东西。
步骤四
步骤三完成以后,官网说要在 详情 -> 本地设置 那里勾选 使用npm模块。可能是微信开发工具更新的远古,现在已经看不到了,可能默认就是这个,这个不管了。
接下来就是在全局配置文件 app.json 文件中 配置使用vant组件
vant组件还是自定义组件,跟自定义组件一个用法,不过这是别人搞出来的整套的东西,好用一些。首先要将全局配置文件 app.json 文件中的 "style": "v2", 去掉,这是微信小程序新增加的样式,可能对我们使用vant组件产生影响。
然后添加如下内容,
"usingComponents": {
"vant-button":"@vant/weapp/button/index"
}

步骤五:
组件使用

4. 定制全局主题样式
Vant Weapp 使用 CSS 变量来实现定制主题。 关于 CSS 变量的基本用法,请参考 MDN 文档:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties
下面我用自己的话来说一下,什么是CSS变量,所谓CSS变量,当然就是CSS的变量啊,哈哈,你可以将它跟编程语言中的变量进行类比。
假设有一个变量 money 表示一个整个公司的所有员工的工资,假设所有员工的工资都是一样的,现在money是1000,那么所有人的工资就是1000。
某一天老板想给全体员工涨钱200,那将这个money修改为1200就行了。
问题升级,一家公司分为不同的部门,不同的部门的钱肯定不一样,A部门的工资我们用 A_money, B部门的工资我们用 B_money表示,老板想给哪个部门涨钱,修改对应的部门 money就行。
现在假设我们有一个大型网站,这个大型网站规定,所有的按钮必须是绿色的,怎么办?网站上的按钮加起来有几万个,怎么修改?我们用全局搜索 green ,那要是有的文本字体也是绿色的呢?也就是说,你直接全局搜索green,会出现很多种green,他们可以是各种组件的green,不单单是按钮的,这个方式肯定不行。
假如我有一个变量 button-bg 的值就是绿色,那么所有按钮直接引用这个button-bg就行了,他们依然是绿色,某一天,需求变成蓝色的,只需要修改 button-bg的值为蓝色,是不是所有的按钮就都是蓝色的。
再假如主页的按钮必须是蓝色,用户家目录的按钮必须是黄色的,因此需要定义两个变量,一个是 button-index-bg,一个是 button-home-bg。是不是就很灵性。
总结,CSS变量就是将一些CSS值设定为变量,方便管理,并且更人性化更好读。
现在的问题是,Vant的组件设计的不错,但是某些组件的底色,或者说文本字体我不满意,我又不能不用这个组件吧。那么怎么办呢?vant的组件的这些CSS元素都是使用的变量,我们只要在项目里修改这个变量的值,对原变量的值进行覆盖,是不是就完成了自己的定制?
vant按钮的type为peimary的时候,按钮颜色为绿色,现在我们把他改成紫色。
步骤如下:
步骤一:
去vant官网查对应的CSS变量名,官网https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties

官网把这些CSS变量名都分门别类放好了。按需查找即可

button-primary-background-color就是button按钮 type为primary的CSS变量值
步骤二:
在app.wxss中重新定义该变量值,完成覆盖
page {
--button-primary-background-color: #cc33cc
}

刚一修改完就变色了,这个page是作用域,整个微信小程序,所有页面的最外层都是page标签

这个作用域也可以是一个类选择器,如果作用域是类选择器,那么新修改的CSS变量只有在类选择器的标签中会完成替换。
API Promise化
1. 基于回调函数的异步 API 的缺点
默认情况下,小程序官方提供的异步 API 都是基于回调函数实现的,例如,网络请求的 API 需要按照如下的方式调用:
wx.request({
url: 'url',
method: '',
data: {},
success: () => { },
fail: () => { },
complete: () => { },
})
缺点:容易造成回调地狱的问题,代码的可读性、维护性差!
说起回调地狱 首先想到的是异步 在js中我们经常会大量使用异步回调,例如使用ajax请求
我们来看下面这段代码:
function a(functionb(){
c(function d(){
})
})
我们发现上面代码大量使用了回调函数(将一个函数作为参数传递给另个函数)并且有许多 })结尾的符号,使得代码看起来很混乱。
2. 什么是 API Promise 化
API Promise化,指的是通过额外的配置,将官方提供的、基于回调函数的异步 API,升级改造为基于 Promise 的异步 API,从而提高代码的可读性、维护性,避免回调地狱的问题。
3. 实现 API Promise 化
在小程序中,实现 API Promise 化主要依赖于 miniprogram-api-promise 这个第三方的 npm 包。它的安装和使用步骤如下:
第一步:安装
npm install --save miniprogram-api-promise@1.0.4
记住,在小程序里面安装了新的包以后不能立马使用,在这里我们需要先删除miniprogram_npm文件夹,然后重新构建npm
第二步:promise化
//在小程序入口文件(app.js),只需要调用一次 promisifyAll() 方法,
// 即可实现异步 API 的Promise 化
import { promisifyAll } from 'miniprogram-api-promise'
const wxp=wx.p={}
promisifyAll(wx,wxp)
4. 调用 Promise 化之后的异步 API
<vant-button type="primary" bindtap="getInfo">vant按钮</vant-button>
async getInfo() {
const { data: res } = await wx.p.request({
url: 'https://www.escook.cn/api/get',
method: 'GET',
data: { name: 'zs', age: 20 }
})
console.log(res);
},
全局数据共享
**1. 什么是全局数据共享
全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。
开发中常用的全局数据共享方案有:Vuex、Redux、MobX 等。

2. 小程序中的全局数据共享方案
在小程序中,可使用 mobx-miniprogram 配合 mobx-miniprogram-bindings 实现全局数据共享。其中:
- mobx-miniprogram 用来创建 Store 实例对象
- mobx-miniprogram-bindings 用来把 Store 中的共享数据或方法,绑定到组件或页面中使用

MobX
1. 安装 MobX 相关的包
在项目中运行如下的命令,安装 MobX 相关的包:
npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
注意:MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm。
2. 创建 MobX 的 Store 实例
在根目录下创建store文件夹,用来存放所有的store实例

编辑store.js
import { action, observable } from 'mobx-miniprogram'
export const store = observable({
numA: 1,
numB: 2,
get sum() {
return this.numA + this.numB
},
updateNum1: action(function (step) {
this.numA += step
}),
updateNum2: action(function (step) {
this.numB += step
}),
})
从 mobx-miniprogram 导入了 action, observable 其中observable用来构建共享数据对象,action用来操作共享数据对象内部的数据,这一块我暂时没搞明白为什么不能直接操作。其中get表示这个数据只能通过计算获得,不能直接设置。
3. 将 Store 中的成员绑定到页面中
import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Page({
onLoad: function (options) { //生命周期函数--监听页面加载
// createStoreBindings会把当前的page对象封装,然后就可以直接使用共享的数据了
this.stroreBindings = createStoreBindings(this, {
store,
fields: ['numA', 'numB', 'sum'],//需要导入哪些数据
actions: ['updateNum1', 'updateNum2']//需要导入哪些方法
})
},
onUnload: function () { //生命周期函数--监听页面卸载
this.storeBindings.destroyStoreBindings()
}
})
4. 在页面上使用 Store 中的成员
//页面的 .wxml 结构
<view>{{numA}} + {{numB}} = {{sum}}</view>
<vant-button type="primary" bindtap="btnHandler1" data-step="{{1}}">numA + 1</vant-button>
<vant-button type="danger" bindtap="btnHandler1" data-step="{{-1}}">numA - 1</vant-button>
// 按钮tap事件的处理函数
btnHandler1(e) {
this.updateNum1(e.target.dataset.step)
},
页面的js文件引入了全局共享数据后,就可以像使用自己的数据一样使用这些共享数据
5. 将 Store 中的成员绑定到组件中
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Component({
behaviors: [storeBindingsBehavior],
storeBindings: {
store,
fields: {
numA: 'numA', numB: 'numB', sum: 'sum'
},
actions: {
updateNum2: 'updateNum2'
}
},
// 在自己的触发函数里调用共享数据对象的方法
methods: {
btnHandler2(e) {
this.updateNum2(e.target.dataset.step)
}
}
})
6. 在组件中使用 Store 中的成员
//组件的 .wxml结构
<view>{{numA}} + {{numB}} = {{sum}}</view>
<vant-button type="primary" bindtap="btnHandler2" data-step="{{1}}">numB + 1</vant-button>
<vant-button type="danger" bindtap="btnHandler2" data-step="{{-1}}">numB - 1</vant-button>
分包
基础概念
1. 什么是分包
分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。
2. 分包的好处
对小程序进行分包的好处主要有以下两点:
- 可以优化小程序首次启动的下载时间
- 在多团队共同开发时可以更好的解耦协作
3. 分包前项目的构成
分包前,小程序项目中所有的页面和资源都被打包到了一起,导致整个项目体积过大,影响小程序首次启动的下载时间。

4. 分包后项目的构成
分包后,小程序项目由 1 个主包 + 多个分包组成:
- 主包:一般只包含项目的启动页面或 TabBar 页面、以及所有分包都需要用到的一些公共资源
- 分包:只包含和当前分包有关的页面和私有资源

5. 分包的加载规则
- 在小程序启动时,默认会下载主包并启动主包内页面
- tabBar 页面需要放到主包中
- 当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示
- 非 tabBar 页面可以按照功能的不同,划分为不同的分包之后,进行按需下载
6. 分包的体积限制
目前,小程序分包的大小有以下两个限制:
- 整个小程序所有分包大小不超过 16M(主包 + 所有分包)
- 单个分包/主包大小不能超过 2M
使用分包
1. 配置方法

2. 打包原则
- 小程序会按 subpackages 的配置进行分包,subpackages 之外的目录将被打包到主包中
- 主包也可以有自己的 pages(即最外层的 pages 字段)
- tabBar 页面必须在主包内
- 分包之间不能互相嵌套
3. 引用原则
- 主包无法引用分包内的私有资源
- 分包之间不能相互引用私有资源
- 分包可以引用主包内的公共资源

独立分包
1. 什么是独立分包
独立分包本质上也是分包,只不过它比较特殊,可以独立于主包和其他分包而单独运行。

2. 独立分包和普通分包的区别
最主要的区别:是否依赖于主包才能运行
- 普通分包必须依赖于主包才能运行
- 独立分包可以在不下载主包的情况下,独立运行
3. 独立分包的应用场景
开发者可以按需,将某些具有一定功能独立性的页面配置到独立分包中。原因如下:
- 当小程序从普通的分包页面启动时,需要首先下载主包
- 而独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度
注意:一个小程序中可以有多个独立分包。
4. 独立分包的配置方法

5. 引用原则
独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源!例如:
- 主包无法引用独立分包内的私有资源
- 独立分包之间,不能相互引用私有资源
- 独立分包和普通分包之间,不能相互引用私有资源
- 特别注意:独立分包中不能引用主包内的公共资源
分包预下载
1. 什么是分包预下载
分包预下载指的是:在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度。
2. 配置分包的预下载
预下载分包的行为,会在进入指定的页面时触发。在 app.json 中,使用 preloadRule 节点定义分包的预下载规则,示例代码如下:
{
"preloadRule": { //分包预下载的规划
"pages/contact/contact":{ //触发分包与下载的页面路径
//network 表示在指定的网络模式下进行预下载
// 可选值为:all(不限网络) 和 wifi(仅WiFi模式下进行预下载)
// 默认值是wifi
"network": "all",
// packages表示进入页面后预下载哪些分包,可以通过root或name指定预下载哪些分包
"packages": ["pkgA"]
}
}
}
3. 分包预下载的限制
同一个分包中的页面享有共同的预下载大小限额 2M,例如:


浙公网安备 33010602011771号