Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Create graphs from your CommonJS, AMD or ES6 module dependencies

License

NotificationsYou must be signed in to change notification settings

pahen/madge

Repository files navigation

madge

Last versionDonate

Madge is a developer tool for generating a visual graph of your module dependencies, finding circular dependencies, and giving you other useful info. Joel Kemp's awesomedependency-tree is used for extracting the dependency tree.

  • Works for JavaScript (AMD, CommonJS, and ES6 modules)
  • Also works for CSS preprocessors (Sass, Stylus, and Less)
  • NPM installed dependencies are excluded by default (can be enabled)
  • All core Node.js modules (assert, path, fs, etc) are excluded
  • Will traverse child dependencies automatically

Read thechangelog for latest changes.

I've worked with Madge on my free time for the last couple of years and it's been a great experience. It started as an experiment but turned out to be a very useful tool for many developers. I have many ideas for the project and it would definitely be easier to dedicate more time to it with somefinancial support 🙏

Regardless of your contribution, thanks for your support!

Examples

Graph generated from madge's own code and dependencies.

graph

A graph with circular dependencies. Blue has dependencies, green has no dependencies, and red has circular dependencies.

graph-circular

See it in action

in-action

Installation

npm -g install madge

Graphviz (optional)

Graphviz is only required if you want to generate visual graphs (e.g. in SVG or DOT format).

Mac OS X

brew install graphviz|| port install graphviz

Ubuntu

apt-get install graphviz

API

madge(path: string|array|object, config: object)

path is a single file or directory, or an array of files/directories to read. A predefined tree can also be passed in as an object.

config is optional and should be theconfiguration to use.

Returns aPromise resolved with the Madge instance object.

Functions

.obj()

Returns anObject with all dependencies.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.obj());});

.warnings()

Returns anObject of warnings.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.warnings());});

.circular()

Returns anArray of all modules that have circular dependencies.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.circular());});

.circularGraph()

Returns anObject with only circular dependencies.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.circularGraph());});

.depends()

Returns anArray of all modules that depend on a given module.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.depends('lib/log.js'));});

.orphans()

Return anArray of all modules that no one is depending on.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.orphans());});

.leaves()

Return anArray of all modules that have no dependencies.

constmadge=require('madge');madge('path/to/app.js').then((res)=>{console.log(res.leaves());});

.dot([circularOnly: boolean])

Returns aPromise resolved with a DOT representation of the module dependency graph. SetcircularOnly to only include circular dependencies.

constmadge=require('madge');madge('path/to/app.js').then((res)=>res.dot()).then((output)=>{console.log(output);});

.image(imagePath: string, [circularOnly: boolean])

Write the graph as an image to the given image path. SetcircularOnly to only include circular dependencies. Theimage format to use is determined from the file extension. Returns aPromise resolved with a full path to the written image.

constmadge=require('madge');madge('path/to/app.js').then((res)=>res.image('path/to/image.svg')).then((writtenImagePath)=>{console.log('Image written to '+writtenImagePath);});

.svg()

Return aPromise resolved with the XML SVG representation of the dependency graph as aBuffer.

constmadge=require('madge');madge('path/to/app.js').then((res)=>res.svg()).then((output)=>{console.log(output.toString());});

Configuration

PropertyTypeDefaultDescription
baseDirStringnullBase directory to use instead of the default
includeNpmBooleanfalseIf shallow NPM modules should be included
fileExtensionsArray['js']Valid file extensions used to find files in directories
excludeRegExpArrayfalseAn array of RegExp for excluding modules
requireConfigStringnullRequireJS config for resolving aliased modules
webpackConfigStringnullWebpack config for resolving aliased modules
tsConfigString|ObjectnullTypeScript config for resolving aliased modules - Either a path to a tsconfig file or an object containing the config
layoutString dotLayout to use in the graph
rankdirString LRSets thedirection of the graph layout
fontNameStringArialFont name to use in the graph
fontSizeString14pxFont size to use in the graph
backgroundColorString#000000Background color for the graph
nodeShapeStringboxA string specifying theshape of a node in the graph
nodeStyleStringroundedA string specifying thestyle of a node in the graph
nodeColorString#c6c5feDefault node color to use in the graph
noDependencyColorString#cfffacColor to use for nodes with no dependencies
cyclicNodeColorString#ff6c60Color to use for circular dependencies
edgeColorString#757575Edge color to use in the graph
graphVizOptionsObjectfalseCustom Graphvizoptions
graphVizPathStringnullCustom Graphviz path
detectiveOptionsObjectfalseCustomdetective options fordependency-tree andprecinct
dependencyFilterFunctionfalseFunction called with a dependency filepath (exclude subtrees by returning false)

You can use configuration file either in.madgerc in your project or home folder or directly inpackage.json. Lookhere for alternative locations for the file.

.madgerc

{"fontSize":"10px","graphVizOptions": {"G": {"rankdir":"LR"    }  }}

package.json

