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 символа и последние две цифрыatjs файл, но не может соответствовать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.