willson-wang / Blog

随笔
https://blog.willson-wang.com/
MIT License
70 stars 10 forks source link

快速理解node glob语法 #104

Open willson-wang opened 2 years ago

willson-wang commented 2 years ago

目录

背景

封装了一个基于rollup的构建工具,在多entry场景下,只需要写一个简单的glob语句就行,而不用自己遍历或者手动写上所有的entry路径,但是在使用的过程中,总是受到.d.ts__tests__目录下的文件干扰,所以在解决了问题之后,总结一下,方便后面在有类似问题的时候可以快速解决

glob语法

理解glob语法的两个关键点

glob匹配看了下大概的源码是通过对传入的glob语句,按照/split,然后在根据cwd参数,通过fs.readdirSync一步步来读取对应的目录与文件,所以理解路径片段很重要

上面的特殊字符其实挺多的,但是只要记一些关键词就可以,比如***?!?+*@(){}[]这五类就可以

更多内容及使用参数,参考文档

常用应用场景

以下面的文件结构作为测试目录

文件目录结构

.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── cspell.json
├── dist
│   ├── components
│   │   ├── alert
│   │   │   └── index.js
│   │   ├── button.d.js
│   │   └── button.js
│   ├── componentsCss.d.ts
│   ├── componentsCss.js
│   ├── index.d.ts
│   ├── index.js
│   ├── normalCss.d.ts
│   ├── normalCss.js
│   ├── type.d.js
│   ├── util.d.ts
│   └── util.js
├── index.js
├── node_modules
├── jest.config.js
├── package.json
├── result.json
├── src
│   ├── __tests__
│   │   ├── fixtures
│   │   │   ├── css
│   │   │   │   ├── expect.ts
│   │   │   │   ├── index.css
│   │   │   │   └── index.js
│   │   │   ├── css-module
│   │   │   │   ├── expect.ts
│   │   │   │   ├── index.js
│   │   │   │   └── index.module.css
│   │   │   ├── less
│   │   │   │   ├── expect.ts
│   │   │   │   ├── index.js
│   │   │   │   └── index.less
│   │   │   └── less-module
│   │   │       ├── expect.ts
│   │   │       ├── index.js
│   │   │       └── index.module.less
│   │   └── index.test.ts
│   ├── abc.jsx
│   ├── abc.tsx
│   ├── components
│   │   ├── alert
│   │   │   ├── index.d.ts
│   │   │   └── index.ts
│   │   ├── button.d.ts
│   │   ├── button.ts
│   │   └── index.tsx
│   ├── componentsCss.ts
│   ├── index.ts
│   ├── my.js
│   ├── normalCss.ts
│   ├── type.d.ts
│   └── util.ts
├── test
│   └── index.test.ts
├── tsconfig.json
└── yarn.lock

匹配src目录下所有的ts文件,不包括子目录

'src/*.ts'
=>
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

注意'/src/*.ts' 这种写法匹配不到结果,'./src/.ts'这种写法与'src/.ts'写法匹配到的结果是等价的,但是传入ignore参数的时候就会有区别了,推荐使用'src/*.ts',不使用相对路径的写法

匹配src目录下所有的ts、js文件,不包括子目录

'src/*.[t|j]s' or 'src/*.[tj]s' 这两种写法是等价的
=>
'src/componentsCss.ts',
'src/index.ts',
'src/my.js',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

匹配src目录下所有的ts、js、tsx、jsx文件,不包括子目录

