微信小程序分包加载

时间: 2018-10-22阅读: 7334标签: 小程序

开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。

 

在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必须包含一个主包,所谓的主包,即放置默认启动页/TabBar 页面,以及一些所有分包需要用到整个小程序所有分包大小不超过 8M单个分包/主包大小不能超2M。

对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更高的解耦协作。


配置方法:

假设支持分包的小程序目录结构

├── app.js
├── app.json
├── app.wxss
├── packageA
│   └── pages
│       ├── cat
│       └── dog
├── packageB
│   └── pages
│       ├── apple
│       └── banana
├── pages
│   ├── index
│   └── logs
└── utils

开发者通过在 app.json subPackages 字段声明项目分包结构:

{
  "pages":[
    "pages/index",
    "pages/logs"
  ],
  "subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ]
    }
  ]
}

subPackages 中,每个分包的配置有以下几项:

字段类型说明
rootString分包根目录
nameString分包别名,分包预下载时可以使用
pagesStringArray分包页面路径,相对与分包根目录
independentBoolean分包是否是独立分包

 

打包原则

  声明 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 内的资源


独立分包

  独立分包是小程序的一种特殊类型的分包,可以独立于主包和其他分包独立运行。从独立

  分包中页面进入小程序时,不需要下载主包,当小程序进入不同分包的时候,主包才会被下载。

  可发者可以按需将某些具有一定功能独立性的页面配置到独立分包中。当小程序从普通的

  分包页面中启动时,需要首先下载主包;而独立分包不依赖主包即可运行,可以很大程度上

  提升分包页面的启动速度, 一个小程序中可以有多个独立分包。

配置方法:

  假设小程序的目录如下;

  ├── app.js
  ├── app.json
  ├── app.wxss
  ├── moduleA
  │   └── pages
  │       ├── rabbit
  │       └── squirrel
  ├── moduleB
  │   └── pages
  │       ├── pear
  │       └── pineapple
  ├── pages
  │   ├── index
  │   └── logs
  └── utils

开发者可以通过在  app.json 的 subpackages 字段中的分包配置中自定义 independent字段声明对应分包为独立分包

  {
      "pages": [
        "pages/index",
        "pages/logs"
      ],
     "subpackages": [
        {
          "root": "moduleA",
          "pages": [
            "pages/rabbit",
            "pages/squirrel"
          ]
        }, {
          "root": "moduleA",
          "pages": [
            "pages/pear",
            "pages/pineapple"
          ],
        "independent": true
      }
    ]
  }

限制:

独立分包属于分包的一种,普通分包的所有限制独立分包有效。独立分包中插件自定义组件的处理方式同普通分包。

 

使用独立分包需要注意:

独立分包中不能依赖主包和其他分包中的内容,包括js 文件,template,wxss,自定义组件,插件等,主包的app.wxss 对独立分包无效。应避免在独立分包页面中使用 app.wxss 中的样式。

App 只能在主包中定义,独立分包中不能定义 App 会造成无法预期的行为。独立分包中暂时不支持使用插件。


注意事项:

(1) 关于 getApp()

与普通分包不同,独立分包运行时,App 并不一定被注册,因此,getApp()也不一定获得App 对象,当用户从独立分包页面启动小程序时,主包不存在,App 也不存在,此时调用getApp 获取到的是undefined 。当用户进入普通分包或者主包时,主包才会被下载, App 才会被注册。当用户从普通分包或者主包的页面挑到独立分包的时候,主包已经存在,此时调用getApp(),才能获得真正的App。

为了满足独立分包中的这一需求,基础库2.2.4  版本开始getApp 支持,allowDefault 参数,在 App 未定义的时候返回一个默认实现。当主包

加载 App 被注册的时候,默认实现中被定义的属性会被合并覆盖到默认的App 中。

示例:

const  app = getApp({allowDefault:true})  // {}
app.data = 456
app.global = {}

//.app.js  中
App({
  data:123
  other:'hello'
})
console.log(getApp())   // {global: {} ,data: 456,other: 'hello'}


(2) 关于 App 的生命周期

当从独立分包中启动小程序时,主包的中的onLanch 和首次 onShow  会从独立分包页面首次进入主包或普通分包页面时调用。

 

分包下载:

