前段時間在用workbox時,在作precache時,匹配模式基於的是Glob Pattern模式,因而就看了下相關文檔。node
下面翻譯一下node-glob的使用,原文:github.com/isaacs/node…git
像在shell裏面,用*
等匹配模式來匹配文件。github
Glob基於Javascript實現,使用minimatch
庫進行匹配。正則表達式
使用npm
安裝shell
npm i glob
複製代碼
var glob = require("glob")
// options可選
glob("**/*.js", options, function (er, files) {
// files是匹配到的文件數組
// 若是`options`中的`nonull`爲true, 當未發現時, files返回["**/*.js"]
// `er`是一個錯誤對象或者null
})
複製代碼
"Glob"是一種模式,相似於在命令行中輸入ls *.js
,或是在.gitignore
文件中寫build/*
。npm
在解析路徑模式時,大括號內使用逗號進行分隔,分隔部分能夠包含/
,因此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個 或 多個,並且**
能夠匹配當前目錄和子目錄。但沒法抓去符號連接的目錄。.
點若是匹配的文件或目錄部分以.
開頭,除非匹配的路徑也以.
開頭,不然不會匹配任何模式。bash
例如 a/.*/c
模式會匹配a/.b/c
。然而a/*/c
模式卻不會進行匹配,由於*
並非以.
開始的。異步
你能夠經過設置option dot:true
,讓Glob把.
作爲正常字符串。
若是你在 option中設置matchBase:true
,當模式中沒有/
,它會在任意目錄下去匹配。例如*.js
會匹配到test/simple/basic.js
。
若是沒有匹配到任何文件,它會返回空數組[]
。它與shell不同,shell會在未匹配的狀況下返回自己。例如:
$ echo a*s*d*f
a*s*d*f
複製代碼
能夠經過設置optionnonull:true
,來得到和bash shell同樣的效果。
若是pattern
中有任何特殊字符串,則返回爲true
,不然返回爲false
。
注意:options
會影響結果。 若是options中設置noext:true
,那麼+(a|b)
將不會視爲魔術模式。 若是模式中支持{}
表達式,那麼也屬於Magic,例如a/{b/c,x/y}
。除非option設置nobrace:true
。
pattern {String}
: 匹配模式。options {Object}
cb {Function}
err {Error | null}
matches {Array<String>}
: 匹配模式後的文件名數組。執行異步全局搜索。
pattern {String}
:匹配模式。options {Object}
return: {Array<String>}
:匹配模式下的文件名。執行異步全局搜索。
經過實例化glob.Glob
來建立Glob
對象。
var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)
複製代碼
它是一個EventEmitter
。它會當即執行遍歷目錄進行匹配。
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