Clean up/prune unnecessary files and reduce the size of your `node_modules` directory. Useful for CI caches or for reducing the size of serverless functions.
npm install clean-modules> Clean up/prune unnecessary files and reduce the size of your node_modules directory. Useful for
> CI caches or for reducing the size of serverless functions.
- ๐งน Removes directories and files that are unnecessary and safe to remove in production
- ๐ Easily customizable through glob patterns (either through CLI args or a
configuration file)
- ๐ Cleans up empty directories after removing files
- โก๏ธ Super fast, but still written in Node
- ๐ Allows analyzing results, like which pattern excluded which file
- ๐งโ๐ป Supports both CLI and programmatic usage



Click to open
- Quick start
- Installation
- Commands
- clean-modules clean (default command) ๐งน
- Usage
- Positionals
- Options
- --directory | -D
- --glob-file | -f
- --no-defaults | -n
- --keep-empty | -k
- --dry-run | -d
- --json | -j
- --yes | -y
- clean-modules analyze ๐
- Usage
- Positionals
- Options
- Example output
- Glob patterns and configuration file
- Example configuration file
- Default globs
- Common extra inclusions
- Common extra exclusions
- Programmatic usage
- Alternatives
- Comparisons
- clean-modules (this project)
- yarn autoclean
- modclean
- node-prune
- nm-prune
Simply run the command in the directory where your node_modules are:
``bash`
clean-modules
You can also pass any options that you need, like custom globs or a path to a specific
node_modules directory.
`bash`
clean-modules --directory "path/to/node_modules" "extra/included/file/glob.txt" "!extra/excluded/glob.ts
Check out the command section for all available options.
clean-modules can be installed globally if you only want to use it as a CLI tool. You can also
install it locally if you want to use it in a package command.
`bashglobal
npm install --global clean-modules
Commands
$3
The default command, cleans up your
node_modules based on a set of _most likely_ safe glob
patterns and removes empty directories.#### Usage
`bash
clean-modules [options] <...globs>
`#### Positionals
Extra glob patterns can be passed as positional arguments. By default they are combined with the globs loaded from the the default globs file and any custom globs file passed through the
--glob-file option.For information on how the globs are parsed, see the Glob patterns section.
Example:
`bash
include all TypeScript declaration files and @types folders
clean-modules "/.d.ts" "/@types/*"exclude all sourcemap files and PNG files
clean-modules "!/.map.js" "!/.png"include .d.ts files but exclude PNG files
clean-modules "/.d.ts" "!/.png"
`#### Options
#####
--directory | -Dstring [default: ./node_modules]Accepts a path to a directory to run the script on.
Example:
`bash
clean-modules --directory "path/to/custom/node_modules"
`#####
--glob-file | -fstring [default: ./.cleanmodules]Accepts a path to a file from which clean-modules should read any custom globs. See the
glob patterns section for information about how the glob
file works and what patterns work.
#####
--no-defaults | -nbooleanExcludes all default globs, using only custom globs added through the
glob file or by the include or exclude options. Useful if
you want complete control over what files to include.
.cleanmodules-default to see what patterns are included by
default by default.#####
--keep-empty | -kbooleanSkips removing empty folders after removing files.
#####
--dry-run | -dbooleanRuns the script and prints the result without actually removing any files. Does not count the number
of removed empty directories.
#####
--json | -jbooleanOnly logs a final JSON dump at the end of the script (useful for logs or services).
#####
--yes | -ybooleanSkips the confirmation prompt at the start of the script.
$3
Compiles a list of all files that would be included by
clean-modules and gives a breakdown of:- exact file path
- what glob patterns it was included by
- how the patterns were formatted and passed along to
picomatch
- if the file was included by default#### Usage
`bash
clean-modules analyze [options]
`Because of the amount of data it can be useful to pipe it somewhere, like:
`bash
clean-modules analyze >> clean-modules-result.json
`#### Positionals
The
analyze command accepts the same type of positionals as the [default command]().#### Options
The
analyze command accepts several of the default command's options and applies them in the same
way:--directory
- --glob-file
- --no-defaults#### Example output
`json
[
{
"filePath": "/Users/me/projects/foo/node_modules/dependency/__tests__/test1.js",
"includedByDefault": true,
"includedByGlobs": [
{
"original": "__tests__/",
"derived": "/Users/me/projects/foo/node_modules/dependency//__tests__/"
}
]
}
// ...
]
`Glob patterns and configuration file
clean-modules accepts globs from either a configuration file (
.cleanmodules next to
node_modules by default) or CLI arguments. It uses
.gitignore-like glob patterns
that are converted to valid picomatch globs, which is
what is used to match file paths under the hood.Differences from regular gitignore syntax:
- To include a directory the pattern _must_ end with
/, / or /*
- This is to prevent directories matching common file names from being included by the globs.
- Casing is ignored.Like with .gitignore, globs should use forward-slashes as separators on all operative systems (including Windows)!
$3
`ignore
this is a comment (starts with a #)
to include include directories, end patterns with / or / or /*
dep1/
dep1/*
dep2/**files are matched in any directory by default
*/.test.js
is the same as
*.test.jsuse a leading / to include a file or directory at a specific place
/dep4/this/specific/directory/**
/dep4/this/specific/file.jsto exclude a path, prepend it with a !
!/not/this/directory/
!not-me.jsto use leading exclamation marks without excluding, escape them
\!(*.d).ts
`$3
.cleanmodules-default file. It
only contains inclusions (as exclusions would override custom inclusions) and consists of a large
list of the most common files that are safe to remove.That said, it's impossible to guarantee that none of the files are needed, and you might need to do
custom exclusions depending on what packages you use.
#### Common extra inclusions
-
/.d.ts: If you don't use TypeScript.* TypeScript declaration files take up a lot of space folder, but they are most likely required to build your application. Useful
locally even if you don't use TypeScript since they can be parsed by your IDE.#### Common extra exclusions
-
!/.map.js: If you are running clean-modules locally or need source files in production.*
clean-modules removes sourcemap files by default since they take up a lot of space and does not
break builds when removed. They can be nice to have though, especially while developing.Programmatic usage
Clean modules can be used programmatically too!
Simply import the corresponding function from the package:
``ts
import { clean, analyze } from 'clean-modules';// analyze, all options are optional
const analyzeResult = await analyze({
directory: '/path/to/node_modules',
globFile: '/path/to/.cleanmodules',
globs: ['*/.js'],
noDefaults: false,
});
// clean, all options are optional
const cleanResult = await clean({
directory: '/path/to/node_modules',
globFile: '/path/to/.cleanmodules',
globs: ['*/.js'],
noDefaults: false,
keepEmpty: false,
dryRun: false,
});
``Alternatives
The most common issues I found with available tools are:
- They only allow inclusion/exclusion of file names, not file paths. This prevents you from e.g.
excluding subdirectories of a specific folder, like
@types/react-native.
- They include too many, or too few, patterns by default. Lots of them also include patterns like
*.ts by default, which breaks TypeScript declaration files on build.
- They are too slow (only relevant when running on large projects)
- They are abandoned or don't respond to issues.$3
#### clean-modules (this project)
- โ
Inclusion/exclusion through file path globs
- โ
Fast
- โ
Safe list of files and folders included by default (for production use)
- โ
Cleans up empty directories
#### yarn autoclean
- โ
Included with Yarn by default
- โ
Inclusion/exclusion through globs
- โ๏ธ Very slow compared to alternatives
- โ๏ธ Runs on every install, both locally and in CI
- โ๏ธ Small list of files included by default
#### modclean
- โ
Cleans up empty directories
- โ
Safe list of files and folders included by default
- โ๏ธ Slow, only slightly faster than
yarn clean
- โ๏ธ Only allows inclusion/exclusion by file name globs, not file path
- โ๏ธ Complains about empty folders that doesn't exist
- โ๏ธ Abandoned#### node-prune
- โ
Fastest option available
- โ๏ธ Written in Go and might require separate binary download
- โ๏ธ Removes some dangerous files by default (like
.d.ts files and assets folder)
- โ๏ธ Only allows inclusion/exclusion by file name globs, not file path
- โ๏ธ Globs are very limited since it uses Go's filepath.Match
- โ๏ธ Does not remove empty folders#### nm-prune
- โ
Fast
- โ๏ธ Removes some dangerous files by default (like
.d.ts files and assets` folder)