若是系统很庞大,将代码一次性载入,就显得太过于强大,最好能作到根据咱们的需求来选择性地加载咱们须要的代码。node
本文的原文在个人博客中:github.com/RachelRen/b…,欢迎star。react
webpack 提供了2种方式来拆分代码。webpack
import(/* webpackChunkName: "b" */ './b').then(function(module){
const b = module.default;
b();
})
复制代码
如今都比较推荐第一种方式,从实践中能够获得下面的结论git
在业务中,若是使用的是react
,通常都是须要和react-router
联合使用的。github
那么通常配置以下,web
webpack.config.jspromise
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry:'./a.js',
mode:'development',
output:{
filename:'[name].js',
chunkFilename:'[name].js',// 设置按需加载后的chunk名字
publicPath:'dist/'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
}
}
]
},
devServer: {
contentBase: './',
compress: true,
port: 9000,
hot: true,
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.HotModuleReplacementPlugin()
],
}
复制代码
{
"presets": ["@babel/preset-react","@babel/preset-env"],
"plugins": ["@babel/plugin-syntax-dynamic-import"]
}
复制代码
import React,{Component} from 'react';
import ReactDom from 'react-dom';
export default class A extends Component{
render(){
return <div>
this is A
</div>
}
}
ReactDom.render(<A />,document.getElementById('component'))
复制代码
如今用react-loadable
方式实现的按需加载是官方比较推荐的方式。 在这个过程当中,用了import()
这个方法bash
import React,{Component} from 'react';
import { BrowserRouter as Router, Route, Switch,Link } from 'react-router-dom';
import ReactDom from 'react-dom';
import Loadable from 'react-loadable';
const Loading = () => <div>Loading...</div>;
const B = Loadable({
loader: () => import('./b.js'),
loading: Loading,
})
const C = Loadable({
loader: () => import('./C.js'),
loading: Loading,
})
export default class A extends Component{
render(){
return <div>
<Router>
<div>
<Route path="/B" component={B}/>
<Route path="/C" component={C}/>
<Link to="/B">to B</Link><br/>
<Link to="/C">to C</Link>
</div>
</Router>
</div>
}
}
ReactDom.render(<A/>,document.getElementById('component'))
复制代码
Loadable
组件const LazyLoad = (path)=>{
return Loadable({
loader: () => import(path),
loading: Loading,
})
}
const B = LazyLoad('./b.js')
复制代码
若是用上面的方式来封装组件,会发现报错。由于webpack编译的时候,会先扫描一遍js文件,找出须要按需加载的部分,而后进行按需加载,不会关心内部的js执行上下文。babel
因此只能把import的部分拿出来。react-router
const LazyLoad = loader => Loadable({
loader,
loading:Loading,
})
const B = LazyLoad(()=>import('./b.js'));
复制代码