'src/*.[t|j]s?(x)' or src/*.[tj]s?(x)
=>
'src/abc.jsx',
'src/abc.tsx',
'src/componentsCss.ts',
'src/index.ts',
'src/my.js',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

匹配src目录下除以js结尾的其它符号s结尾的文件,不包括子目录

src/*.[^j]s or 'src/*.[!j]s'
=>
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

匹配src目录下除index.ts与abc.ts之外的其它.ts文件,不包括子目录

'src/!(index|abc).ts'
=>
'src/componentsCss.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

src目录下abc.tsx or ab任意字符.ts结尾的文件,不包括子目录

'src/ab?.tsx'
=>
'src/abc.tsx'

src目录及所有子目录下的以ts结尾的文件

src/**/*.ts
=>
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/index.test.ts',
'src/components/alert/index.d.ts',
'src/components/alert/index.ts',
'src/components/button.d.ts',
'src/components/button.ts',
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

src目录下以ts结尾的文件,及子目录test下以ts结尾的文件,不包括其它src下的子目录

src/{*.ts,__tests__/*.ts}
=>
'src/__tests__/index.test.ts',
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

src除tests之外二级目录下以.ts结尾的文件,不包含三级及以上目录

src/!(__tests__)/*.ts
=>
'src/components/button.d.ts', 'src/components/button.ts'

src除tests之外二级及二级以上目录下以.ts结尾的文件

src/!(__tests__)/**/*.ts
=>
'src/components/alert/index.d.ts',
'src/components/alert/index.ts',
'src/components/button.d.ts',
'src/components/button.ts'

匹配src一级目录及除tests之外二级及二级以下目录下除.d.ts之外以.ts结尾的文件

src/{!(*.d).ts,!(__tests__)/**/!(*.d).ts}
=>
'src/components/alert/index.ts',
'src/components/button.ts',
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/util.ts'
glob.sync('src/**/*.ts', {
    cwd: process.cwd(),
    ignore: ['{!(node_modules|dist)/**/*.d.ts,{!(node_modules|dist)/?(test|tests|__tests__|__test__),test,tests,__tests__,__test__}/**/*.ts}']
})

匹配不了任何文件

__tests__
=>
[]

匹配cwd目录下任何__tests__目录下的任何目录及文件

**/__tests__/**
=>
'node_modules/import-sort-style-custom/dist/__tests__',
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts',
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts.map',
'node_modules/import-sort-style-custom/src/__tests__',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.custom.json',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.json',
'node_modules/import-sort-style-custom/src/__tests__/index.test.ts',
'node_modules/prettier-plugin-sorted/src/__tests__',
'node_modules/prettier-plugin-sorted/src/__tests__/index.test.ts',
'src/__tests__',
'src/__tests__/fixtures',
'src/__tests__/fixtures/css',
'src/__tests__/fixtures/css-module',
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css-module/index.js',
'src/__tests__/fixtures/css-module/index.module.css',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/css/index.css',
'src/__tests__/fixtures/css/index.js',
'src/__tests__/fixtures/less',
'src/__tests__/fixtures/less-module',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less-module/index.js',
'src/__tests__/fixtures/less-module/index.module.less',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/fixtures/less/index.js',
'src/__tests__/fixtures/less/index.less',
'src/__tests__/index.test.ts'

匹配cwd目录下任何__tests__子目录下的任何目录及文件

**/__tests__/**/*
=> 
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts',
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts.map',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.custom.json',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.json',
'node_modules/import-sort-style-custom/src/__tests__/index.test.ts',
'src/__tests__/fixtures',
'src/__tests__/fixtures/css',
'src/__tests__/fixtures/css-module',
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css-module/index.js',
'src/__tests__/fixtures/css-module/index.module.css',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/css/index.css',
'src/__tests__/fixtures/css/index.js',
'src/__tests__/fixtures/less',
'src/__tests__/fixtures/less-module',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less-module/index.js',
'src/__tests__/fixtures/less-module/index.module.less',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/fixtures/less/index.js',
'src/__tests__/fixtures/less/index.less',
'src/__tests__/index.test.ts'

匹配cwd目录下任何__tests__子目录下的任何目录及文件

'**/__tests__/**/*.*'
=>
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts',
'node_modules/import-sort-style-custom/dist/__tests__/index.test.d.ts.map',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.custom.json',
'node_modules/import-sort-style-custom/src/__tests__/__fixtures__/tsconfig.json',
'node_modules/import-sort-style-custom/src/__tests__/index.test.ts',
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css-module/index.js',
'src/__tests__/fixtures/css-module/index.module.css',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/css/index.css',
'src/__tests__/fixtures/css/index.js',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less-module/index.js',
'src/__tests__/fixtures/less-module/index.module.less',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/fixtures/less/index.js',
'src/__tests__/fixtures/less/index.less',
'src/__tests__/index.test.ts'

匹配cwd目录下任何__tests__目录

**/__tests__ or **/__tests__/
=>
'node_modules/import-sort-style-custom/dist/__tests__',
'node_modules/import-sort-style-custom/src/__tests__',
'src/__tests__'

匹配cwd目录下所有.ts结尾的文件

**/*.ts
=>
'dist/componentsCss.d.ts',
'dist/index.d.ts',
'dist/normalCss.d.ts',
'dist/util.d.ts',
'node_modules/@ampproject/remapping/dist/types/build-source-map-tree.d.ts',
'node_modules/@ampproject/remapping/dist/types/fast-string-array.d.ts',
'node_modules/@ampproject/remapping/dist/types/original-source.d.ts',
'node_modules/@ampproject/remapping/dist/types/remapping.d.ts',
... 6174 more items

匹配cwd目录下除node_modules之外一级目录下的以.ts结尾的文件

!(node_modules)/*.ts
=>
'dist/componentsCss.d.ts',
'dist/index.d.ts',
'dist/normalCss.d.ts',
'dist/util.d.ts',
'src/componentsCss.ts',
'src/index.ts',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts',
'test/index.test.ts'

匹配所有.d.ts文件及test相关目录下的ts文件

{!(node_modules|dist)/**/*.d.ts,{!(node_modules|dist)/?(test|tests|__tests__|__test__),test,tests,__tests__,__test__}/**/*.ts}
=>
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/index.test.ts',
'src/components/alert/index.d.ts',
'src/components/button.d.ts',
'src/type.d.ts',
'test/index.test.ts'

