vue 異步組件 (按需加載)


什么是異步組件?

異步組件就是定義的時候什么都不做,只在組件需要渲染(組件第一次顯示)的時候進行加載渲染並緩存,緩存是以備下次訪問。

為什么用異步組件?

在大型應用中,功能不停地累加后,核心頁面已經不堪重負,訪問速度愈來愈慢。為了解決這個問題我們需要將應用分割成小一些的代碼塊,並且只在需要的時候才從服務器加載一個模塊,從而提高頁面加載速度。

異步組件的寫法:

1、工廠函數

// 全局組件注冊
Vue.component('Home, function (resolve) {
  // 這個特殊的 `require` 語法將會告訴 webpack
  // 自動將你的構建代碼切割成多個包,這些包
  // 會通過 Ajax 請求加載
  require(['./Home'], resolve)
})


// 局部組件注冊
new Vue({
  components: {
    'Home': () => resolve => { require(['./Home'], resolve) }
  }
})

2、webpack和ES6推薦返回一個 Promise(推薦)

// 下面2行代碼,沒有指定webpackChunkName,每個組件打包成一個js文件。
const ImportFuncDemo1 = () => import('../components/ImportFuncDemo1')
const ImportFuncDemo2 = () => import('../components/ImportFuncDemo2')
// 下面2行代碼,指定了相同的webpackChunkName,會合並打包成一個js文件。
// const ImportFuncDemo = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '../components/ImportFuncDemo')
// const ImportFuncDemo2 = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '../components/ImportFuncDemo2')
export default new Router({
    routes: [
        {
            path: '/importfuncdemo1',
            name: 'ImportFuncDemo1',
            component: ImportFuncDemo1
        },
        {
            path: '/importfuncdemo2',
            name: 'ImportFuncDemo2',
            component: ImportFuncDemo2
        }
    ]
})

3、webpack提供的require.ensure()   這種情況下,多個路由指定相同的chunkName,會合並打包成一個js文件。

{
     path: '/promisedemo',
    name: 'PromiseDemo',
    component: r => require.ensure([], () => r(require('../components/PromiseDemo')), 'demo')
},
{
    path: '/hello',
    name: 'Hello',
    component: r => require.ensure([], () => r(require('../components/Hello')), 'demo')
}

4、高級路由

const AsyncComponent = () => ({
  // 需要加載的組件 (應該是一個 `Promise` 對象)
  component: import('./MyComponent.vue'),
  // 異步組件加載時使用的組件
  loading: LoadingComponent,
  // 加載失敗時使用的組件
  error: ErrorComponent,
  // 展示加載時組件的延時時間。默認值是 200 (毫秒)
  delay: 200,
  // 如果提供了超時時間且組件加載也超時了,
  // 則使用加載失敗時使用的組件。默認值是:`Infinity`
  timeout: 3000
})

{
    path: '/AsyncComponent',
    name: 'AsyncComponent',
    component: AsyncComponent
},

 


免責聲明!

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



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