10.vue-router實現路由懶加載( 動態加載路由 )


vue-router實現路由懶加載

 

當打包構建應用時,Javascript 包會變得非常大,影響頁面加載。如果我們能把不同路由對應的組件分割成不同的代碼塊,然后當路由被訪問的時候才加載對應組件,這樣就更加高效了。結合 Vue 的異步組件和 Webpack 的代碼分割功能,輕松實現路由組件的懶加載.

1、定義

  也叫延遲加載,即在需要的時候進行加載,隨用隨載

2、為什么需要

  像vue這種單頁面應用,如果沒有應用懶加載,運用webpack打包后的文件將會異常的大,造成進入首頁時,需要加載的內容過多,時間過長,會出啊先長時間的白屏,即使做了loading也是不利於用戶體驗,而運用懶加載則可以將頁面進行划分,需要的時候加載頁面,可以有效的分擔首頁所承擔的加載壓力,減少首頁加載用時,進入首頁不用一次加載過多資源造成用時過長。

3、如何實現?

(1)第一種寫法:使用 AMD 風格的 require,於是就更簡單了:

例:const Foo = resolve => require(['./Foo.vue'], resolve)
復制代碼
const routers = [
    {
        path: '/',
        name: 'index',
        component: (resolve) => require(['./views/index.vue'], resolve)
    }
]
復制代碼

 

(2)第二種寫法:(使用import)

例:component: () => import('@/components/Two')
復制代碼
const Index = () => import(/* webpackChunkName: "group-home" */  '@/views/index')
const routers = [
    {
        path: '/',
        name: 'index',
        component: Index
    }
]
復制代碼

 

(3)第三種寫法:使用webpack特有的require.ensure()。注:require.ensure 是 Webpack 的特殊語法,用來設置 code-split point

例:components: r => require.ensure([], () => r(require('@/components/Three')), 'group-home')
復制代碼
const Index = r => require.ensure([], () => r(require('./views/index')), 'group-home');
const routers = [
    {
        path: '/',
        name: 'index',
        component: Index
    }
]
復制代碼

 

4、把組件按組分塊

有時候我們想把某個路由下的所有組件都打包在同個異步塊 (chunk) 中。只需要使用 命名 chunk,一個特殊的注釋語法來提供 chunk name (需要 Webpack > 2.4)。

const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')
const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo')
const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')

Webpack 會將任何一個異步模塊與相同的塊名稱組合到相同的異步塊中。

5、注

  • 一般常用第二種簡寫

  • 第三種中,’group-home’是把組件按組分塊打包, 可以將多個組件放入這個組中,在打包的時候Webpack會將相同 chunk 下的所有異步模塊打包到一個異步塊里面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM