ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 代码分割 * 解决因代码 **体积过大** 而导致 **加载时间过长** 的问题 * 创建多个包,在运行时动态加载,减少代码加载量 ## 实现代码分割 1. import 动态加载 2. React.lazy 3. 基于路由的代码分割 ### 1. import 动态加载 * 动态导入产生的 bundle 文件,它的文件名就是一个序号 * 魔法注释可以来命名 * 相同的名称会被打包在一起 ``` export default class App extends React.Component { handleClick() { // `webpack`提供的魔法注释(`magic comments`)来对分割的`chunk`进行命名 import(/* webpackChunkName: "show" */'./show.js').then(res => { console.log(res) }) } render () { return <button id="btn" onClick={this.handleClick}>点击加载show.js</button> } }; ``` ![](https://img.kancloud.cn/37/d8/37d84d4dab6da1995be41f5ed1359790_2209x754.png) ![](https://img.kancloud.cn/25/4d/254d7dfb77dfb5341f2eda07422d66ae_2172x687.png) ### 2. React.lazy * 像渲染常规组件一样处理动态引入 * 接受一个函数,这个函数需要动态调用`import()` * import 中引入的组件目前只支持默认导出(default exports) * import 函数返回一个`Promise` * 不支持服务端渲染 ``` // 使用前 import CompoentOne from './CompoentOne' // 使用后 const CompoentOne = React.lazy(() => import('./CompoentOne')) const CompoentOne = React.lazy(() => import(/* webpackChunkName: "componentOne" */'./CompoentOne')) ``` ![](https://img.kancloud.cn/40/3b/403b111dec41865777a724d8f1c08700_1964x1243.png) #### 处理错误 * 只适用于 class 组件 * **可以捕获其子组件的错误**,它无法捕获其自身的错误 * 可以放在最顶层的组件,也可以单独包裹某个部分 ![](https://img.kancloud.cn/2d/e3/2de3c654cd415b4ce0630d44932fcc81_2107x1490.png) ![](https://img.kancloud.cn/1e/b4/1eb4309b70d6c74ec88ef4d489feca06_2198x1559.png) #### 注意点: 1. 错误处理组件自身的错误无法捕获 2. 异步错误,比如计时器 3. 事件中的错误,比如click事件中发生的错误 4. 事件处理器中的错误可以使用 try catch 捕获 [Vue中的错误捕获](https://www.kancloud.cn/book/liuyuxian/js_base/preview/errorCaptured%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86.md) ### 路由按需加载 * React.lazy 结合 React Router 实现路由按需加载 ``` const Home = lazy(() => import('./components/home')) const About = lazy(() => import('./components/about')) ``` ![](https://img.kancloud.cn/c3/2a/c32ae8baec8afe7f4af7f40c6f8c0a25_1825x934.png)