路由异步加载总结
Closed this issue · 0 comments
lin2006yuo commented
代码分离Code Splitting
webpack
在打包的时候会将所有的资源文件都打包到一个bundle
中,打包到一个bundle
中会有两个问题:
- 当项目日益庞大的时候,打包出的
bundle
体积也会越来越大,影响页面加载。 - 由于都打到一个
bundle
中,一些可能不会被用到的代码也会被下载下来
这时候就需要将bundle
拆开,webpack
提供了三种分离代码方式
- 入口起点:使用
entry
配置手动地分离代码。 - 防止重复:使用
SplitChunksPlugin
去重和分离代码 - 动态导入:通过模块中的内联函数调用来分离代码
异步加载
路由异步加载就是把不同路由对应的页面分割成不同的代码块,然后当路由被访问的时候才加载对应页面
路由异步加载通过动态导入
实现,webpack
官方文档提供了两种动态导入
的方式
- es6
import()
语法
import('./async.js')
webpack
特有的require.ensure
语法
require.ensure([], function(require){
let asyncBundle = require('./async.js')
})
webpack
打包的时候会将这些需要动态导入
的模块和它引用的所有子模块各自打包到一个bundle
中,实现代码分割。
不管是import()
语法或者是require.ensure
,最终都会被webpack
编译成__webpack_require__
, __webpack_require__
是webpack
内部实现模块导入的函数,可以说webpack
统一了各种js模块机制:
- es6 module
- CommonJS
- AMD
除了支持上诉三种js模块化语法外,webpack
还有自己特有的语法,如上面提到的require.ensure
,station
工程新路由使用的require.context
,更多查看官网。
require.context
是否支持动态导入
呢?通过查阅官方api,在第四个参数传入lazy
,webpack
打包的时候就会把他们打到不同的bundle
啦
const req = require.context('../js', true, /\.page\.js$/, 'lazy')