使用时才装入须要的组件,能够有效的提升首次装入页面的速度。好比在路由切换时html
Vue.js容许将组件定义为一个工厂函数,动态地解析组件的定义。工厂函数接收一个resolve回调,成功获取组件定义时调用。也能够调用reject(reason)指示失败。vue
假设咱们有两个组件Home、About。Home组件和首页同步加载,而About组件则按需加载。案例的代码有首页index.html,组件代码about.js构成。node
首先是about.js代码:webpack
Vue.component('about', { template: '<div>About page</div>' });
接下来是index.html代码:git
<html> <head> <title>Async Component test</title> </head> <body> <div id="app"> <router-link to="/home">/home</router-link> <router-link to="/about">/about</router-link> <router-view></router-view> </div> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <script> function load(componentName, path) { return new Promise(function(resolve, reject) { var script = document.createElement('script'); script.src = path; script.async = true; script.onload = function() { var component = Vue.component(componentName); if (component) { resolve(component); } else { reject(); } }; script.onerror = reject; document.body.appendChild(script); }); } var router = new VueRouter({ routes: [ { path: '/', redirect:'/home' }, { path: '/home', component: { template: '<div>Home page</div>' }, }, { path: '/about', component: function(resolve, reject) { load('about', 'about.js').then(resolve, reject); } } ] }); var app = new Vue({ el: '#app', router: router, }); </script> </body> </html>
为了加载在服务器的js文件,咱们须要一个HTTP服务器。可使用node.js的http-server实现。安装并启动一个服务器的方法:web
npm install http-server -g http-server
访问:vue-router
http://127.0.0.1:8080
咱们便可在首页看到home和about的连接,点击home能够显示home组件,点击about,若是尚未加载过,就加载about组件。npm
对index.html内的代码稍做解释:bootstrap
组件定义为function(resolve, reject) {}
函数,其内调用load函数,成功后resolve,不然reject服务器
函数load内经过建立标签script
加载指定文件,并经过onload事件当加载完成后,经过Vue.component
验证组件,存在就resolve,不然reject
若是使用webpack脚手架的方式,加载异步组件将会更加直观。本节会用一样的案例,使用webpack作一次演示。
首先建立脚手架,并安装依赖
vue init webpack vuetest cd vuetest npm i npm run dev
访问localhost:8080,能够看到Vue的默认页面。而后替换main.js文件为:
import Vue from 'vue' import App from './App' import VueRouter from 'vue-router' import About from './components/about' Vue.use(VueRouter) const Home = { template: '<div>home page</div>' } // const About = { template: '<div>about page</div>' } const router = new VueRouter({ routes :[ { path: '/home', component: Home }, { path: '/about', component: function (resolve) { require(['./components/about'], resolve) } }, { path: '/', redirect: '/home' } ] }) new Vue({ el: '#app', template: '<App/>', router: router, components: { App } })
并添加组件about到src/components/about.vue
:
<template> <div>about page</div> </template>
再次访问localhost:8080,能够看到Home组件和about组件的连接,点击连接试试,能够看到组件home和about都是能够加载的。
这里特别要解释的是代码:
component: function (resolve) { require(['./components/about'], resolve) } }
Vue.js支持component定义为一个函数:function (resolve) {}
,在函数内,可使用相似node.js的库引入模式
require(['./components/about'], resolve)
从而大大的简化了异步组件的开发。固然,代价是你须要使用脚手架代码。这个特殊的require语法告诉webpack自动将编译后的代码分割成不一样的块,这些块将经过按需自动下载。
做者:刘传君
建立过产品,创过业。好读书,求甚解。
能够经过 1000copy#gmail.com 联系到我
bootstrap小书 https://www.gitbook.com/book/...
http小书 http://www.ituring.com.cn/boo...
Git小书 http://www.ituring.com.cn/boo...