{"name":"foo","version":"0.0.1",..."madge": {"fontSize":"10px","graphVizOptions": {"G": {"rankdir":"LR"      }    }  }}

CLI

Examples

List dependencies from a single file

madge path/src/app.js

List dependencies from multiple files

madge path/src/foo.js path/src/bar.js

List dependencies from all *.js files found in a directory

madge path/src

List dependencies from multiple directories

madge path/src/foo path/src/bar

List dependencies from all *.js and *.jsx files found in a directory

madge --extensions js,jsx path/src

Finding circular dependencies

madge --circular path/src/app.js

Show modules that depends on a given module

madge --depends wheels.js path/src/app.js

Show modules that no one is depending on

madge --orphans path/src/

Show modules that have no dependencies

madge --leaves path/src/

Excluding modules

madge --exclude'^(foo|bar)\.js$' path/src/app.js

Save graph as a SVG image (requiresGraphviz)

madge --image graph.svg path/src/app.js

Save graph with only circular dependencies

madge --circular --image graph.svg path/src/app.js

Save graph as aDOT file for further processing (requiresGraphviz)

madge --dot path/src/app.js> graph.gv

Using pipe to transform tree (this example will uppercase all paths)

madge --json path/src/app.js| tr'[a-z]''[A-Z]'| madge --stdin

Debugging

To enable debugging output if you encounter problems, run madge with the--debug option then throw the result in a gist when creating issues on GitHub.

madge --debug path/src/app.js

Running tests

npm installnpmtest

Creating a release

npm run release

FAQ

Missing dependencies?

It could happen that the files you're not seeing have been skipped due to errors or that they can't be resolved. Run madge with the--warning option to see skipped files. If you need even more info run with the--debug option.

Using both Javascript and Typescript in your project?

Madge usesdependency-tree which usesfiling-cabinet to resolve modules. However it requires configurations for each file type (js/jsx) and (ts/tsx). So provide bothwebpackConfig andtsConfig options to madge.

Using mixed import syntax in the same file?

Only one syntax is used by default. You can use both though if you're willing to take the degraded performance. Put this in your madge config to enable mixed imports.

For ES6 + CommonJS:

{"detectiveOptions": {"es6": {"mixedImports":true    }  }}

For TypeScript + CommonJS:

{"detectiveOptions": {"ts": {"mixedImports":true    }  }}

How to ignoreimport type statements in ES6 + Flow?

Put this in your madge config.

{"detectiveOptions": {"es6": {"skipTypeImports":true    }  }}

How to ignoreimport in type annotations in TypeScript?

Put this in your madge config.

{"detectiveOptions": {"ts": {"skipTypeImports":true    }  }}

How to ignore dynamic imports in Typescript?

Put this in your madge config.

{"detectiveOptions": {"ts": {"skipAsyncImports":true    },"tsx": {"skipAsyncImports":true    }  }}

Note:tsx is optional, use this when working with JSX.

Mixing TypesScript and Javascript imports?

Ensure you have this in your.tsconfig file.

{"compilerOptions": {"module":"commonjs","allowJs":true  }}

What's the "Error: write EPIPE" when exporting graph to image?

Ensure you haveinstalled Graphviz. If you're running Windows, note that Graphviz is not added to thePATH variable during install. You should add the folder ofgvpr.exe (typically%Graphviz_folder%/bin) to thePATH variable manually.

How do I fix the "Graphviz not built with triangulation library" error when using sfdp layout?

Homebrew doesn't include GTS by default. Fix this by doing:

brew uninstall graphvizbrew install gtsbrew install graphviz

The image produced by madge is very hard to read, what's wrong?

Try running madge with a different layout, here's a list of the ones you can try:

  • dot "hierarchical" or layered drawings of directed graphs. This is the default tool to use if edges have directionality.

  • neato "spring model'' layouts. This is the default tool to use if the graph is not too large (about 100 nodes) and you don't know anything else about it. Neato attempts tominimize a global energy function, which is equivalent to statistical multi-dimensional scaling.

  • fdp "spring model'' layouts similar to those of neato, but does this by reducing forces rather than working with energy.

  • sfdp multiscale version of fdp for the layout of large graphs.

  • twopi radial layouts, after Graham Wills 97. Nodes are placed on concentric circles depending their distance from a given root node.

  • circo circular layout, after Six and Tollis 99, Kauffman and Wiese 02. This is suitable for certain diagrams of multiple cyclic structures, such as certain telecommunications networks.

Credits

Contributors

This project exists thanks to all the people who contribute.Contributors

Donations ❤️

Thanks to the awesome people below for making donations! 🙏Donate

Bernard Stojanović (24 Mars, 2021)

BeroBurny

Ole Jørgen Brønner (Oct 8, 2020)

olejorgenb

RxDB (Apr 1, 2020)

RxDB

Peter Verswyvelen (Feb 24, 2020)

Ziriax

Landon Alder (Mar 19, 2019)

landonalder

License

MIT License


[8]ページ先頭

©2009-2025 Movatter.jp