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


Posted in Javascript onMay 22, 2019

"离线包"机制

微信小程序采用的是类似离线包加载方案,以转转小程序为例,当用户第一次打开时会先下载好所有代码,然后再加载页面;当用户再次进入转转小程序时,会直接使用已下载的代码,省去了代码下载的过程,打开速度更快。

看似很美好的设计,但有两个问题:

  • 第一次打开转转小程序时白屏时间很长,因为要下载接近2.5M的代码量,也就是说你的代码越多,白屏时间越长,而转转APP采用的网页离线机制体验更佳:在用户打开APP时就下载/更新离线包,这样在用户进入对应的网页时,代码已经下载好了,没有漫长的白屏过程。
  • 代码有部分更新时,没办法进行增量更新,导致每次发版后,用户都需要重新下载全部代码

问题看似不大,但对转转有很大影响,例如进行微信广告投放时,用户从点击广告到加载第一个页面之间的流失率竟能到达40%,这显然是FE无法接受的性能,而小程序分包加载机制能够在一定程度上解决上述问题。

分包加载

小程序的分包加载机制实际上是离线包和M页的一种结合机制,即你可以把代码划分成主包+N个分包,官方定义:

在小程序启动时,默认会下载主包并启动主包内页面,如果用户需要打开分包内某个页面,客户端会把对应分包下载下来,下载完成后再进行展示。

总结如下:

  • 打开小程序,默认先加载主包
  • 进入分包页面时,再加载对应分包

特性

  • 1.7.3 及以上基础库开始支持,不支持的版本默认使用整包的方式
  • 整个小程序所有分包大小不超过 4M,单个分包/主包大小不能超过 2M
  • 分包数量目前没有限制,也就是说你可以放N个分包,甚至每个页面一个分包
  • 入口页面/TAB页面必须在主包里

关于主包

  • 第一次进入小程序,默认下载主包代码
  • 分包以外的所有代码,都会被打入主包
  • 分包内代码可以引用主包内代码

关于分包

  • 因为存在资源依赖关系,微信的机制是先下载主包,后下载分包
  • 分包目录不能在主包目录下面
  • 分包可以引用自己包内、主包内的资源,不能引用其他分包内的资源

这样的好处是进入主包页面时,需要下载的代码量小了很多,白屏时间更短,体验更佳。

在小程序开发的过程中,小程序的体积会随着版本的迭代变的越来越大,这时候我们就希望能够将小程序分成多个包从服务器下载,这样既可以加快首屏的渲染也便于后续按需加载的实现。小程序在微信客户端 6.6.0,基础库 1.7.3 及以上版本开始支持 分包功能。

在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。
在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。

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

配置方法

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

配置例子

{
 "pages": ["pages/index", "pages/shopcart"],
 "subpackages": [
  {
   "root": "packageA",
   "pages": ["pages/mine", "pages/order"]
  },
  {
   "root": "packageB",
   "name": "pack2",
   "pages": ["pages/detail", "pages/pay"]
  }
 ]
}
├── app.js
├── app.json
├── app.wxss
├── packageA
│  └── pages
│    ├── mine
│    └── order
├── packageB
│  └── pages
│    ├── pay
│    └── detail
├── pages
│  ├── index
│  └── shopcart
└── utils

打包原则

  • 声明 subpackages 后,将按 subpackages 配置路径进行打包,subpackages 配置路径外的目录将被打包到 app(主包) 中
  • app(主包)也可以有自己的 pages(即最外层的 pages 字段)
  • subpackage 的根目录不能是另外一个 subpackage 内的子目录
  • tabBar 页面必须在 app(主包)内

引用原则

  • packageA 无法 require packageB JS 文件,但可以 require app、自己 package 内的 JS 文件
  • packageA 无法 import packageB 的 template,但可以 require app、自己 package 内的 template
  • packageA 无法使用 packageB 的资源,但可以使用 app、自己 package 内的资源

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
Dec 27 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
vue.js+Echarts开发图表放大缩小功能实例
Jun 09 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 Javascript
vue router 跳转时打开新页面的示例方法
Jul 28 Javascript
vue接口请求加密实例
Aug 11 Javascript
原生js实现trigger方法示例代码
May 22 #Javascript
koa router 多文件引入的方法示例
May 22 #Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 #Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 #Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 #Javascript
vue项目中mock.js的使用及基本用法
May 22 #Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 #Javascript
You might like
用php实现选择排序的解决方法
2013/05/04 PHP
destoon常用的安全设置概述
2014/06/21 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
Dom操作之兼容技巧分享
2011/09/20 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
JS实现分页导航效果
2020/02/19 Javascript
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
python语言使用技巧分享
2016/05/31 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
高中英语教学反思
2014/02/04 职场文书
我的祖国演讲稿
2014/05/04 职场文书
防灾减灾标语
2014/10/07 职场文书
飞越疯人院观后感
2015/06/09 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书