色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

前端編譯器babel的緩存機制是怎么做的?

方一強2年前11瀏覽0評論

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是校驗函數
  1. never,無需緩存

  2. forever,需要緩存但是下次再處理這個文件時跳過校驗部分直接返回value

  3. valid,下次再處理這個文件時需要走校驗邏輯valid

那么這個校驗邏輯是怎么傳入的呢?

沒錯,就是handle在處理CacheConfigurator時傳入的。

當下次再去處理這個文件時,就會優先走緩存的邏輯,只有校驗通過才會直接返回value!

整體思路就是這樣,大拿們的想法還是非常精妙的,這個思路在其他業務中也是可以參考的!

喜歡我的回答就關注我吧,有問題可以發表評論,我們一起學習,共同成長!