开发者可以通过配置,在进入小程序某个页面时,由框架自动预下载可需要的分包。提升进入后续分包页面的速度,对于独立分包,可以预下载主包。

配置方法:

预下载分包行为在进入某个页面的时候触发,在通过app.json 增加 preloadRule

{
  "pages": ["pages/index"],
  "subpackages": [
    {
      "root": "important",
      "pages": ["index"],
    },
    {
      "root": "sub1",
      "pages": ["index"],
    },
    {
      "name": "hello",
      "root": "path/to",
      "pages": ["index"]
    },
    {
      "root": "sub3",
      "pages": ["index"]
    },
    {
      "root": "indep",
      "pages": ["index"],
      "independent": true
    }
  ],
  "preloadRule": {
    "pages/index": {
      "network": "all",
      "packages": ["important"]
    },
    "sub1/index": {
      "packages": ["hello", "sub3"]
    },
    "sub3/index": {
      "packages": ["path/to"]
    },
    "indep/index": {
      "packages": ["__APP__"]
    }
  }
}


preloadRule  中,key  是页面路径, value  是进入此页面的 预下载配置,每个配置都有以下几项。 

字段

类型

必填

默认值

说明

packages

StringArray

进入页面后预下载分包的 root 或 name。__APP__ 表示主包。

network

String

wifi

在指定网络下预下载,可选值为:

all: 不限网络 

wifi: 仅wifi下预下载


限制

同一个分包中的页面享有共同的预下载大小限额2M,会在工具打包时校验。如:页面A 和页面B 都在同一个分包中,A 中预下载大小为0.5 M的分包,B 中最大多只能预下载大小1.5 的分包。


 详细请参考 https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1175

网页程序迁移至微信小程序web-view详解

小程序之前开放了webview功能,可以说是网页应用的一大福音了,但是微信的webview有一些坑,这篇文章就是列举一下我在开发过程中遇到的一些问题以及我找到的一些解决方案。

微信小程序之程序、页面注册及生命周期

微信小程序生命周期函数:onLoad: 页面加载。onShow: 页面显示每次打开页面都会调用一次。onReady: 页面初次渲染完成,onHide: 页面隐藏,onUnload: 页面卸载。在小程序中所有页面的路由全部由框架进行管理

微信小程序picker组件两列关联使用方式

在使用微信小程序picker组件时候,可以设置属性 mode = multiSelector 意为多列选择,关联选择,当第一列发生改变时侯,第二列甚至第三列发生相应的改变

支付宝小程序个人开发者,但暂未开放支付接口

支付宝小程序今日正式面向个人开发者开放公测。这是继微信之后,业内第2家面向个人开发者开放的小程序平台。有开发能力的个人用户可访问支付宝小程序平台,扫码验证个人身份以后即可开始支付宝小程序账号申请并进行代码开发。

让小程序代码包立减 10% 的插件 weapp-css-modules

css-modules 是一种 css 模块化方案,它在构建过程中生成一个原类名与新类名的 map,根据 map 引用样式,通过设定 hash 规则,实现了对 CSS 类名作用域的限定

小程序图片加载失败使用默认图片

小程序的image标签有几个常用的属性,lazy-load(懒加载,默认为fasle,不过和本文无关),bindload(当图片加载完成的时候触发的事件),另一个就是我们本文的主角binderror(当发生错误的时候触发的事件);

微信小程序开发中遇到的坑

开发小程序的过程中踩的坑不可谓不多,而有些坑也实在是让人郁闷,不扒一扒难以平我心头之愤呐。

你也许并不需要小程序框架

市面上不停的会有大的公司推出自己的小程序的研发库 / 框架,功能十分强大,也为小程序的开发带来了便利。但在一些积极的反馈中,我们也看到不一样的声音:

小程序支持JSX语法的新思路

React社区一直在探寻使用React语法开发小程序的方式,其中比较著名的项目有Taro,nanachi。而使用React语法开发小程序的难点主要就是在JSX语法上,JSX本质上是JS,相比于小程序静态模版来说太灵活。

小程序多余文本省略号显示

如何在 wxml 页面中截取数据?取数据想必大家都会,不就是 substring 吗?但是这种方法在 wxml 页面中是无效的。那还有 css 啊,不一样可以做到吗?但是个人觉得 css 复用性太差,暂不考虑。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!