微信小程序全局数据共享和分包图文详解

目录
  • 引言
  • 全局数据共享
    • 安装 MobX 相关的包
    • 创建Store实例
    • 将 Store 中的成员绑定到页面中
    • 在页面使用 Store 中的成员
    • 将 Store 成员绑定到组件中
    • 在组件中使用 Store 中的成员
  • 分包
    • 分包的项目构成:
    • 分包的加载规则:
    • 分包的体积限制:
    • 创建分包
    • 打包原则
    • 分包的引用原则
    • 独立分包
    • 独立分包的引用原则
    • 分包预下载
  • 总结

引言

经过web前端开发的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了微信小程序专栏,主要想从移动端开发方向进一步发展,而对于我来说写移动端博文的第一站就是小程序开发,希望看到我文章的朋友能对你有所帮助。

全局数据共享

全局数据共享(状态管理)是为了解决组件之间数据共享的问题,开发中常用的全局数据共享方案有:Vuex、Redux、MobX等。

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

安装 MobX 相关的包

在项目中运行如下命令,安装 MobX相关的包:(注意要启用管理员权限) 安装完成重新构建 npm

npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1

创建Store实例

// 创建store文件夹下的store.js文件,在这个 JS 文件中,专门来创建 Store 的实例对象
import {observable,action} from 'mobx-miniprogram'

export const store = observable({
  // 数据字段
  numA:1,
  numB:2,
  // 计算属性
  get sum(){
    return this.numA + this.numB
  },
  // actions 函数,专门来修改 store 中数据的值
  updateNum1:action(function(step){
    this.numA += step
  }),
  updateNum2:action(function(step){
    this.numB += step
  }),
})

将 Store 中的成员绑定到页面中

// 路径需要相对路径,不然会报错
import {createStoreBindings} from '../../miniprogram/miniprogram_npm/mobx-miniprogram-bindings/index'
import {store} from '../../store/store'
Page({
  //生命周期函数--监听页面加载
  onLoad(options) {
    this.storeBindings = createStoreBindings(this,{
      store,
      fields:['numA','numB','sum'],
      actions:['updateNum1']
    })
  },
  //生命周期函数--监听页面卸载
  onUnload() {
    this.storeBindings.detroyStoreBindings()
  },
})

在页面使用 Store 中的成员

// .wxml文件
<view>{{numA}}+{{numB}}={{sum}}</view>
<van-button type="primary" bindtap="btnHander1" data-step="{{1}}">numA+1</van-button>
<van-button type="danger" bindtap="btnHander1" data-step="{{-1}}">numB-1</van-button>
// .js文件
// pages/message/message.js
import {createStoreBindings} from '../../miniprogram/miniprogram_npm/mobx-miniprogram-bindings/index'
import {store} from '../../store/store'

Page({
  //生命周期函数--监听页面加载
  onLoad(options) {
    this.storeBindings = createStoreBindings(this,{
      store,
      fields:['numA','numB','sum'],
      actions:['updateNum1']
    })
  },
  //绑定按钮点击事件
  btnHander1(e){
    // console.log(e);
    this.updateNum1(e.target.dataset.step)
  },
  //生命周期函数--监听页面卸载
  onUnload() {
    this.storeBindings.detroyStoreBindings()
  },
})

将 Store 成员绑定到组件中

import {storeBindingsBehavior} from '../../miniprogram/miniprogram_npm/mobx-miniprogram-bindings/index'
import {store} from '../../store/store'

Page({
  behaviors:[storeBindingsBehavior],
  storeBindings:{
    // 数据源
    store, //指定要绑定的store
    fields:{//指定要绑定的字段数据
      numA:()=>store.numA,     //绑定字段的第一种方式
      numB:(store)=>store.numB,//绑定字段的第二种方式
      sum:'sum',               //绑定字段的第三种方式
    },
    actions:{ //指定要绑定的方法
      updateNum2:'updateNum2'
    }
  },
})

在组件中使用 Store 中的成员

