【2025年1月2日】关于腾讯云小程序平台更名为腾讯云超级应用服务的公告
控制台更新动态
Android SDK 更新动态
iOS SDK 更新动态
Flutter 更新动态
IDE 更新动态
基础库更新动态
├── app.js├── app.json├── app.wxss├── packageA│ └── pages│ ├── cat│ └── dog├── packageB│ └── pages│ ├── apple│ └── banana├── pages│ ├── index│ └── logs└── utils
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 监听。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) // 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}`)})
文档反馈