匹配src下的所有目录及文件

src/**/*
=>
'src/__tests__',
'src/__tests__/fixtures',
'src/__tests__/fixtures/css',
'src/__tests__/fixtures/css-module',
'src/__tests__/fixtures/css-module/expect.ts',
'src/__tests__/fixtures/css-module/index.js',
'src/__tests__/fixtures/css-module/index.module.css',
'src/__tests__/fixtures/css/expect.ts',
'src/__tests__/fixtures/css/index.css',
'src/__tests__/fixtures/css/index.js',
'src/__tests__/fixtures/less',
'src/__tests__/fixtures/less-module',
'src/__tests__/fixtures/less-module/expect.ts',
'src/__tests__/fixtures/less-module/index.js',
'src/__tests__/fixtures/less-module/index.module.less',
'src/__tests__/fixtures/less/expect.ts',
'src/__tests__/fixtures/less/index.js',
'src/__tests__/fixtures/less/index.less',
'src/__tests__/index.test.ts',
'src/abc.jsx',
'src/abc.tsx',
'src/components',
'src/components/alert',
'src/components/alert/index.d.ts',
'src/components/alert/index.ts',
'src/components/button.d.ts',
'src/components/button.ts',
'src/components/index.tsx',
'src/componentsCss.ts',
'src/index.ts',
'src/my.js',
'src/normalCss.ts',
'src/type.d.ts',
'src/util.ts'

总结

glob语法在很多前端工具中都有用到,比如prettiereslintstylelintbabeltypescript等,都是作为查找输入文件的语法,虽然语法上可能会有差异,但是大同小异,掌握了之后基本上可以快速写出符合要求的glob语句,而不用每次想要的时候再去找文档,记这个的原因也是,下次有场景不记得了,直接来这里找下