🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
背景
MPX是滴滴出品的一款增强型小程序跨端框架,其核心是对原生小程序功能的增强。具体的使用不是本文讨论的范畴,想了解更多可以去官网了解更多。
回到正题,使用MPX开发小程序有一段时间了,该框架对不同包之间的共享资源有一套自己的构建输出策略,其官网有这样一段描述说明:
总结关键的两点:
纯js资源
:主包引用则输出主包,或者分包之间共享也输出到主包非js资源,包括wxml、样式、图片等
:主包引用则输出主包,分包之间共享则输出到各自分包
很好奇MPX内部是怎么做到上面这种效果的,尤其是js资源,于是就拜读了@mpxjs/webpack-plugin@2.6.61
揭开其实现的细节。
mpx怎么实现的
首先简单介绍下MPX
是怎么整合小程序离散化的文件结构,它基于webpack打包构建的,用户在Webpack配置中只需要配置一个入口文件app.mpx,它会基于依赖分析
和动态添加entry
的方式来整合小程序的离散化文件,,loader会解析json配置文件中的pages域
和usingComponents域
中声明的路径,通过动态添加entry的方式将这些文件添加到Webpack的构建系统当中,并递归执行这个过程,直到整个项目中所有用到的.mpx
文件都加入进来。
重点来了,MPX在输出前,其借助了webpack的SplitChunksPlugin
的能力将复用的模块抽取到一个外部的bundle中,确保最终生成的包中不包含重复模块。
js资源模块的输出
@mpxjs/webpack-plugin
插件是MPX基于webapck构建的核心,其会在webpack所有模块构建完成的finishMoudles
钩子中来实现构建输出策略,主要是配置SplitChunks
的cacheGroup,后续webpack代码优化阶段会根据SplitChunks
的配置来输出代码。
apply(compiler) {
...
// 拿到webpack默认配置对象splitChunks
let splitChunksOptions = compiler.options.optimization.splitChunks
// 删除splitChunks配置后,webpack内部就不会实例化SplitChunkPlugin
delete compiler.options.optimization.splitChunks
// SplitChunkPlugin的实例化由mpx来接管,这样可以拿到其实例可以后续对其options进行修正
let splitChunksPlugin = new SplitChunksPlugin(splitChunksOptions)
splitChunksPlugin.apply(compiler)
...
compilation.hooks.finishModules.tap('MpxWebpackPlugin', (modules) => {
// 自动跟进分包配置修改splitChunksPlugin配置
if (splitChunksPlugin) {
let needInit = false
Object.keys(mpx.componentsMap).forEach((packageName) => {
if (!splitChunksOptions.cacheGroups.hasOwnProperty(packageName))