关于 dynamic-import
这是一项介绍按需导入 React 组件的开发技能,面向优化页面初始加载的开发者,涵盖 React.lazy、Suspense、加载占位界面及 SSR 替代方案。
主要功能
- 01延迟导入 React 组件
- 02使用 React.lazy 和 Suspense
- 03加载时显示占位界面
- 04SSR 使用 loadable-components
适用场景
- 01避免交互组件进入初始包
- 02减少弹窗或选择器的初始加载量
- 03在需要时加载非关键模块
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ patternsdev/ skills --skill dynamic-import安装后在 Claude Code 中输入/dynamic-import确认已加载。
详细介绍
动态导入
在聊天应用中,我们有四个关键组件:UserInfo、ChatList、ChatInput 和 EmojiPicker。不过,在初始页面加载时,只有其中_三个_组件会立即使用:UserInfo、ChatList 和 ChatInput。EmojiPicker 不会直接显示;如果用户不点击 Emoji 来切换显示 EmojiPicker,它甚至可能根本不会渲染。这意味着我们不必要地将 EmojiPicker 模块添加到了初始打包文件中,可能因此增加了加载时间!
为了解决这个问题,我们可以_动态导入_ EmojiPicker 组件。我们不会静态导入它,而只在需要显示 EmojiPicker 时才导入。在 React 中动态导入组件的简单方法是使用 React Suspense。React.Suspense 组件接收需要动态加载的组件,这样 App 组件就可以通过暂停导入 EmojiPicker 模块,更快地渲染其内容!
适用场景
- 当某些模块仅在用户交互或满足特定条件时才需要使用,请采用此方法
- 如果想缩小初始打包文件的体积以加快页面加载速度,此方法会很有帮助
- 当模态框、选择器或大型库等组件在初始渲染时并不需要时,请采用此方法
使用说明
- 在 React 中使用
React.lazy和Suspense动态导入组件 - 在动态导入的模块加载期间,提供有意义的回退界面
- 对于不支持 React Suspense 的 SSR 应用,可考虑使用
loadable-components - 仅动态导入对初始渲染并非必需的模块
详情
我们可以将 EmojiPicker 拆分到独立的打包文件中,缩小初始打包文件的体积,而不是不必要地将它添加到初始打包文件中!
较小的初始打包文件意味着更快的初始加载速度:用户不必长时间盯着空白的加载屏幕。fallback 组件可以让用户知道应用并未卡住:他们只需稍等片刻,等待模块处理并执行即可。
Asset Size Chunks Chunk Names
emoji-picker.bundle.js 1.48 KiB 1 [emitted] emoji-picker
main.bundle.js 1.33 MiB main [emitted] main
vendors~emoji-picker.bundle.js 171 KiB 2 [emitted] vendors~emoji-picker
之前,初始打包文件为 1.5MiB;暂停导入 EmojiPicker 后,我们成功将其缩小到 1.33 MiB!
通过动态导入 EmojiPicker 组件,我们成功将初始打包文件从 1.5MiB 缩小到了 1.33 MiB!尽管用户可能仍需等待一段时间,直到 EmojiPicker 完全加载,但我们确保了应用在等待组件加载期间仍能完成渲染并可供交互,从而改善了用户体验。
Loadable Components
服务器端渲染目前尚不支持 React Suspense。React Suspense 的一个不错的替代方案是 loadable-components 库,可用于 SSR 应用。
与 React Suspense 类似,我们可以将延迟导入的模块传递给 loadable,只有在请求 EmojiPicker 模块时才会导入该模块!在模块加载期间,我们可以渲染一个 fallback 组件。
虽然 loadable components 是 SSR 应用中替代 React Suspense 的绝佳方案,但它们也适用于 CSR 应用,可用于暂停模块导入。