前段時間在用workbox時,在做precache時,匹配模式基於的是Glob Pattern模式,於是就看了下相關文件。
下面翻譯一下node-glob的使用,原文:github.com/isaacs/node…
Glob
像在shell裡面,用*
等匹配模式來匹配檔案。
Glob基於Javascript實現,使用minimatch
庫進行匹配。
使用
使用npm
安裝
npm i glob
複製程式碼
var glob = require("glob")
// options可選
glob("**/*.js", options, function (er, files) {
// files是匹配到的檔案陣列
// 如果`options`中的`nonull`為true, 當未發現時, files返回["**/*.js"]
// `er`是一個錯誤物件或者null
})
複製程式碼
Glob 入門
"Glob"是一種模式,類似於在命令列中輸入ls *.js
,或是在.gitignore
檔案中寫build/*
。
在解析路徑模式時,大括號內使用逗號進行分隔,分隔部分可以包含/
,所以a{/b/c,bcd}
會被展開為a/b/c
和abcd
。
在匹配路徑使用時,以下字元有一些特殊的作用:
*
:匹配單路徑下的 0 個或 多個 字串。?
:匹配一個字串。[...]
:匹配指定範圍內的字串,類似於正規表示式中的[]
。如果[]
中的第一個字串是!
或者^
,則匹配不在範圍內的任意字串。!(pattern|pattern|pattern)
:匹配與提供模式中不匹配的內容。?(pattern|pattern|pattern)
:匹配提供模式中的 0次 或 1次。+(pattern|pattern|pattern)
:匹配提供模式中的 1次 或 多次。*(a|b|c)
:匹配提供模式中的 0次 或 多次。@(pattern|pat*|pat?erN)
:匹配與提供模式中完全匹配的。**
:和*
一樣,可以匹配路徑中的 0個 或 多個,而且**
可以匹配當前目錄和子目錄。但無法抓去符號連結的目錄。
.
點
如果匹配的檔案或目錄部分以.
開頭,除非匹配的路徑也以.
開頭,否則不會匹配任何模式。
例如 a/.*/c
模式會匹配a/.b/c
。然而a/*/c
模式卻不會進行匹配,因為*
並不是以.
開始的。
你可以通過設定option dot:true
,讓Glob把.
做為正常字串。
Basename的匹配
如果你在 option中設定matchBase:true
,當模式中沒有/
,它會在任意目錄下去匹配。例如*.js
會匹配到test/simple/basic.js
。
空集
如果沒有匹配到任何檔案,它會返回空陣列[]
。它與shell不一樣,shell會在未匹配的情況下返回本身。例如:
$ echo a*s*d*f
a*s*d*f
複製程式碼
可以通過設定optionnonull:true
,來獲得和bash shell一樣的效果。
glob.hasMagic(pattern, [options])
如果pattern
中有任何特殊字串,則返回為true
,否則返回為false
。
注意:options
會影響結果。
如果options中設定noext:true
,那麼+(a|b)
將不會視為魔術模式。
如果模式中支援{}
表示式,那麼也屬於Magic,例如a/{b/c,x/y}
。除非option設定nobrace:true
。
glob(pattern, [options], cb)
pattern {String}
: 匹配模式。options {Object}
cb {Function}
err {Error | null}
matches {Array<String>}
: 匹配模式後的檔名陣列。
執行非同步全域性搜尋。
glob.sync(pattern, [options])
pattern {String}
:匹配模式。options {Object}
return: {Array<String>}
:匹配模式下的檔名。
執行非同步全域性搜尋。
Class: glob.Glob
通過例項化glob.Glob
來建立Glob
物件。
var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)
複製程式碼
它是一個EventEmitter
。它會立即執行遍歷目錄進行匹配。
new glob.Glob(pattern, [options], [cb])
pattern {String}
: 匹配模式。options {Object}
cb {Function}
:成功或失敗的回掉。err {Error | null}
matches {Array<String>}
: 匹配後的檔名陣列。
注意 如果option設定sync
標誌, 那麼匹配結果可以通過g.found
獲取。
屬性
minimatch
:glob使用的minimatch
物件。options
:傳入的option物件。aborted
:布林值,在呼叫abort()
時會設定為true
。 在abort()
後無法再進行全域性搜尋,但是可以通過重新設定statCache
去避免重複系統呼叫。cache
:Object,可能有以下值:false
- 路徑不存在。true
- 路徑存在。'FILE'
- 路徑存在,但不是目錄。'DIR'
- 路徑存在,是目錄。[file, entries, ...]
- 路徑存在,結果是陣列,類似於fs.readdir
的結果。
statCache
:fs.stat
結果快取,避免多次計算相同路徑。symlinks
:記錄哪些路徑是符號連結,與**
模式相關。realpathCache
:傳遞給fs.realpath
的可選引數,避免不必要的系統呼叫。儲存在Glob的例項物件上,可重複使用。
事件
end
:匹配完成後,收到匹配的結果。當nonull
設定時,在沒有匹配結果的情況下會在返回的陣列中包含原匹配模式字串,預設情況下匹配結果是被排序的, 除非設定nosort
。match
: 每次發現匹配結果就會觸發,結果中包含匹配的資訊。它不會刪除重複資料和解析的真實路徑。error
:在發生意外錯誤時觸發。 如果設定options.strict
,那麼任何fs
的錯誤都會觸發。abort
:abort()
呼叫時觸發。
方法
pause
:暫時停止搜尋。resume
:恢復搜尋。abort
:終止搜尋。
選項
所有Minimatch
的選項都可以傳遞給Glob去改變匹配模式,此外還新增了一些特有的glob-specific
。
除非另有說明,否則所有選項預設都為false
。
所有選項也會被新增到Glob物件上。
如果正在執行多個glob操作,可以通過Glob物件的傳遞options給後面的操作使用,方便某些stat
和readdir
呼叫。可以通過共享symlinks
statCache
realpathCache
cache
option加快並行glob操作。
cwd
:要搜尋的當前目錄。預設process.cwd()
。root
:以/
開始的掛載位置。預設是path.resolve(options.cwd, "/")
(Unix系統是/
,其他的一些Windows系統是C:\
)。dot
:在正常模式和**
模式下包含.
。注意,在模式字串中定義的點將始終與.
檔案匹配。nomount
:預設匹配模式中以/
開始的會轉到根目錄的掛載點,以便返回有效的檔案路徑。設定debug
標誌關閉此行為。mark
:在目錄匹配中新增/
。注意,這需要額外的stat
呼叫。nosort
:結果不排序。stat
:設定true
統計stat所有結果。它可能會降低效能,並且完全沒必要, 除非readdir
認為檔案存在的不可靠標誌。silent
:讀取目錄遇到異常錯誤,並向stderr
列印報警資訊。設定optionsilent
,關閉警告資訊。strict
:嘗試讀取目錄遇到異常錯誤時,進行會繼續搜尋其他匹配項。設定strict
後,當出現這些情況時會引發錯誤。cache
可以看上同的cache
屬性。傳入之前生成的快取物件儲存一些fs
呼叫。statCache
:檔案系統資訊結果的快取,防止不必要的stat
呼叫。 通常不需要設定它,如果你知道檔案系統不會在呼叫中改變,你可以將statCache
從一個glob()
中呼叫傳遞給另一個的options物件中。symlinks
已知符號連結的快取。在解析**
匹配時,你可以傳入上一次生成的符號連結物件用來儲存stat
呼叫。sync
棄用:使用glob.sync(pattern, opts)
替代。nounique
:在一些情況中,{}
模式會導致同一個檔案在結果中出現多次。預設情況下,它會防止結果中出現重複值。設定這個屬性會關閉這個行為。nonull
:設定不返回空陣列,而是返回一個包含模式本身的陣列。這是glob(3)
中的預設值。debug
:開啟後會在minimatch
和glob
開啟日誌記錄。nobrace
:不展開大括號,如{a,b}
和{1..3}
。noglobstar
:針對多個檔名不匹配**
(即 會替換為正常的*
)。noext
:不去匹配+(a|b)
“extglob”模式。nocase
:不區分大小寫的匹配。注意:在一些不區分大小寫的系統中no-magic
模式預設會被匹配,stat
和readir
將不會引發錯誤。matchBase
:如果模式中不包含/
字串,則執行僅基於basename匹配。也就是說*.js
會被視為**/*.js
,會匹配所有目錄下的所有js。nodir
:只匹配檔案,不匹配目錄。 (注意:只匹配目錄,只需要在模式的最後加上/
)ignore
:新增模式或glob模式的陣列去排除匹配。注意,ignore
模式下總是dot:true
,其他設定無效。follow
:**
模式下,訪問符號連結目錄。注意 它可能會導致在出現迴圈連結時出現大量重複引用。realpath
:設定為true
會在所有結果中呼叫fs.realpath
。在無法解析的符號連結下,返回匹配結果的完整絕對路徑。(雖然它通常是一個失效的符號連結)absolute
:設定為真,將會在匹配的結果中接收到絕對路徑。與realpath
不同,它也會影響match
事件中的返回值。
部落格名稱:王樂平部落格
CSDN部落格地址:blog.csdn.net/lecepin