Vue路由懒加载
Vue路由懒加载
对于SPA单页应用,当打包构建时,JavaScript包会变得非常大,影响页面加载速度,将不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这就是路由的懒加载。
实现方式
Vue异步组件
Vue允许以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。
| 1 | Vue.component("async-example", function (resolve, reject) { | 
这个工厂函数会收到一个resolve回调,这个回调函数会在你从服务器得到组件定义的时候被调用,当然也可以调用reject(reason)来表示加载失败,此处的setTimeout仅是用来演示异步传递组件定义用。将异步组件和webpack的code-splitting功能一起配合使用可以达到懒加载组件的效果。
| 1 | Vue.component("async-webpack-example", function (resolve) { | 
也可以在工厂函数中返回一个Promise,把webpack 2和ES2015语法加在一起。
| 1 | Vue.component( | 
事实上我们在Vue-Router的配置上可以直接结合Vue的异步组件和Webpack的代码分割功能可以实现路由组件的懒加载,打包后每一个组件生成一个js文件。
| 1 | { | 
动态import
在Webpack2中,可以使用动态import语法来定义代码分块点split point,官方也是推荐使用这种方法,如果使用的是Bable,需要添加syntax-dynamic-import插件, 才能使Babel可以正确的解析语法。
| 1 | //默认将每个组件,单独打包成一个js文件 | 
有时我们想把某个路由下的所有组件都打包在同一个异步块chunk中,需要使用命名chunk一个特殊的注释语法来提供chunk name,需要webpack > 2.4。
| 1 | const example1 = () => import(/* webpackChunkName: "Example" */ "@/views/example1.vue"); | 
事实上我们在Vue-Router的配置上可以直接定义懒加载。
| 1 | { | 
webpack提供的require.ensure
使用webpack的require.ensure,也可以实现按需加载,同样多个路由指定相同的chunkName也会合并打包成一个js文件。
| 1 | // require.ensure(dependencies: String[], callback: function(require), chunkName: String) | 
参考
| 1 | https://zhuanlan.zhihu.com/p/46843949 | 
