globby vs fast-glob
File System Utilities Comparison
1 Year
globbyfast-globSimilar Packages:
What's File System Utilities?

Both fast-glob and globby are npm packages designed for file system operations, specifically for matching file paths using glob patterns. They provide developers with efficient ways to search for files and directories based on specified criteria. Fast-glob is optimized for speed and performance, making it suitable for large file sets, while globby offers a more user-friendly interface that simplifies the process of working with file paths and integrates seamlessly with other tools. Understanding their differences can help developers choose the right tool for their specific needs in file manipulation and searching.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
globby65,930,0262,56029 kB3717 days agoMIT
fast-glob60,115,1122,61698.4 kB292 months agoMIT
Feature Comparison: globby vs fast-glob

Performance

  • globby:

    While globby is built on top of fast-glob, its performance is slightly less optimized due to the additional abstraction layer. However, it still performs well for most use cases and is sufficient for smaller projects or scripts where speed is not the primary concern.

  • fast-glob:

    Fast-glob is designed with performance in mind, utilizing a highly optimized algorithm that can handle large file sets efficiently. It minimizes the number of filesystem calls and leverages caching mechanisms to speed up the matching process, making it suitable for scenarios where performance is crucial.

API Complexity

  • globby:

    Globby offers a simpler and more intuitive API, making it easier for developers to get started quickly. It abstracts away some of the complexity of fast-glob, providing a straightforward interface for common tasks like matching multiple patterns and returning results as promises.

  • fast-glob:

    Fast-glob provides a more complex API that offers advanced features such as streaming results, filtering, and asynchronous operations. This complexity allows for greater flexibility and control over file matching but may require a steeper learning curve for new users.

Pattern Matching

  • globby:

    Globby simplifies pattern matching by allowing users to specify multiple patterns easily. It also integrates well with other libraries and tools, making it a convenient choice for developers who need to work with various file patterns in a cohesive manner.

  • fast-glob:

    Fast-glob supports a wide range of glob patterns and offers advanced matching capabilities, including negation patterns and custom filters. This makes it a powerful tool for developers who need precise control over which files to include or exclude in their searches.

Use Cases

  • globby:

    Globby is well-suited for smaller projects, scripts, or scenarios where ease of use is more important than performance. It works great for quick file searches, build scripts, and integration with other tools that require file path manipulation.

  • fast-glob:

    Fast-glob is ideal for build tools, task runners, and scenarios where performance is critical, such as large-scale file processing or monitoring file changes in real-time. Its advanced features make it suitable for complex file matching requirements.

Community and Support

  • globby:

    Globby also has a supportive community and is widely used in various projects. Its user-friendly nature makes it popular among developers who prefer simplicity and ease of integration with other libraries.

  • fast-glob:

    Fast-glob has a strong community and is actively maintained, ensuring that users have access to updates, bug fixes, and support. Its performance-focused design has garnered a dedicated user base among developers who prioritize speed.

How to Choose: globby vs fast-glob
  • globby:

    Choose globby if you prefer a simpler API that combines the functionality of fast-glob with additional features like handling multiple patterns and returning file paths as promises. It is well-suited for tasks where ease of use and integration with other libraries is a priority.

  • fast-glob:

    Choose fast-glob if you need a high-performance solution for matching files in large directories or require advanced features like streaming and asynchronous operations. It is ideal for scenarios where speed is critical, such as build processes or file watchers.

README for globby

globby

User-friendly glob matching

Based on fast-glob but adds a bunch of useful features.

Features

  • Promise API
  • Multiple patterns
  • Negated patterns: ['foo*', '!foobar']
  • Expands directories: foofoo/**/*
  • Supports .gitignore and similar ignore config files
  • Supports URL as cwd

Install

npm install globby

Usage

├── unicorn
├── cake
└── rainbow
import {globby} from 'globby';

const paths = await globby(['*', '!cake']);

console.log(paths);
//=> ['unicorn', 'rainbow']

API

Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use path.posix.join() instead of path.join().