//组件的 .wxml结构
<view>{{numA}}+{{numB}}={{sum}}</view>
<van-button type="primary" bindtap="btnHander2" data-step="{{1}}">numB+1</van-button>
<van-button type="danger" bindtap="btnHander2" data-step="{{-1}}">numB-1</van-button>

//组件的 .js结构
methods: {
  btnHander2(e){
    this.updateNum2(e.target.dataset.step)
  }
}

分包

分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载

分包的好处:可以优化小程序首次启动的下载时间;在多团队共同开发时可以更好的解耦协作

分包的项目构成:

分包前

小程序项目中的所有的页面资源都被打包到一起,导致整个项目的体积过大,影响小程序首次启动的下载时间

分包后

分包后,小程序项目由 一个主包 + 多个分包组成:

主包:一般只包含项目的 启动页面TabBar 页面、以及所有分包都需要用到的一些公共资源。

分包:只包含和当前分包有关的页面和私有资源。

分包的加载规则:

在小程序启动时,默认会下载主包启动主包内页面

tabBar页面需要放到主包中

当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后在进行展示:

非tabBar页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

分包的体积限制:

目前,小程序分包的大小有以下两种限制:

整个小程序所有分包大小不超过16M(主包+所有分包)

单个分包/主包大小不能超过2M

创建分包

创建分包很简单,只需要在app.json文件下,通过 subpackages 进行分包创建,创建之后保存文件,分包的文件就会自动出现在目录中。

{
  "pages":[ //主包的所有界面
    "pages/home/home",
    "pages/message/message",
    "pages/contact/contact",
    "pages/index/index",
    "pages/logs/logs"
  ],
  "subpackages":[ //通过subpackages节点,声明分包的结构
    {
      "root": "package", //第一个分包的根目录
      "name": "p1"//给分包起个别名用来区分分包
      "pages": [//当前分包下,所有页面的相对存放路径
        "pages/demoA/demoA",
        "pages/demoB/demoB"
      ]
    },
    {
      "root": "package2", //第二个分包的根目录
      "name": "p2"//给分包起个别名用来区分分包
      "pages": [//当前分包下,所有页面的相对存放路径
        "pages/demoC/demoC",
        "pages/demoD/demoD"
      ]
    }
  ],
}

当我们想1知道分包的体积是多少可以通过以下方式查看:

打包原则

小程序会按 subpackages 的配置进行打包,subpackages之外的目录将被打包到主包中

主包也可以有自己的 pages(即最外层的 pages 字段)

tabBar 页面必须在主包内

分包之间不能相互嵌套

分包的引用原则

主包无法引用分包内的私有资源

分包之间不能相互引用私有资源

分包可以引用主包内的公共资源

独立分包

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

独立分包和普通分包区别

普通分包必须依赖于主包才能运行

独立分包可以在不下载主包的情况下,独立运行

开发者将某些具有一定功能独立性的页面配置到独立分包中的原因

当小程序从普通的分包页面启动时,需要首先下载主包

而独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度。

注意:一个小程序可以有多个独立的分包

那么我们如何将一个普通的分包改造成独立分包呢?很简单,只需要在分包中添加如下命令即可。

"subpackages":[
  {
    "root": "package",
    "pages": [
      "pages/demoA/demoA",
      "pages/demoB/demoB"
    ],
    "independent": true //通过此节点,声明当前“package”分包为“独立分包”
  }
],

独立分包的引用原则

独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源!

1、主包无法引用独立分包内的私有资源

2、独立分包之间,不能相互引用私有资源

3、独立分包和普通分包之间,不能相互引用私有资源

4、注意:独立分包中不能引用主包内的公共资源

分包预下载

在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度。

预下载分包的行为,会在进入指定的页面时触发。在app.json中,使用 preloadRule 节点定义分包的预下载规则

{
  "preloadRule":{ //分包预下载规则
      "pages/contact/contact":{ //触发分包预下载的页面路径
        //network 表示在指定的网络模式下进行预下载
        //可选值为:all(不限网络)或wifi(仅 wifi 模式下进行预下载)
        //默认值为:wifi
        "network": "all"
        //packages 表示进入页面之后,预下载哪些分包
        //可以通过 root 或 name 指定预下载哪些分包
        "packages": ["package"],
       }
  }
}

