@taro-minify-pack/react-lazy-enhanced 0.0.5-alpha.4 → 0.0.5-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +177 -2
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,2 +1,177 @@
1
- ## @taro-minify-pack/react-lazy-enhanced
2
- > react.lazy 增强,每次初始化都会加载异步样式 触发 Suspense fallback
1
+ # @taro-minify-pack/react-lazy-enhanced
2
+
3
+ React.lazy 增强版,专为 Taro 小程序环境优化,解决异步组件样式加载问题。
4
+
5
+ ## ✨ 功能特性
6
+
7
+ - **增强的懒加载**:在 React.lazy 基础上提供额外功能
8
+ - **样式加载确认**:每次组件初始化时调用工厂函数,确保样式加载完成
9
+ - **与 Taro 插件深度集成**:配合 `taro-plugin-async-pack` 插件使用,配置其 webpack runtime 改造解决异步样式加载问题
10
+ - **可靠的 Suspense 支持**:确保 Suspense fallback 被正确触发
11
+ - **自动重置机制**:组件卸载时自动重置加载状态
12
+ - **类型安全**:完整的 TypeScript 类型支持
13
+
14
+ ## 📦 安装
15
+
16
+ ### npm 安装
17
+
18
+ ```bash
19
+ npm install @taro-minify-pack/react-lazy-enhanced
20
+ ```
21
+
22
+ ### yarn 安装
23
+
24
+ ```bash
25
+ yarn add @taro-minify-pack/react-lazy-enhanced
26
+ ```
27
+
28
+ ### pnpm 安装
29
+
30
+ ```bash
31
+ pnpm add @taro-minify-pack/react-lazy-enhanced
32
+ ```
33
+
34
+ ## 🚀 使用
35
+
36
+ ### 与 Taro 插件配合使用(必需)
37
+
38
+ **注意**:此包必须与 `@taro-minify-pack/plugin-async-pack` 插件配合使用,单独使用时无法发挥其核心功能(解决异步样式加载问题)。
39
+
40
+ 当与 `@taro-minify-pack/plugin-async-pack` 插件一起使用时,您无需手动导入此包,插件会自动将所有 `React.lazy`
41
+ 调用转换为使用此增强版实现:
42
+
43
+ ```tsx
44
+ // 插件会自动将以下代码转换为使用 @taro-minify-pack/react-lazy-enhanced
45
+ import React, {Suspense, lazy} from 'react'
46
+
47
+ const DynamicComponent = lazy(() => import('./DynamicComponent'))
48
+
49
+ function App() {
50
+ return (
51
+ <Suspense fallback={<div>Loading...</div>}>
52
+ <DynamicComponent/>
53
+ </Suspense>
54
+ )
55
+ }
56
+ ```
57
+
58
+
59
+ ## 📝 工作原理
60
+
61
+ ### 核心作用
62
+
63
+ 由于 `taro-plugin-async-pack` 改造了 webpack 的 dist runtime,异步组件的 JavaScript 和样式文件会被分离到不同的异步分包中。
64
+ `@taro-minify-pack/react-lazy-enhanced` 的核心作用是**确保在组件初始化时,异步模块的样式文件已经加载完成**。
65
+
66
+ ### 工作流程
67
+
68
+ 1. **组件初始化**:当组件首次渲染或卸载后重新渲染时
69
+ 2. **调用工厂函数**:强制调用传入的 factory 函数,触发异步模块和样式的加载
70
+ 3. **等待加载完成**:通过 Suspense 机制等待模块和样式加载完成
71
+ 4. **状态管理**:维护加载状态,确保组件在样式就绪后才会渲染
72
+ 5. **自动重置**:组件卸载时重置加载状态,确保下次渲染时重新确认样式加载
73
+
74
+ ### 与原生 React.lazy 的关键区别
75
+
76
+ 原生 React.lazy 会同时加载 JavaScript 和 CSS 模块。在 Web 环境中:
77
+
78
+ - JS 模块会被保存在内存中
79
+ - CSS 模块通过 `<style>` 标签插入,只需插入一次就会被浏览器缓存
80
+
81
+ 但在 Taro 小程序环境中,由于 `taro-plugin-async-pack` 对 webpack runtime 的改造,异步样式加载机制完全不同:
82
+
83
+ - 样式文件被单独打包到异步分包中
84
+ - 通过向每个页面插入自定义组件的方式实现样式加载
85
+ - 每次页面重新加载都需要重新注入样式,无法像 Web 环境那样缓存
86
+
87
+ 这种差异可能导致组件已加载但样式未就绪的问题。`@taro-minify-pack/react-lazy-enhanced` 通过每次组件初始化时重新调用工厂函数的方式,确保异步模块的
88
+ JavaScript 和样式文件都能被正确加载并应用到当前页面。
89
+
90
+ ### 关键实现代码
91
+
92
+ ```tsx
93
+ export const lazy = <T extends ComponentType<any>>(factory: Factory<T>) => {
94
+ const LazyComponent = React.lazy(factory) as ForwardRefExoticComponent<any>
95
+ const loadData: LoadData<T> = {status: Status.Uninitialized}
96
+
97
+ const load = () => {
98
+ if (loadData.status !== Status.Uninitialized) return
99
+ const successCallback = (res: Result<T>) => {
100
+ loadData.status = Status.Resolved
101
+ loadData.result = res.default
102
+ }
103
+ const errorCallback = (err: Error) => {
104
+ loadData.status = Status.Rejected
105
+ loadData.result = err
106
+ }
107
+ // 每次组件初始化都会调用 factory 函数,确保样式加载完成
108
+ loadData.promise = factory().then(successCallback, errorCallback)
109
+ loadData.status = Status.Pending
110
+ }
111
+
112
+ const resetLoadData = () => {
113
+ loadData.status = Status.Uninitialized
114
+ loadData.result = undefined
115
+ loadData.promise = undefined
116
+ }
117
+
118
+ return React.forwardRef<ComponentRef<T>, ComponentPropsWithoutRef<T>>((props, ref) => {
119
+ if (loadData.status === Status.Uninitialized) load()
120
+
121
+ if (loadData.status === Status.Pending) throw loadData.promise
122
+
123
+ if (loadData.status === Status.Rejected) throw loadData.result
124
+
125
+ useEffect(() => {
126
+ return resetLoadData()
127
+ }, [])
128
+
129
+ return <LazyComponent {...props} ref={ref}/>
130
+ })
131
+ }
132
+ ```
133
+
134
+ ## 🆚 与原生 React.lazy 的区别
135
+
136
+ | 特性 | React.lazy | @taro-minify-pack/react-lazy-enhanced |
137
+ |------------------------|--------------------------|---------------------------------------|
138
+ | **基础懒加载功能** | ✅ 支持 | ✅ 支持 |
139
+ | **模块加载策略** | 一次加载,缓存复用 | 每次组件初始化都重新调用工厂函数 |
140
+ | **样式加载机制** | Web:CSS 通过 style 标签插入并缓存 | 小程序:通过自定义组件注入样式,每次页面加载需重新注入 |
141
+ | **与 Taro 插件集成** | ❌ 无特殊集成 | ✅ 与 `taro-plugin-async-pack` 深度配合 |
142
+ | **webpack runtime 适配** | ❌ 无特殊适配 | ✅ 适配改造后的 webpack runtime |
143
+ | **组件卸载处理** | ❌ 无特殊处理 | ✅ 卸载时重置状态 |
144
+ | **使用场景** | 通用 Web 应用 | Taro 小程序、需要确保样式加载的场景 |
145
+
146
+ ## ⚠️ 注意事项
147
+
148
+ 1. **与 Suspense 配合使用**:必须将懒加载组件包裹在 `Suspense` 组件中
149
+ 2. **与 Taro 插件的关系**:此包必须与 `@taro-minify-pack/plugin-async-pack` 插件配合使用,单独使用时无法解决 Taro 小程序环境下的异步样式加载问题
150
+ 3. **性能考虑**:由于每次组件初始化都会调用工厂函数,可能会增加网络请求。但在小程序环境中,这种额外开销通常是可接受的,且能确保样式正确加载
151
+ 4. **版本兼容性**:需要 React 16.8+ 版本支持 Hooks
152
+ 5. **样式配置**:确保 Taro 项目的样式配置正确,特别是在使用异步分包时
153
+
154
+ ## 🔧 API
155
+
156
+ ### `lazy`
157
+
158
+ **类型**:`<T extends ComponentType<any>>(factory: Factory<T>) => React.LazyExoticComponent<T>`
159
+
160
+ **描述**:创建一个懒加载组件,确保每次初始化时样式加载完成
161
+
162
+ **参数**:
163
+ - `factory`: 一个返回 Promise 的工厂函数,用于动态加载组件模块
164
+
165
+ **返回值**:
166
+ - 返回一个懒加载组件,需要配合 `Suspense` 组件使用
167
+
168
+ ## 📄 许可证
169
+
170
+ MIT License
171
+
172
+ ## 🤝 贡献
173
+
174
+ 欢迎提交 Issue 和 Pull Request!
175
+
176
+ > 该插件是 @taro-minify-pack 系列插件的一部分,致力于提供完整的 Taro 项目优化解决方案。
177
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taro-minify-pack/react-lazy-enhanced",
3
- "version": "0.0.5-alpha.4",
3
+ "version": "0.0.5-alpha.6",
4
4
  "description": "",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",