globby(patterns, options?)

Returns a Promise<string[]> of matching paths.

patterns

Type: string | string[]

See supported minimatch patterns.

options

Type: object

See the fast-glob options in addition to the ones below.

expandDirectories

Type: boolean | string[] | object
Default: true

If set to true, globby will automatically glob directories for you. If you define an Array it will only glob files that matches the patterns inside the Array. You can also define an object with files and extensions like below:

import {globby} from 'globby';

const paths = await globby('images', {
	expandDirectories: {
		files: ['cat', 'unicorn', '*.jpg'],
		extensions: ['png']
	}
});

console.log(paths);
//=> ['cat.png', 'unicorn.png', 'cow.jpg', 'rainbow.jpg']

Note that if you set this option to false, you won't get back matched directories unless you set onlyFiles: false.

gitignore

Type: boolean
Default: false

Respect ignore patterns in .gitignore files that apply to the globbed files.

ignoreFiles

Type: string | string[]
Default: undefined

Glob patterns to look for ignore files, which are then used to ignore globbed files.

This is a more generic form of the gitignore option, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.

globbySync(patterns, options?)

Returns string[] of matching paths.

globbyStream(patterns, options?)

Returns a stream.Readable of matching paths.

For example, loop over glob matches in a for await...of loop like this:

import {globbyStream} from 'globby';

for await (const path of globbyStream('*.tmp')) {
	console.log(path);
}

convertPathToPattern(path)

Convert a path to a pattern. Learn more.

generateGlobTasks(patterns, options?)

Returns an Promise<object[]> in the format {patterns: string[], options: Object}, which can be passed as arguments to fast-glob. This is useful for other globbing-related packages.

Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration.

generateGlobTasksSync(patterns, options?)

Returns an object[] in the format {patterns: string[], options: Object}, which can be passed as arguments to fast-glob. This is useful for other globbing-related packages.

Takes the same arguments as generateGlobTasks.

isDynamicPattern(patterns, options?)

Returns a boolean of whether there are any special glob characters in the patterns.

Note that the options affect the results.

This function is backed by fast-glob.

isGitIgnored(options?)

Returns a Promise<(path: URL | string) => boolean> indicating whether a given path is ignored via a .gitignore file.

Takes cwd?: URL | string as options.

import {isGitIgnored} from 'globby';

const isIgnored = await isGitIgnored();

console.log(isIgnored('some/file'));

isGitIgnoredSync(options?)

Returns a (path: URL | string) => boolean indicating whether a given path is ignored via a .gitignore file.

Takes cwd?: URL | string as options.

isIgnoredByIgnoreFiles(patterns, options?)

Returns a Promise<(path: URL | string) => boolean> indicating whether a given path is ignored via the ignore files.

This is a more generic form of the isGitIgnored function, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.

Takes cwd?: URL | string as options.

import {isIgnoredByIgnoreFiles} from 'globby';

const isIgnored = await isIgnoredByIgnoreFiles("**/.gitignore");

console.log(isIgnored('some/file'));

isIgnoredByIgnoreFilesSync(patterns, options?)

Returns a (path: URL | string) => boolean indicating whether a given path is ignored via the ignore files.

This is a more generic form of the isGitIgnoredSync function, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.

Takes cwd?: URL | string as options.

import {isIgnoredByIgnoreFilesSync} from 'globby';

const isIgnored = isIgnoredByIgnoreFilesSync("**/.gitignore");

console.log(isIgnored('some/file'));

Globbing patterns

Just a quick overview.

  • * matches any number of characters, but not /
  • ? matches a single character, but not /
  • ** matches any number of characters, including /, as long as it's the only thing in a path part
  • {} allows for a comma-separated list of "or" expressions
  • ! at the beginning of a pattern will negate the match

Various patterns and expected matches.

Related

  • multimatch - Match against a list instead of the filesystem
  • matcher - Simple wildcard matching
  • del - Delete files and directories
  • make-dir - Make a directory and its parents if needed