您可以动态加载您的组件,这样您的 bundle.js 将仅包含所需的部分 js,并且在您导航时您将请求其他不同的部分/部分。
而不是传统方式:import App from './containers/App/App'; 你可以这样做:
class ImportedComponent extends Component {
state = {
component: null
}
componentWillMount() {
this.props.load()
.then((mod) => this.setState(() => ({
component: mod.default
})))
}
render() {
return this.props.children(this.state.component)
}
}
const App = (props) => (
<ImportedComponent load={() => import('./containers/App/App')}>
{(Component) => Component === null ? <h6 className="loading-message">Loading...</h6> : <Component {...props}/>}
</ImportedComponent>
)
或者你可以延迟加载你的组件本身。例如,假设我有 Moment JS,我不想在需要它之前加载它。所以我能做什么:
1) 创建一个状态并将其设置为空。
constructor(props){
super(props);
this.state = {
lazyLoadedComponent: () => null
}
}
2) 使用async componentDidMount with await,尝试捕捉并更新componentDidMount上的lazyLoadedComponent状态
async componentDidMount(){
try {
const Moment = await import('react-moment');
this.setState({ lazyLoadedComponent: (data)=>{
return React.createElement(Moment.default, {format:'MM/DD/YY'}, data)
}
});
}
catch(err) {
this.setState({ lazyLoadedComponent: <div>{`Failed to load component: ${err}`}</div> });
}
}
3) 在渲染上调用组件:
{this.state.lazyLoadedComponent(value.createdOn)}
通过遵循这 2 个示例,您应该可以看到小于 250KB 的 bundle.js。