注意:同一个分包中的页面享有共同的预下载大小限额是2M。

总结

到此这篇关于微信小程序全局数据共享和分包的文章就介绍到这了,更多相关小程序全局数据共享和分包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 微信小程序使用Echarts和分包的完整步骤

    前言 假期虽然结束了,但是它以另外一种形式展示我们身上(摸摸自己的小肚子).在小程序上以图形化显示数据就是分给我的假期预研任务,查了一下网上大佬们的文章了解到了Ucharts,F2,Wx-charts和Echarts,只尝试了F2和Echarts,由于Echarts的最近更新最近和我对Echarts更为熟悉,所以我选择了Echarts,F2也试了下,虽然弄出来了,但是我不是太熟悉所以就放弃了. 进入正题 首先我是看到别人的文章写Echarts的,给了官网的传送门,然后就去官网顺着看了,比较简单,

  • 手把手教你uniapp和小程序分包(图文)

    目录 一.小程序分包 二.uniapp分包小程序 分包步骤: 1.配置manifest.json 2.配置pages.json 3.分包预载配置(preloadRule) 一.小程序分包 每个使用分包小程序必定含有一个主包.所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本:而分包则是根据开发者的配置进行划分. 在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示 目前小程序分包

  • 小程序如何使用分包加载的实现方法

    "离线包"机制 微信小程序采用的是类似离线包加载方案,以转转小程序为例,当用户第一次打开时会先下载好所有代码,然后再加载页面:当用户再次进入转转小程序时,会直接使用已下载的代码,省去了代码下载的过程,打开速度更快. 看似很美好的设计,但有两个问题: 第一次打开转转小程序时白屏时间很长,因为要下载接近2.5M的代码量,也就是说你的代码越多,白屏时间越长,而转转APP采用的网页离线机制体验更佳:在用户打开APP时就下载/更新离线包,这样在用户进入对应的网页时,代码已经下载好了,没有漫长的白

  • 微信小程序如何实现数据共享与方法共享详解

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 组件方法共享 behaviors 1. 什么是 behaviors 2. behaviors 的工作方式 3. 创建 behavior 4. 导入并使用 behavior 5. behavior 中所有可用的节点 6. 同名字段的覆盖和组合规则 总结 全局数据共享 Mobox 原生小程序开发中我们可以通过 mobx-miniprogram 配合 mobx-minipro

  • 微信小程序分包加载代码实现方法详解

    直接在 "app.json" 中贴入代码 { "pages": [ "pages/Login/xxxx", ], "subpackages":[{ // 这里就是贴入的代码 root值可以任意改 pages同上 "root":"packageA", "pages":[ "pages/Login/bbb", "pages/Login/ccc

  • 小程序使用分包的示例代码

    本文介绍了小程序使用分包的示例代码,分享给大家,具体如下: 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 总结就是小程序内所有代码图片资源大小超过2M,此时就可以考虑创建分包,扩大小程序容量 目前小程序分包大小有以下限制: 整个小程序所有分包大小不超过 12M 单个分包/主包大小不

  • 微信小程序全局数据共享和分包图文详解

    目录 引言 全局数据共享 安装 MobX 相关的包 创建Store实例 将 Store 中的成员绑定到页面中 在页面使用 Store 中的成员 将 Store 成员绑定到组件中 在组件中使用 Store 中的成员 分包 分包的项目构成: 分包的加载规则: 分包的体积限制: 创建分包 打包原则 分包的引用原则 独立分包 独立分包的引用原则 分包预下载 总结 引言 经过web前端开发的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了微信小程序专栏,主要想从移动端开发方向进一步发展,而对于我

  • 微信小程序全局配置以及页面配置详解

    目录 全局配置 全局配置文件及常用配置项 全局配置—window 小程序窗口组成部分 了解window节点常用的配置项 设置导航栏的标题 设置导航栏的背景色 设置导航栏的标题颜色 全局开启下拉刷新功能 设置下拉刷新时窗口的背景色 设置下拉刷新时loading的样式 设置上拉触底的距离 全局配置—tabbar 什么是tabbar tabbar的6个组成部分 tabbar节点的配置项 每个tab项的配置选项 页面配置 页面配置文件的作用 页面配置和全局配置的关系 页面配置中常用的配置项 小结 全局配

  • 微信小程序 获取二维码实例详解

     微信小程序 获取二维码实例详解 理论: 接口A: 适用于需要的码数量较少的业务场景 接口地址:(永久有效,数量有限,进入path对应的页面) https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN path String 不能为空,最大长度 128 字节 width Int 430(默认) 二维码的宽度 auto_color .. line_color .. 接口B:适用于需要的码数量极多,或仅临时使用的业务场景(永

  • 微信小程序数据存储与取值详解

    在小程序开发的过程,经常要需要这个页面输入的数据,在下一个页面中进行取值赋值. 比如: 在A页面input输入框,输入电话号码,点击添加.需要在B页面电话区域中,显示刚刚输入的电话号码. 因为这是两个页面,就需要先存储,再取值.微信小程序提供了数据存储的API,wx.setStorage(OBJECT) 可以将数据存储在本地缓存中指定的 key 中,如果重复会覆盖掉原来该 key 对应的内容. 思路是,在A页面,使用bindinput获取input输入的值,赋值给一个变量(自定义),点击添加按钮

  • 原生微信小程序开发中 redux 的使用详解

    前提 复杂场景中有不少数据需要在多个不同页面间来回使用和修改.但是小程序页面直接的数据通信方式十分的简单.通常情况需要自己维护一个全局的对象来存放共有数据.但是,简单的维护一个共有数据实体,会随着业务逻辑的不断复杂化而变的过分庞大,并且数据的修改往往无法很好的溯源.加之公共数据实体中数据的修改和页面的UI之间没有太好的同步手段,往往需要在页面和对应的数据实体中同时都维护一份相同的数据,操作十分的不方便. 之前使用过Taro以react+redux的结构来开发微信小程序,依托redux整体上可以解

  • 微信小程序开发图片拖拽实例详解

    微信小程序开发图片拖拽实例详解 1.编写页面结构:moveimg.wxml <view class="container"> <view class="cnt"> <image class="image-style" src="../uploads/foods.jpg" style="left:{{ballleft}}px;width:{{screenWidth}}px" bi

  • 微信小程序的日期选择器的实例详解

    微信小程序的日期选择器的实例详解 前言: 关于微信小程序中的日期选择器大家用过都会发现有个很大的问题,就是在2月的时候会有31天,没有进行对闰年的判断等各种情况.看了官方文档提供的源码后进行了一些修改,测试修复了上面所说的bug! 下面源码: <!---js---> const date = new Date();//获取系统日期 const years = [] const months = [] const days = [] const bigMonth = [1,3,5,7,8,10,

  • 微信小程序 上传头像的实例详解

    微信小程序 上传头像的实例详解 最近在做微信小程序上传头像和上传照片功能就随手写一下代码: 上传头像html: <view class="edit-list"> <text class="list-name list-first">头像</text> <view class="edit-righr-bar"> <image class="head-portrait" src

  • 微信小程序 sha1 实现密码加密实例详解

    微信小程序 sha1 实现密码加密实例详解 在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = 0; i < s.length; i++) if ((c = s.charCodeAt(i)) < 0x80) r.push(c); else if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x

  • 微信小程序之GET请求的实例详解

    微信小程序之GET请求的实例详解 学习前端的人应该都会使用ajax的get请求数据,那么在微信小程序里怎样实现get请求呢?下面我就给大家演示一下简单的get请求. 先上代码: //index.js //获取应用实例 var app = getApp() Page({ data: { motto: 'Hello World', onLoad: function () { var that = this wx.request({ url: 'http://apis.baidu.com/heweat

随机推荐