babel簡介
babel是一個js的編譯器,我們平常使用的react、vue等框架都是通過它才能編譯成瀏覽器可以執行的代碼,個人感覺它是前端這座大廈最最底層并且是最最核心的部分。如果沒有它,前端肯定會退回到刀耕火種時代。
既然是編譯器,所以它肯定會去操作很多的文件,在babel/core中,它讀取最多的是它的配置包括babelrc、pkgjson、插件、預設等文件,所以對操作文件的結果做緩存必不可少!
babel的緩存機制
假設我們現在處理的是一個文件
在js中做緩存容器常用的無非就是對象和數組,babel采用的是es6提供的map,其實就是一個對象,只不過它的key比較隨意(不限于字符串)。
好了,現在既然有了緩存容器(map),那么key是什么呢?用于標記一個文件,一般可以選擇用文件的路徑和文件名+文件內容的md5值,babel用的是前者。
處理文件的過程可以定義一個handle方法,文件路徑是handle的一個參數,有時僅僅一個文件路徑并不能滿足業務邏輯,需要傳入其他的參數,所以handle擁有第二個參數。
在這里,babel對第二個參數做了一層封裝,把它做成了一個有狀態管理能力的對象CacheConfigurator,所以handle的第二個參數就是這個對象。
handle處理后就會得到對某個文件本次的處理結果value,現在就把value存入map中嗎?sorry,并不是!
CacheConfigurator是一個擁有狀態管理能力的對象,在handle處理的過程中是可以對它進行狀態修改的。在得到value的值后,還需要去鑒別CacheConfigurator的狀態。
CacheConfigurator有三種狀態:
紅色字體的valid是校驗函數
never,無需緩存
forever,需要緩存但是下次再處理這個文件時跳過校驗部分直接返回value
valid,下次再處理這個文件時需要走校驗邏輯valid
那么這個校驗邏輯是怎么傳入的呢?
沒錯,就是handle在處理CacheConfigurator時傳入的。
當下次再去處理這個文件時,就會優先走緩存的邏輯,只有校驗通過才會直接返回value!
整體思路就是這樣,大拿們的想法還是非常精妙的,這個思路在其他業務中也是可以參考的!