Introduction to Micromatch
Micromatch is a powerful and flexible library for matching file paths and glob patterns in JavaScript. It enhances the core functionality of glob and minimatch by providing a faster, more accurate, and more intuitive pattern matching algorithm. Whether you’re building a static site generator, a file watcher, or a task runner, Micromatch can help you match files effectively.
Key Features and API Examples
Let’s explore some of the most useful APIs that Micromatch provides along with code snippets for each.
1. Basic Matching
The basic usage of micromatch is similar to other glob libraries:
const micromatch = require('micromatch');
const files = ['a.js', 'a.txt', 'b.js', 'c.md'];
console.log(micromatch(files, '*.js'));
// Output: ['a.js', 'b.js']
2. Brace Expansion
Using brace expansion to match multiple patterns:
console.log(micromatch(['a.js', 'b.txt', 'c.md'], '*.{js,txt}'));
// Output: ['a.js', 'b.txt']
3. Extglobs
Extglobs are extended globs that add additional matching features:
console.log(micromatch(['a.txt', 'b.md', 'c.js'], '*.!(md)'));
// Output: ['a.txt', 'c.js']
4. Negation
Micromatch supports pattern negation as well:
console.log(micromatch(['a.js', 'b.txt', 'c.md'], ['*', '!*.txt']));
// Output: ['a.js', 'c.md']
5. Globstar
Micromatch also handles the double-star (globstar) syntax for matching nested directories:
const files = ['a/b/c.js', 'a/b.txt', 'a/c.md', 'b/a.js'];
console.log(micromatch(files, 'a/**.js'));
// Output: ['a/b/c.js']
6. Match Base
Use the matchBase
option to match patterns against the base name of files:
const opts = {matchBase: true};
console.log(micromatch(['a/b/c.js', 'c.md'], '*.js', opts));
// Output: ['a/b/c.js']
Sample Application Using Micromatch
Here’s a simple example of using Micromatch in a file watcher application:
const fs = require('fs');
const micromatch = require('micromatch');
const files = ['index.js', 'style.css', 'README.md', 'app/router.js'];
fs.watch('./', (eventType, filename) => {
if (filename) {
if (micromatch([filename], '**/*.{js,css}').length > 0) {
console.log(`${filename} is a matched file. Event type: ${eventType}`);
} else {
console.log(`${filename} does not match any pattern`);
}
}
});
This script will watch for changes in the current directory and log a message if the changed file matches the specified patterns (*.js and *.css).
Hash: ec8ac62c9acbbe534582eb8331f68b4cd1ecbc1db7cd5f85dddbc70de0c94658