vue-router路由懶加載(按需加載)的作用以及常見的實(shí)現(xiàn)方法

一、什么是路由懶加載?

路由懶加載,也叫延遲加載或按需加載,是在需要的時(shí)候進(jìn)行加載的一種技術(shù)。在單頁面應(yīng)用(SPA)中,如果沒有應(yīng)用懶加載,運(yùn)用webpack打包后的文件將會異常的大,造成進(jìn)入首頁時(shí)需要加載的內(nèi)容過多,時(shí)間過長,會出現(xiàn)長時(shí)間的白屏,即使做了loading也不利于用戶體驗(yàn)。而運(yùn)用懶加載則可以將頁面進(jìn)行劃分,需要的時(shí)候加載頁面,可以有效的分擔(dān)首頁所承擔(dān)的加載壓力,減少首頁加載用時(shí)。

在 Vue.js 中,懶加載可以幫助你減小應(yīng)用的初始加載大小,并在路由被訪問時(shí)再加載對應(yīng)的組件。這可以通過使用 Vue 的異步組件和 Webpack 的代碼分割功能來實(shí)現(xiàn)。

官方解釋:
當(dāng)打包構(gòu)建應(yīng)用時(shí),JavaScript 包會變得非常大,影響頁面加載。
如果我們能把不同路由對應(yīng)的組件分割成不同的代碼塊,然后當(dāng)路由被訪問的時(shí)候才加載對應(yīng)組件,這樣就更加高效了。
路由懶加載做了什么事情?
主要作用是將路由對應(yīng)的組件打包成一個(gè)個(gè)的js代碼塊
只有在這個(gè)路由被訪問到的時(shí)候,才加載對應(yīng)的組件,否則不加載!

二、實(shí)現(xiàn)路由懶加載的方法?

方法1.Vue異步加載技術(shù):

在vue-router配置路由時(shí),將需要懶加載的組件配置為一個(gè)異步組件。
在異步組件的加載函數(shù)中,使用require函數(shù)按需加載組件代碼。
將加載后的組件返回給vue-router,使其能夠正確渲染對應(yīng)的頁面。

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const router = new VueRouter({
    routes: [{
            path: '/home',
            name: 'home',
            component: resolve => require(['@/components/home'], resolve)
        },
        {
            path: '/about',
            name: 'about',
            component: resolve => require(['@/components/about'], resolve)
        }
    ]
})
export default router

方法2.ES6推薦方式imprort ()----推薦使用

在需要懶加載的組件文件中,使用ES6的import()語法將組件導(dǎo)入。
在import()中指定需要加載的組件文件路徑,并使用動態(tài)導(dǎo)入的方式將其加載。
動態(tài)導(dǎo)入的組件會被webpack自動分割到一個(gè)單獨(dú)的文件中,按需加載。
推薦使用這種方式,但是注意wepack的版本>2.4

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

// 下面沒有指定webpackChunkName,每個(gè)組件打包成一個(gè)js文件。
// const Home = () => import('@/views/Home.vue')
// const About = () => import('@/views/About.vue')

// 下面指定了相同的webpackChunkName,會合并打包成一個(gè)js文件。
const Home = () => import( /* webpackChunkName: 'ImportFuncDemo' */ '@/views/Home.vue')
const About = () => import( /* webpackChunkName: 'ImportFuncDemo' */ '@/views/About.vue')

const router = new VueRouter({
    routes: [{
            path: '/home',
            name: 'Home',
            component: Home
        },
        {
            path: '/about',
            name: 'About',
            component: About
        }
    ]
})
export default router

方法3.webpack提供的require.ensure()實(shí)現(xiàn)懶加載:

vue-router配置路由,使用webpack的require.ensure技術(shù),也可以實(shí)現(xiàn)按需加載。
這種情況下,多個(gè)路由指定相同的chunkName,會合并打包成一個(gè)js文件。
require.ensure可實(shí)現(xiàn)按需加載資源,包括js,css等。他會給里面require的文件單獨(dú)打包,不會和主文件打包在一起。
require.ensure()的語法:

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

參數(shù):

  • 第一個(gè)參數(shù)dependencies是一個(gè)數(shù)組,代表了當(dāng)前require進(jìn)來的模塊的一些依賴;
  • 第二個(gè)參數(shù)callback就是一個(gè)回調(diào)函數(shù)。其中需要注意的是,這個(gè)回調(diào)函數(shù)有一個(gè)參數(shù)require,通過這個(gè)require就可以在回調(diào)函數(shù)內(nèi)動態(tài)引入其他模塊。值得注意的是,雖然這個(gè)require是回調(diào)函數(shù)的參數(shù),理論上可以換其他名稱,但是實(shí)際上是不能換的,否則webpack就無法靜態(tài)分析的時(shí)候處理它;
  • 第三個(gè)參數(shù)errorCallback比較好理解,就是處理error的回調(diào);
  • 第四個(gè)參數(shù)chunkName則是指定打包的chunk名稱。
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const router = new VueRouter({
    routes: [{
            path: '/',
            name: 'Home',
            component: (resolve) => {
                require.ensure(['@/views/Home.vue'], () => {
                    resolve(require('@/views/Home.vue'))
                })
            }
        },
        {
            path: '/about',
            name: 'About',
            component: (resolve) => {
                require.ensure(['@/views/About.vue'], () => {
                    resolve(require('@/views/About.vue'))
                })
            }
        }
    ]
})
export default router

三、把組件按組分塊

1.使用 webpack

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

const UserDetails = () =>
    import( /* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
    import( /* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
    import( /* webpackChunkName: "group-user" */ './UserProfileEdit.vue')

webpack 會將任何一個(gè)異步模塊與相同的塊名稱組合到相同的異步塊中。

2.使用 Vite

在Vite中,你可以在rollupOptions下定義分塊:

// vite.config.js
export default defineConfig({
    build: {
        rollupOptions: {
            // https://rollupjs.org/guide/en/#outputmanualchunks
            output: {
                manualChunks: {
                    'group-user': [
                        './src/UserDetails',
                        './src/UserDashboard',
                        './src/UserProfileEdit',
                    ],
                },
            },
        },
    },
})

除了路由懶加載,我們還可以與其他優(yōu)化策略相結(jié)合,如代碼分割等,實(shí)現(xiàn)更完善的性能優(yōu)化。通過靈活應(yīng)用這些技術(shù),我們可以為用戶提供更快速、流暢的 Web 應(yīng)用體驗(yàn)。
vue中vue-router路由懶加載(按需加載)的作用以及常見的實(shí)現(xiàn)方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容