代码分割的其中一个方法是:引入动态的import** 传统的import用法: import React, { PureComponent } from “react”; import { add } from “./math”; 在编译的时候就完成了模块的加载。
class App extends PureComponent { handleClick = () => { console.log(add(16, 26)); }; render() { return <button onClick={this.handleClick}>add</button>; } } export default App;动态import引入用法
import React, { PureComponent } from "react"; class App extends PureComponent { handleClick = () => { //动态加载 import("./math").then(math => { console.log(math.add(16, 26)); }); }; render() { return <button onClick={this.handleClick}>add</button>; } } export default App;在点击事件发生时才动态加载js文件,而且import操作返回一个promise函数,返回其加载的js文件。
代码分割方法二React.lazy()方法: 使用之前:
import OtherComponent from './OtherComponent'; function MyComponent() { return ( <div> <OtherComponent /> </div> ); }使用之后:
const OtherComponent = React.lazy(() => import('./OtherComponent')); function MyComponent() { return ( <div> <OtherComponent /> </div> ); }React.lazy函数是通过引入动态import函数,返回一个promise函数,完成懒加载。
如果在MyComponent组件加载完毕后,OtherComponent还没有加载完成,可以使用suspense加载指示器为懒加载的组件作出优雅的降级。fallback里可以包含任何组件没有加载完毕时展示的内容。它可以用来包裹多个懒加载的组件。
const OtherComponent = React.lazy(() => import('./OtherComponent')); const AnotherComponent = React.lazy(() => import('./AnotherComponent')); function MyComponent() { return ( <div> <Suspense fallback={<div>Loading...</div>}> <section> <OtherComponent /> <AnotherComponent /> </section> </Suspense> </div> ); } 基于路由的代码分割 import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; import React, { Suspense, lazy } from 'react'; const Home = lazy(() => import('./routes/Home')); const About = lazy(() => import('./routes/About')); const App = () => ( <Router> <Suspense fallback={<div>Loading...</div>}> <Switch> <Route exact path="/" component={Home}/> <Route path="/about" component={About}/> </Switch> </Suspense> </Router> );