前端優化之 -- 使用 require.context 讓項目實現路由自動導入


最近接手了公司兩個項目,一個PC端后台管理系統,一個app端項目,當然使用的依然是熟悉“Vue全家桶”那套!但是,當我打開項目時,里面的代碼是這樣的(路由模塊):

 

就是所有路由配置都放到一個index.js中,這多少還是讓我有點驚呆的,顯然,項目會越做越大,模塊會越加越多,那這種不分模塊的架構方式明顯給以后帶來很大維護困難,index.js文件會變得異常龐大...

所以,我便想趁現在代碼量還在可控的情況下趕緊優化一下吧!於是,跟領導說明了用意,並很快得到了首肯!所以就開始動起來了~

1. 分模塊:

  首先,當然是要把不同模塊的路由分離開來了(本來想只把新加入的功能模塊做處理,老模塊保留現狀,因為復制、粘貼也是很耗體力的。但是,想想所幸現在項目還不大,再加上目前雖然不年輕但還算力壯,且還稍微有點強迫症的催動下,所以還是決定將現在有代碼拆開...),心里小小斗爭一下之后,就開干了!於是,就有了這樣的結構:

 

同時,讓index.js的全部代碼縮減成了這樣:

 

 

為啥你module里的文件名會是.routes.js 呢?這個嘛... 

其實是個小技巧,並不是便性規定, 1. 為了方便正則匹配,2. 為了標識文件的功能,讓人一看就是知道這是路由文件...

啥正則匹配?

 

2. 自動導入:

  為啥能將index.js縮減成這樣呢?其實就是代碼所示,利用了require.context來實現了自動導入...

  require.context:是一個webpack提供的api,通過執行require.context函數遍歷獲取到指定文件夾(及其下子文件夾)內的指定文件,然后自動導入。

  語法:require.context(directory, useSubdirectories = false, regExp = /^.//); 三個參數分別代表:

. directory 讀取的目錄;
    
. useSubdirectories 是否遍歷目錄的子目錄
     
. regExp 匹配文件的正則表達式 (即你要讀取目錄下什么類型的文件,就是這個正則匹配

 

   require.context() 返回一個函數,該函數包含三個屬性 resolve()、keys()、id 具體定義請自行到百度上谷歌一下!  

   我們這里用到了keys(): 返回匹配成功模塊的名字組成的數組:

  importAll()是對代碼進行了一個封裝,里面的r.keys() 得到的將是:

  

['./action.routes.js', './apply.routes.js', './base.routes.js', './common.routes.js', './cost.routes.js', './liveActivity.routes.js']

  可以看到拿到的就是module目錄里的所有文件; 

  拿到數組文件之后便可對其進行forEach,然后通過 `r(key).default`拿到文件的內容也就是各種模塊寫好的路由配置,從而也就實現了路由模塊自動導入功能,從此,每次只需要要將新加的xxx.routes.js文件放入module目錄(也可以是里面的子目錄),也就不必手動再import了!

 

  其實,require.context,還能實現其他模塊的自動導入功能,比如:Vue官網提到的實現基礎組件的全局注冊(Vue官網的示例),以及對ajax Api模塊化管理並自動引入等等...

 


免責聲明!

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



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