glob匹配模式

參考資料:http://fis.baidu.com/fis3/docs/api/config-glob.htmlphp

glob

FIS3 中支持的 glob 規則,FIS3 使用 node-glob 提供 glob 支持。css

簡要說明

node-glob 中的使用方式有不少,若是要了解所有,請前往 node-globhtml

這裏把經常使用的一些用法作說明。java

  • * 匹配0或多個除了 / 之外的字符
  • ? 匹配單個除了 / 之外的字符
  • ** 匹配多個字符包括 /
  • {} 可讓多個規則用 , 逗號分隔,起到或者的做用
  • ! 出如今規則的開頭,表示取反。即匹配不命中後面規則的文件

須要注意的是,fis 中的文件路徑都是以 / 開頭的,因此編寫規則時,請儘可能嚴格的以 / 開頭。node

當設置規則時,沒有嚴格的以 / 開頭,好比 a.js, 它匹配的是全部目錄下面的 a.js, 包括:/a.js/a/a.js/a/b/a.js。 若是要嚴格只命中根目錄下面的 /a.js, 請使用 fis.match('/a.js')git

另外 /foo/*.js, 只會命中 /foo 目錄下面的全部 js 文件,不包含子目錄。 而 /foo/**/*.js 是命中全部子目錄以及其子目錄下面的全部 js 文件,不包含當前目錄下面的 js 文件。 若是須要命中 foo 目錄下面以及全部其子目錄下面的 js 文件,請使用 /foo/**.jsgithub

擴展的規則

  1. 假設匹配 widget 目錄下以及其子目錄下的全部 js 文件,使用 node-glob 須要這麼寫
widget/{*.js,**/*.js}

這樣寫起來比較麻煩,因此擴展了這塊的語法,如下方式等價於上面的用法web

widget/**.js
  1. node-glob 中沒有捕獲分組,而 fis 中常常用到分組信息,以下面這種正則用法:
// 讓 a 目錄下面的 js 發佈到 b 目錄下面,保留原始文件名。
fis.match(/^\/a\/(.*\.js$)/i, {
  release: '/b/$1'
});

因爲原始 node-glob 不支持捕獲分組,因此作了對括號用法的擴展,以下用法和正則用法等價。json

// 讓 a 目錄下面的 js 發佈到 b 目錄下面,保留原始文件名。
fis.match('/a/(**.js)', {
  release: '/b/$1'
});

特殊用法(類 css 僞類)

  1. ::package 用來匹配 fis 的打包過程。
  2. ::text 用來匹配文本文件。
默認識別這類後綴的文件。

```js
[
  'css', 'tpl', 'js', 'php',
  'txt', 'json', 'xml', 'htm',
  'text', 'xhtml', 'html', 'md',
  'conf', 'po', 'config', 'tmpl',
  'coffee', 'less', 'sass', 'jsp',
  'scss', 'manifest', 'bak', 'asp',
  'tmp', 'haml', 'jade', 'aspx',
  'ashx', 'java', 'py', 'c', 'cpp',
  'h', 'cshtml', 'asax', 'master',
  'ascx', 'cs', 'ftl', 'vm', 'ejs',
  'styl', 'jsx', 'handlebars'
]
```

若是你但願命中的文件類型不在列表中,請經過 `fis.set('project.fileType.text')` 擴展,多個後綴用 `,` 分割。

```
fis.set('project.fileType.text', 'cpp,hhp');
```
  1. ::image 用來匹配文件類型爲圖片的文件。
默認識別這類後綴的文件。

```js
[
  'svg', 'tif', 'tiff', 'wbmp',
  'png', 'bmp', 'fax', 'gif',
  'ico', 'jfif', 'jpe', 'jpeg',
  'jpg', 'woff', 'cur', 'webp',
  'swf', 'ttf', 'eot', 'woff2'
]
```

若是你但願命中的文件類型不在列表中,請經過 `fis.set('project.fileType.image')` 擴展,多個後綴用 `,` 分割。

```
fis.set('project.fileType.image', 'raw,bpg');
```
  1. *.html:js 用來匹配命中的 html 文件中的內嵌的 js 部分。
fis3 htmlLike 的文件內嵌的 js 內容也會走單文件編譯流程,默認只作標準化處理,若是想壓縮,能夠進行以下配置。

```js
fis.match('*.html:js', {
    optimizer: fis.plugin('uglify-js')
});
```
  1. *.html:css 用來匹配命中的 html 文件中內嵌的 css 部分。
fis3 htmlLike 的文件內嵌的 css 內容也會走單文件編譯流程,默認只作標準化處理,若是想壓縮,能夠進行以下配置。

```js
fis.match('*.html:css', {
    optimizer: fis.plugin('clean-css')
});
```

注意事項

node-glob 擴展分組功能確實還存在缺陷。分組 () 與 或{} 搭配使用時存在問題。api

好比: /a/({b,c}/**.js) 會拆分紅並列的兩個規則 /a/(b/**.js)/a/(c/**.js),當這兩個合成一個正則的時候,這個時候問題來了, 一個分組變成了兩個分組,分組 1 爲 (b/**.js) 分組 2 爲 (c/**.js)。那麼當但願獲取捕獲信息時,不能按原來的分組序號去獲取了。

// 錯誤
fis.match('/a/({b,c}/**.js)', {
  release: '/static/$1'
});

// 正確
fis.match('/a/({b,c}/**.js)', {
  release: '/static/$1$2'
});
相關文章
相關標籤/搜索