Glob существовал до регулярных выражений, в основном используемых для сопоставления путей к файлам, таких как знаменитыйgulpОн использует правила GLAC, чтобы соответствовать, найти и обработать файлы с различными суффиксами. В процессе фронтальной техники Node.js неизбежно будет использоваться для чтения файлов, например, чтобы найтиsrc
все в каталогеjs
а такжеjsx
файл, как должен быть написан код? Сначала установите зависимости:
yarn add glob
Затем это делают 3 строки кода:
const glob = require('glob')
const files = glob.sync('src/**/*.js{,x}')
console.log(files)
Вы чувствуете себя сильным? Что еще более важно, синтаксис glob поддерживается в командной строке и не требует установки каких-либо зависимостей.Например, босс просит вас создатьa1.js
прибытьa9.js
,b1.js
прибытьb9.js
Как работать с этими 18 тестовыми файлами? Глупо создавать по одному, glob может сделать это одним предложением:
$ touch {a,b}{1..9}.js
$ ls
a1.js a3.js a5.js a7.js a9.js b2.js b4.js b6.js b8.js
a2.js a4.js a6.js a8.js b1.js b3.js b5.js b7.js b9.js
Что еще более важно, синтаксис glob очень прост, если вы помните значение следующих семи символов, вы можете его освоить:
- Основной синтаксис:
/
,*
,?
,[]
- Расширенный синтаксис:
**
,{}
,()
Далее я объясню один за другим:
Базовая грамматика
Разделители и фрагменты
концепция: Разделитель есть/
,пройти черезsplit('/')
Каждый элемент результирующего массива является фрагментом.
Пример:
-
src/index.js
Есть два сегмента, которыеsrc
а такжеindex.js
-
src/**/*.js
Есть три сегмента, которыеsrc
,**
а также*.js
одиночная звездочка
концепция: одна звездочка*
Используется для сопоставления нуля или более символов в одном фрагменте.
Пример:
-
src/*.js
выражатьsrc
Все каталоги, начинающиеся сjs
конец файла, но не может соответствоватьsrc
файлы в подкаталогах, напримерsrc/login/login.js
-
/home/*/.bashrc
Совпадение со всеми файлами .bashrc пользователей
должны знать о том,
*
не может соответствовать разделителю/
, что означает, что символы не могут сопоставляться между фрагментами.
вопросительный знак
концепция:вопросительный знак?
Совпадение с одним символом в одном фрагменте.
Пример:
-
test/?at.js
соответствовать какtest/cat.js
,test/bat.js
и т.д. все 3 символа и последние две цифрыat
js файл, но не может соответствоватьtest/flat.js
-
src/index.??
соответствоватьsrc
Каталог начинается с индекса, а имя суффикса представляет собой двухсимвольный файл, например, он может совпадатьsrc/index.js
а такжеsrc/index.md
, но не совпадаетsrc/index.jsx
Кронштейны
концепция: также соответствует одному символу в одном фрагменте, но набор символов можно выбрать только внутри скобок, если набор символов имеет-
, указывающий диапазон.
Пример:
-
test/[bc]at.js
может только соответствоватьtest/bat.js
а такжеtest/cat.js
-
test/[c-f]at.js
может соответствоватьtest/cat.js
,test/dat.js
,test/eat.js
а такжеtest/fat.js
восклицательный знак
концепция: Указывает отрицание, то есть исключает те файлы, которые могут быть сопоставлены после удаления восклицательного знака.
Пример:
-
test/[!bc]at.js
не может соответствоватьtest/bat.js
а такжеtest/cat.js
, но может соответствоватьtest/fat.js
-
!test/tmp/**'
исключатьtest/tmp
Все каталоги и файлы в каталоге
расширенный синтаксис
Основная грамматика очень проста и простота вспоминает, но она ограничена, чтобы обогатить функцию GOB, полученную следующие три расширенных синтаксиса:
две звездочки
концепция: две звездочки**
Может совпадать с нулем или более символов во фрагментах, то есть**
Он рекурсивно сопоставляет все файлы и каталоги, если за ним стоит разделитель, т.е.**/
Если это так, это означает, что только рекурсивно соответствуют все каталоги (за исключением скрытых каталогов).
Пример:
-
/var/log/**
соответствовать/var/log
Все файлы и папки в каталоге, а также все подфайлы и подпапки в папке -
/var/log/**/*.log
соответствовать/var/log
и все подкаталоги с.log
конец файла -
/home/*/.ssh/**/*.key
соответствует всем пользователям.ssh
каталог и его подкаталоги, начинающиеся с.key
конец файла
большие скобки
концепция: Соответствует всем шаблонам в фигурных скобках, разделенных запятыми, поддерживает вложенные фигурные скобки, поддерживает использование..
соответствует последовательным символам, т.е.{start..end}
грамматика.
Пример:
-
a.{png,jp{,e}g}
соответствоватьa.png
,a.jpg
,a.jpeg
-
{a..c}{1..2}
соответствоватьa1 a2 b1 b2 c1 c2
Уведомление:
{}
а также[]
Есть одно важное отличие: если соответствующий файл не существует,[]
потеряет функцию шаблона и станет простой строкой, а{}
еще можно расширить.
Круглые скобки
концепция: круглые скобки должны следовать?
,*
,+
,@
,!
используется позже, а содержимое в скобках представляет собой группу|
Набор шаблонов для разделителей, например:abc|a?c|ac*
.
Пример:
-
?(pattern|pattern|pattern)
: Сопоставьте данный шаблон 0 или 1 раз -
*(pattern|pattern|pattern)
: соответствует заданному шаблону 0 или более раз -
+(pattern|pattern|pattern)
: соответствует заданному шаблону 1 или более раз -
@(pattern|pattern|pattern)
: Строгое соответствие заданному образцу -
!(pattern|pattern|pattern)
: соответствует не заданному шаблону
Сценарии применения
Автоматическая настройка упаковки многостраничного приложения Webpack
В проекте веб-пакета, если у нас есть несколько записей, каждая запись имеетindex.html
шаблоны иindex.js
файл, и эта запись меняется динамически, я не хочу менять каждый раз, когда добавляется записьwebpack.config.js
конфигурационный файл, что мне делать?
На этом этапе вы можете согласиться с папкой, созданной в src, если естьindex.js
, мы упаковываем его как входной файл:
src
├── detail
│ ├── index.html
│ └── index.js
├── home
│ ├── index.html
│ └── index.js
├── login
│ ├── index.html
│ └── index.js
├── shop
│ ├── index.html
│ └── index.js
Используя glob, вы можете быстро написать следующий код автоматической упаковки:
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
const glob = require('glob')
// 动态生成 entry 和 html-webpack-plugin
function getMpa() {
const entry = {}, htmlPlugins = []
const files = glob.sync('src/*/index.js')
files.forEach((file) => {
const filename = file.split('/')[1]
entry[filename] = path.join(__dirname, file)
htmlPlugins.push(
new HtmlWebpackPlugin({
template: path.join(__dirname, `src/${filename}/index.html`),
filename: `${filename}.html`,
chunks: [filename],
})
)
})
return { entry, htmlPlugins }
}
const mpa = getMpa()
// 动态的配置文件
module.exports = {
entry: mpa.entry,
output: {
path: path.join(__dirname, 'dist'),
filename: '[name]-[hash:6].js',
},
plugins: [...mpa.htmlPlugins],
}
Таким образом, независимо от того, сколько записей добавлено,webpack.config.js
Нет необходимости менять.
Напишите инфраструктуру Node.js с соглашениями больше, чем с конфигурацией
egg.jsЭто отличная среда разработки корпоративного уровня Node.js, в которой применяется идея соглашения, а не конфигурации, например:
- По соглашению промежуточное программное обеспечение размещается в
app/middleware
отдельные файлы в каталоге - согласованный
app/router.js
файл для унификации всех правил маршрутизации - Согласовано, что Сервисный файл должен быть размещен в
app/service
Каталог, который может поддерживать многоуровневые каталоги и может быть доступен через каскадные имена каталогов при доступе.
Поскольку крупная команда должна следовать определенным ограничениям и соглашениям, эффективность разработки выше.С этими соглашениями мы можем использовать glob для написания правил сопоставления, поиска файлов, которые пользователи помещают в указанный каталог, и загрузки их динамически. самая основная функция нагрузки выглядит следующим образом:
function load(folder, options) {
const extname = options.extname || '.{js,ts}'
return glob.sync(require('path').join(folder, `./**/*.js`)).forEach((item) => require(item))
}
Используя glob с соответствующими спецификациями, такими как RESTful, мы также можем инкапсулировать простой, основанный на соглашениях фреймворк Node.js.