微信小程序主包和分包的资源可以相互引用吗?

7,227 阅读4分钟

问题来源

    最近在接手个需求, 因业务比较独立, 跟同事2人开发没提前商量好分包规则, 故建了个分包A跟分包B, 其中A跟B均有个列表组件, UI层90%都一致, 故想复用大部分的样式(即复用wxss), 但发现没法引用分包A的资源, 那要怎么处理呢?

解决方案

  • 1.将该wxss放在主包内;
  • 2.考量下能否合并两个分包, 这样就可以使用自己分包的内容; 针对这个需求, 我这边采用的方案2, 大家可根据实际情况去选择不同方案.

你以为到这里就结束了吗, 肯定没有的啊, 如果你对小程序分包感兴趣, 请往下看看!

何谓主包、分包

整个小程序所有分包大小不超过20M;单个分包/主包大小不能超过 2M

  • 主包:
    a. 放置默认启动页面&&tabBar页面, 以及一些分包需要用到的公共资源(如wxss、js、wxs、component、图片、template);
    b. 主包资源(如wxss、js、wxs、component、图片、template)是全局的, 主包和子包都能引用;
  • 分包:
    a. 根据开发者配置来划分, 主要避免分包过大没法上传、小程序启动时间过长;
    b. 分包相当于有自己独立的作用域, 只能使用自己的或主包的资源, But不能使用其他子包的资源;

为什么需要分包?

微信小程序主包大小必须控制在2M以内       微信小程序包大小必须控制在2M以内,启动时, 默认下载主包&启动主包内页面;若超过该大小在微信开发者工具都不能正常预览,同时也会影响小程序的首次启动时间.故随着业务的不断庞大, 分包加载就变得很有必要了.
如何查看包大小呢?在这里, 我们还能单独查看各个分包的大小. image.png

分包加载

分包加载: 将小程序划分成不同的子包, 在构建时打包成不同的分包, 用户在使用时才按需加载(进入分包内某个页面, 客户端把对应分包代码下载下来, 下载完成即可进行展示),以此来优化小程序首次启动的下载时间.
subpackages(subPackages)字段定义分包, 接收数组, 数组的每个元素代表一个包.

  • root: 当前包的根目录(根路径的相对路径), 必须是独立的,即a的根目录不能在b的子目录中;
  • pages: 当前包下的页面路径
    Tips:
    a. subpackages配置路径外的目录会被打包到主包中
    b. tabBar的页面必须配置在主包内

如何实现分包?

1.建立分包目录subpages, 新建2个分包目录packA、packB.
image.png
你以为页面建好了, 就能在自定义编译条件中找到该启动页面直接启动吗, 答案是否定的,请走2.

2.在app.json配置如下代码.

{
  "pages": [
    "pages/test/test"
  ],
  "subpackages": [
    {
      "root": "subpages/packA",
      "pages": [
        "pages/index"
      ]
    }
  ],
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}

配置好上述代码后,才能在这里看到该启动页面,如下. image.png 某一分包被下载时, 若主包不存在, 则getApp()也不存在, 那么此时调用getApp()获取到的就是undefined,故主包跟当前页面所在分包都会被下载. Tips: 分包之间的页面跳转跟主包是一样的,无区别.

分包如何划分?

  • 按照业务逻辑划分
    可直接在app.json中配置分包信息, 保存后会自动生成对应目录.(所持的文件都是初始的状态)
  • 除tabBar之外的页面全部做成分包
    这也是网上看到的建议之一, 这样既解决了启动的问题, 也可以避免主包过大的问题. 具体如何划分分包、可依据项目实际情况去选择。

写在最后

若有错误之处, 恳请留言, 定会及时更正!
若觉着对您有帮助的话恳请点个赞或着收藏吧!