npm包_全局數據共享和分包
- 1. 使用npm包
- 1.1 Vant Weapp
- 1.2 API Promise化
- 2. 全局數據共享
- 3. 分包
- 3.1 分包的加載規則
- 3.2 分包的體積限制
- 3.3 使用分包
- 3.3 獨立分包
- 3.4 分包預下載
1. 使用npm包
小程序對npm進行了支持與限制,限制如下:
- 不支持依賴于 Node.js 內置庫的包
- 不支持依賴與 瀏覽器內置對象的包
- 不支持依賴與 C++插件的包
1.1 Vant Weapp
? Vant Weapp 是有贊前端團隊開源的一條小程序 UI 組件庫,官方文檔,它使用MIT開源許可協議。
安裝 Vant 組件庫
-
通過 npm 安裝
-
在當前項目路徑的命令行中輸入:
# 通過 npm 安裝 npm i @vant/weapp -S --production
-
-
構建 npm 包
-
修改 app.json
-
將 app.json 中的
"style": "v2"
去除,小程序的新版基礎組件強行加上了許多樣式,難以覆蓋,不關閉將造成部分組件樣式混亂。 -
在 app.json的 usingComponents節點中引入需要的組件
//例 引入按鈕組件 "usingComponents": {"van-button": "@vant/weapp/button/index" }
<!-- wxml 結構 --> <van-button type="primary">主要按鈕</van-button>
-
定制全局主題樣式:? Vant Weapp 使用 CSS變量來實現定制主題。? [所有可用的顏色變量](https://github.com/youzan/vant-weapp/blob/dev/packages/common/style/var.less)- 在 app.wxss 中,寫入 CSS 變量 ,對全局生效: ?```css
page{--button-danger-background-color: #C00000;--button-danger-border-color: #D60000;--button-primary-background-color: #001dc0;--button-primary-border-color: #D60000;
}
1.2 API Promise化
? API Promise化:指的是通過額外的配置,將官方提供的、基于回調函數的異步API,升級改造為基于Promise 的異步 API,從而提高代碼的可讀性、維護性,避免回調地獄的問題。
-
實現 API Promise:在小程序中,實現API Promise化主要依賴與 miniprogram-api-Promise這個第三方 npm 包。
-
安裝:
npm install --save miniprogram-api-Promise
-
在小程序入口文件中 app.js,只需要調用一次 promisifyAll() 方法
//引入 promisifyAll 方法,用于將小程序的API轉換為支持 Promise的形式 import {promisifyAll} from 'miniprogram-api-promise'//創建一個對象 wx.p,并賦值給常量 wxp const wxp = wx.p = {}//使用 promisifyAll方法將 wx(微信小程序原生API)中的所有方法轉換為同時支持回調和 Promise的形式 promisifyAll(wx,wxp)
-
-
調用 Promise化之后的異步 API
<!-- .wxml頁面 --> <van-button type="primary" bind:tap="getInfo">按鈕</van-button>
// 定義一個異步函數 getInfo async getInfo(){//使用 wx,p,request,通過 promisifyAll 轉換后支持 async/await的版本const {data: res} = await wx.p.request({method: 'GET',url: 'https://applet-base-api-t.itheima.net/api/get',data: {name: 'zs',age: 20}})console.log(res)}
2. 全局數據共享
? 全局數據共享(又稱:狀態管理):是為了解決組件之間數據共享的問題。開發中常用的全局數據共享方案有:Vuex、ReduX、MobX等。
-
小程序中的全局數據共享方案:小程序中,可使用 mobx-miniprogram 配合 mobx-miniprogram-bindings 實現全局數據共享。
- mobx-miniprogram 用來創建 Store 實例對象
- mobx-miniprogram-bindings用來把 Store 中的共享數據或方法,綁定到組件或頁面中使用
-
MobX
-
安裝 MobX相關包
npm install --save mobx-miniprogram mobx-miniprogram-bindings
//專門創建 Store 的實例對象 import {observable, action} from 'mobx-miniprogram'//export 是 JavaScript(包括微信小程序開發中)用于導出模塊內容的關鍵字,它的作用是將變量、函數、對象等從一個文件中“暴露出去”,以便其他文件可以通過 import 來引入和使用。 export const store = observable({//數據字段numA: 1,numB: 2,activeTabBarIndex: 0,//計算屬性get sum(){return this.numA +this.numB},//action 函數,專門來修改 store 中數據的值updateNum1: action(function(step){this.numA += step}),updateNum2: action(function(step){this.numB += step})})
-
-
將Store中的成員綁定到頁面中
// 頁面 .js 文件// 從 mobx-miniprogram-bindings 導入 createStoreBindings // 這個工具用于將 MobX Store 和小程序頁面進行綁定 import { createStoreBindings } from 'mobx-miniprogram-bindings'// 從 store.js 中導入之前創建的全局 store 實例 import { store } from '../../store/store'Page({/*** 生命周期函數 -- 頁面加載時觸發*/onLoad: function (options) {// 創建 Store 綁定對象// 將 store 中的數據和方法綁定到當前頁面(this),實現響應式更新this.storeBindings = createStoreBindings(this, {store, // 使用的 store 實例fields: ['numA', 'numB', 'sum'], // 需要綁定的響應式字段actions: ['updateNum1'] // 需要綁定的 action 方法})},/*** 生命周期函數 -- 頁面卸載時觸發(頁面關閉或跳轉)*/onUnload: function () {// 銷毀 Store 綁定,防止內存泄漏this.storeBindings.destroyStoreBindings()} })
-
在頁面上使用 Store 中的成員
<!-- .wxml --> <view>{{numA}} + {{numB}} = {{sum}}</view> <van-button type="primary" bind:tap="btnHandler1" data-step="{{1}}">numA +1</van-button> <van-button type="danger" bind:tap="btnHandler1" data-step="{{-1}}">numA -1</van-button>
btnHandler1(e){// console.log(e)this.updateNum1(e.target.dataset.step)}
-
將Store 中的成員綁定到組件中
import {storeBindingsBehavior} from 'mobx-miniprogram-bindings' import {store} from '../../store/store'Component({behaviors:[storeBindingsBehavior],storeBindings: {//數據源store,fields: { //指定要綁定的數據numA: ()=>store.numA,//綁定字段的第1種方法numB: (store) => store.numB,//綁定字段的第2種方法sum: 'sum'//綁定字段的第3種方法},actions: {//指定要綁定的方法updateNum2: 'updateNum2'}} })
-
在組件中使用 Store 中的成員
<view>{{numA}} + {{numB}} = {{sum}}</view> <van-button type="primary" bind:tap="btnHandler2" data-step="{{1}}">numB +1</van-button> <van-button type="danger" bind:tap="btnHandler2" data-step="{{-1}}">numB -1</van-button>
/*** 組件的方法列表*/methods: {btnHandler2(e){this.updateNum2(e.target.dataset.step)}}
3. 分包
? 分包指的是把一個完整的小程序項目,按照需求分為不同的子包,在構建時打包成不同的分包,用戶在使用時按需進行加載。
- 可以優化小程序首次啟動的下載時間
- 在多團隊共同開發時可以更好的解耦合協作
? 分包前,小程序項目中所有的頁面和資源都被打包到了一起,導致整個項目體積過大,影響小程序首次啟動的下載時間。
分包后項目的構成,小程序項目由1個主包 + 多個分包組成:
- 主包:一般只包含項目的啟動頁面或TabBar頁面、以及所有分包都需要用到的一些公共資源
- 分包:只包含和當前分包有關的頁面和私有資源
3.1 分包的加載規則
- 在小程序啟動時,默認會下載主包并啟動主包頁面
- TabBar頁面需要放到主包中
- 當用戶進入分包內某個頁面時,客戶端會把對應分包下載下來,下載完成后再進行展示
- 非TabBar頁面可以按照功能的不同,劃分不同的分包之后,進行按需下載
3.2 分包的體積限制
- 整個小程序所有分包大小不超過 16M(主包+所有分包)
- 單個分包/主包大小不能超過 2M
3.3 使用分包
配置方法
|———— app.js
|———— app.json
|———— app.wxss
|———— pages //主包的所有頁面
| |———— index
| |____ logs
|———— packageA //第一個分包
| |____ pages
| |---- cat
| |____ dog
|———— packageB //第二個分包
| |____ pages
| |---- apple
| |____ banana
|____ utils
//在 app.json 的 subpackages 節點中聲明分包的結構
{"pages": ["pages/home/home", "pages/message/message","pages/contact/contact"],"subPackages": [{"root": "pkgA","name": "p1","pages": ["pages/cat/cat","pages/dog/dog"]},{"root": "pkgB","name": "p2","pages": ["pages/apple/apple"]}]
}
打包原則:
- 小程序會按 subpackages 的配置進行分包,subpackages 之外的目錄將被打包到主包中
- 主包也可以有自己的pages(即最外層的 pages 字段)
- tabBar 頁面必須在主包內
- 分包之間不能相互嵌套
引用原則:
- 主包無法引用分包內的私有資源
- 分包之間不能相互引用私有資源
- 分包可以引用主包內的公共資源
3.3 獨立分包
? 獨立分包本質上也是分包,但可以獨立于主包和其它分包而單獨運行。
獨立分包和普通分包的區別
- 普通分包必須依賴于主包才能運行
- 獨立分包可以在不下載主包的情況下,獨立運行
獨立分包的配置方法:設置 independent 為true
{"pages": ["pages/home/home", "pages/message/message","pages/contact/contact"],"subPackages": [{"root": "pkgB","name": "p2","pages": ["pages/apple/apple"],"independent": true //通過此節點,聲明當前 moduleB 分包為 "獨立分包"}]
}
引用規則:
- 主包無法引用獨立分包的私有資源
- 獨立分包之間,不能相互引用私有資源
- 獨立分包和普通分包之間,不能相互引用私有資源
3.4 分包預下載
? 分包預下載:在進入小程序的某個頁面時,由框架自動預下載可能需要的分包,從而提升后續分包頁面時的啟動速度。
? 預下載分包的行為,會在進入指定的頁面時觸發。在app.json中,使用 preloadRule節點定義分包的預下載規則:
"preloadRule": {"pages/contact/contact": { //觸發分包預下載的頁面路徑"packages": ["p1"], //通過 root或 name指定預下載哪些分包"network": "wifi" //指定網絡模式下進行預下載,默認值:wifi,可選值為:all(不限網絡)和 wifi(僅 wifi模式下進行預下載)}}
? 同一個分包中的頁面享有共同的預下載大小限額 2M