Skip to main content
Version: 3.x

Comparison with other tools

The JavaScript and TypeScript ecosystem has a tool for almost every dependency-graph question: unused files and exports, unused or missing dependencies, circular imports, architecture boundaries, duplicated code. This page maps that landscape - what each tool checks, whether it is still maintained, and which one fits which problem, including the cases where rev-dep is not the right choice. Each tool also has a detailed side-by-side page, linked at the bottom.

Rev-dep focuses on the dependency graph and on architecture rules, run as one fast pass from one config. It does not render graph images, and it reports at the file, export and dependency level rather than at class-member or namespace-member level.

Last verified: September 2026.

What each tool checks​

A plain ✅ means the tool does this by default. Text instead of a tick means it does it with a qualification, spelled out in which tool for which problem below.

ToolUnused filesUnused exportsUnused / missing depsCircular importsBoundariesDuplicated codeGraph
rev-dep✅✅✅ / ✅✅allow, deny, reachabilityblocks & JSX-
knip✅✅✅ / ✅opt-in---
dependency-cruiser✅-partial✅generic rules-✅
madge✅--✅--✅
skott✅-✅ / -✅--✅
dpdm✅--✅---
jscpdopt-inopt-in---token sequences-
eslint-plugin-import-✅- / ✅slow on large reposrestricted paths--
Sheriff----tags + encapsulation--
good-fences----per-directory fences--
depcheck--✅ / ✅----
npm-check--✅ / -----
unimported✅-✅ / -----
ts-prune-✅-----
ts-unused-exports✅✅-----

Everything here runs on Node, except rev-dep (Go), jscpd v5 (Rust) and the two ESLint plugins.

A few tools also go deeper than this table shows: knip reports unused class and enum members and duplicate exports, jscpd adds complexity and health scoring and covers 220+ languages, and eslint-plugin-import and Sheriff give in-editor feedback. The detailed pages cover those differences.

Is it still maintained?​

Latest npm release, checked September 2026:

ToolLatest releaseStatus
rev-dep3.0.0 · Sep 2026active
knip6.37.0 · Sep 2026active
dependency-cruiser18.3.1 · Sep 2026active
jscpd5.3.0 · Sep 2026active - v5 is a Rust rewrite
skott0.35.12 · Sep 2026active
dpdm4.3.0 · Jul 2026active
eslint-plugin-import2.32.0 · Jun 2025slow; the fork eslint-plugin-import-x releases more often
Sheriff0.19.6 · Sep 2025no release in the past year
madge8.0.0 · Aug 2024no release in over two years
ts-unused-exports11.0.1 · Nov 2024no release since
depcheck1.4.7 · Oct 2023repository archived
unimported1.31.1 · Nov 2023deprecated on npm, repository archived
good-fences1.2.0 · Mar 2023inactive
npm-check6.0.1 · Jul 2022inactive
ts-prune0.10.3 · Dec 2021maintenance mode; its README points to knip

If you are starting fresh, avoid the archived and inactive tools: depcheck, unimported, npm-check, ts-prune and good-fences all have maintained replacements below.

Which tool for which problem​

Unused files, exports and dependencies

  • knip - the most established choice, with a large plugin ecosystem and fine-grained reports.
  • rev-dep - the fastest, and runs in the same pass as your architecture checks.
  • jscpd (--dead-code, also standalone as basta) - opt-in; reports unused declarations and imports as well as files and exports, with a confidence score on each finding.

Circular imports

  • rev-dep - fastest on large codebases; includes type-only imports by default (ignoreTypeImports to exclude them).
  • knip (--cycles) - opt-in, and considers value imports only.
  • madge or dpdm - simple command-line checks; madge can also draw the graph.
  • eslint-plugin-import no-cycle - in-editor, but known to be slow on large repositories.

Architecture boundaries

  • rev-dep - allow, deny and denyIgnore rules on path patterns, plus entry-point reachability rules (restricted imports, restricted importers), checked on every file.
  • dependency-cruiser - one generic from/to rule engine, plus visualization.
  • Sheriff - tags and barrel-file encapsulation, through ESLint.
  • Nx enforce-module-boundaries - if your monorepo already uses Nx.

Duplicated code

The tools differ in what they match, and that decides whether a finding is actionable.

  • jscpd - matches token sequences: a run of identical tokens, wherever it happens to start and end. That is what lets it cover 220+ languages and find exact, renamed and near-miss copies, with many report formats and baselines. The cost is that a match can begin and end mid-expression, so it often does not line up with anything you can extract.
  • rev-dep - matches whole syntactic units: a function body, a branch, a loop body, a JSX element. Every finding is a unit you can lift into a function or a component. Renamed copies are matched too, and a snapshot baseline means only new duplication fails (how it works).

Seeing the graph

  • madge, dependency-cruiser and skott render it. rev-dep does not; it answers "what imports what" as text through the exploratory toolkit.

Using tools together​

These tools overlap, but not completely, and combinations are common:

  • rev-dep + knip: rev-dep as the fast architecture gate on every commit or agent edit; knip for member-level dead code.
  • rev-dep + madge or dependency-cruiser: rev-dep for enforcement in CI, the other for a picture of the graph.
  • rev-dep + an ESLint plugin: rev-dep for whole-graph checks, ESLint for in-editor feedback on individual files.

Detailed comparisons​

vs Rev-depthe other tool's focus
knipunused files, exports, dependencies
dependency-cruiserdependency rules, circular & orphan, visualization
depcheckunused & missing dependencies
madgecircular dependencies, graph visualization
jscpdduplicated code detection
dpdmcircular dependencies, unused files
ts-pruneunused exports
ts-unused-exportsunused exports
unimportedunused files, unused & unresolved imports
skottcircular deps, unused files & deps, visualization
eslint-plugin-importimport-graph ESLint rules
good-fencesdirectory import boundaries
sheriffmodule boundaries & dependency rules
npm-checkunused dependencies, version updates

Ready to switch rather than compare? See the migration guides.