vue-router和webpack懶加載,頁面性能優化篇

在vue單頁應用中,當項目不斷完善豐富時,即使使用webpack打包,文件依然是非常大的,影響頁面的加載。如果我們能把不同路由對應的組件分割成不同的代碼塊,當路由被訪問時才加載對應的組件(也就是按需加載),這樣就更加高效了。——引自vue-router官方文檔

如何實現??

vue異步組件

vue-router配置路由,使用vue的異步組件技術,可以實現懶加載,代碼如下:// 每個組件都會生成一個js文件

import Vue from 'vue'
import Router from 'vue-router'
import Login from '../view/List.vue';

Vue.use(Router);

export default new Router({
routes: [
  {
    path: '/home/list',
    name: 'list',
    components: resolve => require(['../view/List.vue'], resolve)
  }
],

動態import(webpack > 2.4)

vue、webpack官方推薦

情況一:每個組件都會打包生成一個js文件


const List = () => import('../view/List.vue')

// 在路由配置中什麼都不需要改變,像往常一樣使用組件:
export default new Router({
routes: [
  {
    path: '/home/list',
    name: 'login',
    components: Login
  },
  {
    path: '/home/user',
    name: 'user',
    components: User
  }
],

情況二:所有組件合併打包在一個異步塊chunk中


const List = () => import(/* webpackChunkName: "home" */ './List.vue')
const User = () => import(/* webpackChunkName: "home" */ './User.vue')

// 在路由配置中什麼都不需要改變,像往常一樣使用組件:
export default new Router({
routes: [
  {
    path: '/home/list',
    name: 'list',
    components: List
  },
  {
    path: '/home/user',
    name: 'user',
    components: User
  }
],

// 在webpack.base.config.js中配置 ChunkFileName:
output: {
path: config.build.assetsRoot,
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
  ? config.build.assetsPublicPath
  : config.dev.assetsPublicPath
},

另一種寫法,更簡潔:同樣需要在webpack.base.config.js中配置 ChunkFileName:


{
  path: '/home/list',
  name: 'list',
  component: () => import(/* webpackChunkName:"list"*/ '../view/List.vue')
},
{
  path: '/home/user',
  name: 'user',
  component: () => import(/* webpackChunkName:"user"*/ '../view/User.vue')
},

webpack提供的require.ensure()

語法如下:摘自官網

require.ensure(dependencies: String[], callback: function(require), chunkName: String

多個路由指定相同的chunkName,在這裏chunkName爲home,會合並打包成一個js文件。

{
 path: '/home/list',
 name: 'list',
 // component:list
 component: r => require.ensure([], () => r(require('../view/Lst.vue')), 'home')
},
{
 path: '/home/user',
 name: 'user',
 // component:user
 component: r => require.ensure([], () => r(require('../view/User.vue')), 'home')
}

// 在webpack.base.config.js中配置 ChunkFileName 和 publicPath:
output: {
path: config.build.assetsRoot,
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: './',
publicPath: process.env.NODE_ENV === 'production'
  ? config.build.assetsPublicPath
  : config.dev.assetsPublicPath
},

在實踐過程中應該會遇到各種問題,到時候再繼續補充,前端新手,多多指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章