├── app.js├── app.json├── app.wxss├── packageA│ └── pages│ ├── cat│ └── dog├── packageB│ └── pages│ ├── apple│ └── banana├── pages│ ├── index│ └── logs└── utils
subpackages
字段声明项目分包结构:写成 subPackages 也支持。
{"pages":["pages/index","pages/logs"],"subpackages": [{"root": "packageA","pages": ["pages/cat","pages/dog"]}, {"root": "packageB","name": "pack2","pages": ["pages/apple","pages/banana"]}]}
subpackages
中,每个分包的配置有以下几项:subpackages
后,将按 subpackages
配置路径进行打包,subpackages
配置路径外的目录将被打包到主包中。subpackage
的根目录不能是另外一个 subpackage
内的子目录。tabBar
页面必须在主包内。packageA
无法 require packageB
JS 文件,但可以 require 主包、packageA
内的 JS 文件;使用 分包异步化 时不受此条限制。packageA
无法 import packageB
的 template,但可以 require 主包、packageA
内的 template。packageA
无法使用 packageB
的资源,但可以使用主包、packageA
内的资源。├── 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": "moduleB","pages": ["pages/pear","pages/pineapple"],"independent": true}]}
getApp()
App
并不一定被注册,因此 getApp()
也不一定可以获得 App
对象:App
也不存在,此时调用 getApp()
获取到的是 undefined
。 当用户进入普通分包或主包内页面时,主包才会被下载,App
才会被注册。getApp()
可以获取到真正的App
。App
对象实现独立分包和小程序其他部分的全局变量共享。getApp
支持 [allowDefault
] 参数,在 App
未定义时返回一个默认实现。当主包加载,App
被注册时,默认实现中定义的属性会被覆盖合并到真正的 App
中。const app = getApp({allowDefault: true}) // {}app.data = 456app.global = {}
App({data: 123,other: 'hello'})console.log(getApp()) // {global: {}, data: 456, other: 'hello'}
App
生命周期App
的 onLaunch
和首次 onShow
会在从独立分包页面首次进入主包或其他普通分包页面时调用。App
,小程序生命周期的监听可以使用 wx.onAppShow,wx.onAppHide 完成。App
上的其他事件可以使用 wx.onError,wx.onPageNotFound 监听。vConsole 里有preloadSubpackages开头的日志信息,可以用来验证预下载的情况。
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下预下载。 |
// subPackageA/pages/index.json{"usingComponents": {"button": "../../commonPackage/components/button","list": "../../subPackageB/components/full-list","simple-list": "../components/simple-list","plugin-comp": "plugin://pluginInSubPackageB/comp"},"componentPlaceholder": {"button": "view","list": "simple-list","plugin-comp": "view"}}
button
和 list
两个自定义组件是跨分包引用组件,其中 button
在渲染时会使用内置组件 view
作为替代,list 会使用当前分包内的自定义组件 simple-list
作为替代进行渲染;在这两个分包下载完成后,占位组件就会被替换为对应的跨分包组件。// subPackageA/index.js// 使用回调函数风格的调用require('../subPackageB/utils.js', utils => {console.log(utils.whoami) // Wechat MiniProgram}, ({mod, errMsg}) => {console.error(`path: ${mod}, ${errMsg}`)})// 或者使用 Promise 风格的调用require.async('../commonPackage/index.js').then(pkg => {pkg.getPackageName() // 'common'}).catch(({mod, errMsg}) => {console.error(`path: ${mod}, ${errMsg}`)})
本页内容是否解决了您的问题?