如何在 gulp 中使用 glob

2020-09-30 18:03 更新

Glob 詳解

glob 是由普通字符和/或通配字符組成的字符串,用于匹配文件路徑??梢岳靡粋€或多個 glob 在文件系統(tǒng)中定位文件。

src() 方法接受一個 glob 字符串或由多個 glob 字符串組成的數(shù)組作為參數(shù),用于確定哪些文件需要被操作。glob 或 glob 數(shù)組必須至少匹配到一個匹配項,否則 src() 將報錯。當使用 glob 數(shù)組時,將按照每個 glob 在數(shù)組中的位置依次執(zhí)行匹配 - 這尤其對于取反(negative) glob 有用。

字符串片段與分隔符

字符串片段(segment)是指兩個分隔符之間的所有字符組成的字符串。在 glob 中,分隔符永遠是 / 字符 - 不區(qū)分操作系統(tǒng) - 即便是在采用 \\ 作為分隔符的 Windows 操作系統(tǒng)中。在 glob 中,\\ 字符被保留作為轉(zhuǎn)義符使用。

如下, * 被轉(zhuǎn)義了,因此,* 將被作為一個普通字符使用,而不再是通配符了。

'glob_with_uncommon_\\*_character.js'

避免使用 Node 的 path 類方法來創(chuàng)建 glob,例如 path.join。在 Windows 中,由于 Node 使用 \\ 作為路徑分隔符,因此將會產(chǎn)生一個無效的 glob。還要避免使用 __dirname 和 __filename 全局變量,由于同樣的原因,process.cwd() 方法也要避免使用。

const invalidGlob = path.join(__dirname, 'src/*.js');

特殊字符: * (一個星號)

在一個字符串片段中匹配任意數(shù)量的字符,包括零個匹配。對于匹配單級目錄下的文件很有用。

下面這個 glob 能夠匹配類似 index.js 的文件,但是不能匹配類似 scripts/index.js 或 scripts/nested/index.js 的文件。

'*.js'

特殊字符: ** (兩個星號)

在多個字符串片段中匹配任意數(shù)量的字符,包括零個匹配。 對于匹配嵌套目錄下的文件很有用。請確保適當?shù)叵拗茙в袃蓚€星號的 glob 的使用,以避免匹配大量不必要的目錄。

下面這個 glob 被適當?shù)叵拗圃?nbsp;scripts/ 目錄下。它將匹配類似 scripts/index.js、scripts/nested/index.js 和 scripts/nested/twice/index.js 的文件。

'scripts/**/*.js'

在上面的示例中,如果沒有 scripts/ 這個前綴做限制,node_modules 目錄下的所有目錄或其他目錄也都將被匹配。

特殊字符: ! (取反)

由于 glob 匹配時是按照每個 glob 在數(shù)組中的位置依次進行匹配操作的,所以 glob 數(shù)組中的取反(negative)glob 必須跟在一個非取反(non-negative)的 glob 后面。第一個 glob 匹配到一組匹配項,然后后面的取反 glob 刪除這些匹配項中的一部分。如果取反 glob 只是由普通字符組成的字符串,則執(zhí)行效率是最高的。

['script/**/*.js', '!scripts/vendor/']

如果任何非取反(non-negative)的 glob 跟隨著一個取反(negative) glob,任何匹配項都不會被刪除。

['script/**/*.js', '!scripts/vendor/', 'scripts/vendor/react.js']

取反(negative) glob 可以作為對帶有兩個星號的 glob 的限制手段。

['**/*.js', '!node_modules/']

在上面的示例中,如果取反(negative)glob 是 !node_modules/**/*.js,那么各匹配項都必須與取反 glob 進行比較,這將導(dǎo)致執(zhí)行速度極慢。

匹配重疊(Overlapping globs)

兩個或多個 glob 故意或無意匹配了相同的文件就被認為是匹配重疊(overlapping)了。如果在同一個 src() 中使用了會產(chǎn)生匹配重疊的 glob,gulp 將盡力去除重疊部分,但是在多個 src() 調(diào)用時產(chǎn)生的匹配重疊是不會被去重的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號