@@ -43,11 +43,91 @@ theme: smartblue
4343等等
4444```
4545
46- ##
46+ ``` ts
47+ // packages/taro-webpack5-runner/src/plugins/MiniPlugin.ts
48+ compilation .hooks .processAssets .tapAsync (
49+ {
50+ name: PLUGIN_NAME ,
51+ stage: PROCESS_ASSETS_STAGE_ADDITIONAL
52+ },
53+ this .tryAsync <any >(async () => {
54+ // 如果是子编译器,证明是编译独立分包,进行单独的处理
55+ if ((compilation as any ).__tag === CHILD_COMPILER_TAG ) {
56+ await this .generateIndependentMiniFiles (compilation , compiler )
57+ } else {
58+ await this .generateMiniFiles (compilation , compiler )
59+ }
60+ })
61+ )
62+ ```
63+
64+ ``` ts
65+ // packages/taro-webpack5-runner/src/plugins/MiniPlugin.ts
66+ /** 生成小程序相关文件 */
67+ async generateMiniFiles (compilation : Compilation , compiler : Compiler ) {
68+ // compilation.assets[xxx] = xxx;
69+ }
70+ ```
71+
72+ 这个函数特别长,简单来说就是以下这几项
73+
74+ - 生成 XS 文件 generateXSFile
75+ - 生成配置文件 generateConfigFile
76+ - 生成模板文件 generateTemplateFile
77+
78+ 最终通过 ` compilation.assets[xxx] = xxx; ` 赋值语句生成文件。
79+
80+ 我们来看下具体实现。
81+
82+ ## generateMiniFiles 生成小程序文件
83+
84+ 是 TaroMiniPlugin 类中用于生成小程序相关产物(如模板、配置、样式、资源等)的核心方法。它的主要职责是根据收集到的页面、组件、配置等信息,生成最终小程序所需的各种文件,并写入到 webpack 的 compilation.assets 中。其主要流程如下:
85+
86+ ``` ts
87+ // packages/taro-webpack5-runner/src/plugins/MiniPlugin.ts
88+
89+ ```
4790
91+ 处理样式文件名重复问题
92+ 首先遍历所有产物,如果发现样式文件名重复(如 .wxss.wxss),则去重,保证产物中只有一个正确的样式文件名。
93+
94+ 自定义配置处理
95+ 如果配置中定义了 modifyMiniConfigs 钩子,则调用该钩子允许用户自定义修改所有页面、组件的配置内容。
96+
97+ 生成 app 配置文件
98+ 在非 blended 模式且不是插件构建时,生成主包的 app 配置文件(如 app.json),内容来自 this.filesConfig。
99+
100+ 生成基础组件模板和配置
101+ 如果当前模板不支持递归(如微信、QQ 小程序),则生成基础组件(comp)和自定义包装器(custom-wrapper)的模板和配置文件。
102+
103+ 生成全局模板和自定义包装器模板
104+ 生成全局的 base 模板和 custom-wrapper 模板(如 base.wxml、custom-wrapper.wxml),并根据配置决定是否压缩 XML。
105+
106+ 生成全局 XS 脚本
107+ 如果平台支持 XS 脚本,则生成 utils 脚本文件。
108+
109+ 生成所有组件的配置和模板
110+ 遍历所有组件,为每个组件生成配置文件和模板文件(非原生组件才生成模板)。
111+
112+ 生成所有页面的配置和模板
113+ 遍历所有页面,为每个页面生成配置文件和模板文件(非原生页面才生成模板),并处理分包页面的过滤。
114+
115+ 生成 tabbar 图标资源
116+ 调用 generateTabBarFiles 方法,将 tabbar 所需的图片资源写入产物。
117+
118+ 注入公共样式
119+ 调用 injectCommonStyles 方法,将公共样式自动引入到 app 和各页面样式文件中。
120+
121+ 生成暗黑模式主题文件
122+ 如果配置了暗黑模式主题,则输出对应的主题文件。
123+
124+ 插件模式下生成 plugin.json
125+ 如果是插件构建,自动生成并写入 plugin.json 文件。
48126
49127## 总结
50128
129+ ` generateMiniFiles ` 负责将 Taro 编译期收集到的所有页面、组件、配置、资源等,最终生成小程序平台所需的所有产物文件,并写入 webpack 的产物集合。它是 Taro 小程序端产物生成的关键环节,确保了最终产物的完整性和平台兼容性。
130+
51131启发:Taro 是非常知名的跨端框架,我们在使用它,享受它带来便利的同时,有余力也可以多为其做出一些贡献。比如帮忙解答一些 issue 或者提 pr 修改 bug 等。
52132在这个过程,我们会不断学习,促使我们去解决问题,带来的好处则是不断拓展知识深度和知识广度。
53133有些时候还是需要深入学习源码,理解源码才能更好的针对项目做相应的优化。
0 commit comments