对我们的下一本书感兴趣?了解更多关于使用 React 构建大型 JavaScript Web 应用程序

性能模式

导入可见性

除了用户交互,我们通常还有在初始页面不可见的组件。一个很好的例子是延迟加载的图像,这些图像在视口中不可见,只有在用户向下滚动时才会加载。

由于我们不会立即请求所有图像,因此可以缩短初始加载时间。我们也可以对组件进行相同的操作!为了了解组件当前是否在视口中,我们可以使用IntersectionObserver API,或者使用react-lazyloadreact-loadable-visibility之类的库快速将导入可见性添加到我们的应用程序中。

ChatInput.js
ChatList.js
icon-square-bigwebpack.config.js
1import React from "react";
2import Send from "./icons/Send";
3import Emoji from "./icons/Emoji";
4import LoadableVisibility from "react-loadable-visibility/react-loadable";
5
6const EmojiPicker = LoadableVisibility({
7 loader: () => import("./EmojiPicker"),
8 loading: <p id="loading">Loading</p>
9});
10
11const ChatInput = () => {
12 const [pickerOpen, togglePicker] = React.useReducer(state => !state, false);
13
14 return (
15 <div className="chat-input-container">
16 <input type="text" placeholder="Type a message..." />
17 <Emoji onClick={togglePicker} />
18 {pickerOpen && <EmojiPicker />}
19 <Send />
20 </div>
21 );
22};
23
24console.log("ChatInput loading", Date.now());
25
26export default ChatInput;

每当用户点击 Gif 按钮后,EmojiPicker 渲染到屏幕上时,react-loadable-visibility 会检测到 EmojiPicker 元素应该在屏幕上可见。只有这样,它才会在用户看到正在渲染的加载组件的同时,开始导入模块。

这个回退组件可以告诉用户我们的应用程序没有冻结:他们只需要等待一小段时间,模块就会加载、解析、编译和执行!