Vue 之 自動(dòng)化全局注冊(cè)


在開發(fā)vue項(xiàng)目過程中,如果路由、組件等過多的話,注冊(cè)起來是一件很麻煩的事情,這里引入自動(dòng)化注冊(cè)會(huì)很大程度上減少工作量。
webpack使用 require.context 可以動(dòng)態(tài)引入文件,我們可以借助這個(gè)方法實(shí)現(xiàn)自動(dòng)化注冊(cè)。

一、 require.context
  1. require
    const func = require('./dir/first.js');我們可以通過這個(gè)方法讀取一個(gè)文件中的內(nèi)容,這里一定要注意文件的路徑要寫對(duì),不然會(huì)訪問不到文件。
  2. require.context
    在剛才的過程中,webpack 會(huì)創(chuàng)建一個(gè) require.context ,通過正則匹配到可能的文件,全部引入。如果我們想自定義這個(gè)正則規(guī)則的話,可以自己寫一個(gè) require.context 。
    語法:require.context('./dir', true, /\.js$/);第一個(gè)參數(shù)表示相對(duì)的文件目錄,第二個(gè)參數(shù)表示是否包括子目錄中的文件(true,false),第三個(gè)參數(shù)表示引入的文件匹配的正則表達(dá)式。
    實(shí)例:
const context = require.context('./dir', true, /\.js$/);
const keys = context.keys(); // => ["./another-first-level.js", "./first-level.js", "./sub-dir/second-level.js"]
二、開發(fā)實(shí)例
  1. 自動(dòng)化部署路由
//./router/index.js

//404中轉(zhuǎn)頁面
import Transit from '@/page/Transit'

//自動(dòng)化部署
const requireComponent = require.context('../page', true, /\.vue$/);
const routes = requireComponent.keys().map(fileName => {
    // 獲取組件配置
    const componentConfig = requireComponent(fileName);
    // 剝?nèi)ノ募_頭的 `./` 和`.vue`結(jié)尾的擴(kuò)展名
    const componentName = fileName.replace(/^\.\//,'').replace(/\.vue$/,'');
    // 全局注冊(cè)組件
    const component = Vue.component(
        componentName.replace(/\//,'-'),
        // 如果這個(gè)組件選項(xiàng)是通過 `export default` 導(dǎo)出的,那么就會(huì)優(yōu)先使用 `.default`,否則回退到使用模塊的根。
        componentConfig.default || componentConfig
    );
    return {
        path: '/'+componentName,
        name: componentName.replace(/\//,'-'),
        component
    }
});

//添加404頁面
let notFoundPage = {
    path: '*',
    name: '404',
    component: Transit
};
routes.push(notFoundPage);

Vue.use(Router);

export default new Router({
    routes
})
  1. 自動(dòng)化注冊(cè)全局組件
//main.js
//自動(dòng)化注冊(cè)全局組件
const requireComponent = require.context('./components/global', true, /\.vue$/);
requireComponent.keys().forEach(fileName => {
    // 獲取組件配置
    const componentConfig = requireComponent(fileName);
    // 剝?nèi)ノ募_頭的 `./` 和`.vue`結(jié)尾的擴(kuò)展名
    const componentName = fileName.replace(/^\.\//,'').replace(/\.vue$/,'');
    // 全局注冊(cè)組件
    const component = Vue.component(
        componentName.replace(/\//,'-'),
        componentConfig.default || componentConfig
    );
});

欲望以提升熱忱,毅力以磨平高山。

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

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

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