vue路由組件按需加載的幾種方法小結(jié)
1. 普通加載
使用vue-cli構(gòu)建項(xiàng)目后,我們會(huì)在Router文件夾下面的index.js里面引入相關(guān)的路由組件,如:
import Hello from '@/components/Hello' import Boy from '@/components/Boy' import Girl from '@/components/Girl'
這樣做的結(jié)果就是webpack在npm run build的時(shí)候會(huì)打包成一個(gè)整個(gè)的js文件,如果頁(yè)面一多,會(huì)導(dǎo)致這個(gè)文件非常大,加載緩慢,為了解決這個(gè)問(wèn)題,需要將他分成多個(gè)小文件,而且還要實(shí)現(xiàn)異步按需加載,即用到了再加載,而不用一股腦全部加載
2. webpack的require.ensure()實(shí)現(xiàn)按需加載
語(yǔ)法:require.ensure(dependencies: String[], callback: function(require), errorCallback: function(error), chunkName: String)
- dependencies:字符串構(gòu)成的數(shù)組,聲明 callback 回調(diào)函數(shù)中所需的所有模塊,模塊作為依賴被加載
- callback:只要加載好全部依賴,webpack 就會(huì)執(zhí)行此函數(shù)。require 函數(shù)的實(shí)現(xiàn),作為參數(shù)傳入此函數(shù)。當(dāng)程序運(yùn)行需要依賴時(shí),可以使用 require() 來(lái)加載依賴。函數(shù)體可以使用此參數(shù),來(lái)進(jìn)一步執(zhí)行 require() 模塊。
- errorCallback:當(dāng) webpack 加載依賴失敗時(shí),會(huì)執(zhí)行此函數(shù)。
- chunkName:由 require.ensure() 創(chuàng)建出的 chunk 的名字。通過(guò)將同一個(gè) chunkName 傳遞給不同的 require.ensure() 調(diào)用,我們可以將它們的代碼合并到一個(gè)單獨(dú)的 chunk 中,從而只產(chǎn)生一個(gè)瀏覽器必須加載的 bundle。
使用方法一:
require.ensure([], function(require){
require('./a.js');
});
// 此時(shí)會(huì)單獨(dú)打包出一個(gè)js文件,沒(méi)有自定義名稱的話,會(huì)被命名為1.js(有hash時(shí)候會(huì)帶上md5)
使用方法二:
require.ensure(['./a.js'], function(require) {
require('./b.js');
});
1、此時(shí)a.js作為依賴被加載,但是沒(méi)有被執(zhí)行(官方文檔說(shuō)的only loads the modules)
2、a.js和b.js會(huì)被打包成一個(gè)文件。
3、回調(diào)函數(shù)里只require了b.js,只有b.js的內(nèi)容會(huì)被執(zhí)行。
4、如果你需要使用a.js的內(nèi)容,需要再加上require('./a.js')
require.ensure(['./list'], function(require){
var list = require('./list');
list.show();
});
給require.ensure的第一個(gè)參數(shù)傳了['./list'],執(zhí)行到這里的時(shí)候list.js會(huì)被瀏覽器下載下來(lái),但是并不會(huì)執(zhí)行l(wèi)ist.js模塊中的代碼,也就是webpack官網(wǎng)說(shuō)的,不會(huì)進(jìn)行evaluate。真正進(jìn)行evaluate的時(shí)候是到了后面這句var list = require('./list');這就是所謂的懶執(zhí)行。
寫在函數(shù)中的多個(gè)模塊會(huì)被打包在一起,這一點(diǎn)和上面沒(méi)有區(qū)別。另外,寫在數(shù)組中的模塊也會(huì)跟他們打包在一起,不管你有沒(méi)有手動(dòng)執(zhí)行。
vue中使用
comst List = resolve => {
require.ensure([],() => {
resolve(require('./list'))
},'list')
}
其實(shí)resolve的作用就是Promise里面那個(gè)resolve,在這里就是定義一個(gè)異步的組件
使用動(dòng)態(tài) import語(yǔ)法
const Foo = () => import(/* webpackChunkName: "foo" */ './Foo.vue');
const router = new VueRouter({
routes: [
{ path: '/foo', component: Foo }
]
})
// /* webpackChunkName: "foo" */使用命名chunk,一個(gè)特殊的注釋語(yǔ)法來(lái)提供 chunk name (需要 Webpack > 2.4)
// webpack要加配置 output需要加個(gè)chunkFilename
chunkFilename: '[name].js'
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue結(jié)合el-upload實(shí)現(xiàn)騰訊云視頻上傳功能
這篇文章主要介紹了vue結(jié)合el-upload實(shí)現(xiàn)騰訊云視頻上傳功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過(guò)程記錄
我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包部署的相關(guān)資料,需要的朋友可以參考下2021-09-09
Vue.js實(shí)現(xiàn)實(shí)例搜索應(yīng)用功能詳細(xì)代碼
本文給大家分享Vue.js實(shí)現(xiàn)實(shí)例搜索應(yīng)用功能詳細(xì)代碼,非常不錯(cuò),感興趣的朋友參考下吧2017-08-08
vue之el-menu-item如何更改導(dǎo)航菜單欄選中的背景顏色
這篇文章主要介紹了vue之el-menu-item如何更改導(dǎo)航菜單欄選中的背景顏色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
element中el-table表頭通過(guò)header-row-style設(shè)置樣式
有些時(shí)候需要給element-ui表頭設(shè)置不同樣式,本文主要介紹了element中el-table表頭通過(guò)header-row-style設(shè)置樣式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

