npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

fast-circular-dependency-webpack-plugin

v1.0.2

Published

Fast circular dependency detection for Webpack builds, fully compatible with the original plugin.

Readme

Fast Circular Dependency Plugin

🚀 A high-performance alternative to circular-dependency-plugin. Built with Tarjan's Strongly Connected Components (SCC) algorithm for faster and more stable detection of circular dependencies in large-scale projects.


Why use this?

The original plugin uses recursive DFS, which can get slow on large projects. FastCircularDependencyPlugin introduces several improvements:

🔧 Key Optimizations

  1. Efficient algorithm

    • Uses Tarjan's SCC algorithm to detect all cycles in a single traversal.
    • Significantly faster for projects with thousands of modules.
  2. Deterministic module ordering

    • Matches the official plugin’s test results by sorting modules by their resource path.
  3. Accurate dependency resolution

    • Resolves dependencies via compilation.moduleGraph.getModule(dependency) (Webpack 5) or dependency.module (Webpack 4).
    • Ignores CommonJsSelfReferenceDependency, missing resources, and async edges when allowAsyncCycles is enabled.
  4. Lifecycle hooks supported

    • Full support for onStart, onDetected, and onEnd.
    • Call signatures and timing are consistent with the original plugin.
  5. Robust cycle detection

    • Always finds a valid cycle path.
    • Includes a minimal fallback mechanism to avoid missing cycles.

Install

npm i -D fast-circular-dependency-webpack-plugin
# or
pnpm add -D fast-circular-dependency-webpack-plugin

Webpack Compatibility

  • ✅ Webpack 4.0.1+
  • ✅ Webpack 5.x
  • ⚠️ Webpack 3 is not supported (same as the original v5 release)

Basic Usage

// webpack.config.js
const FastCircularDependencyPlugin = require('fast-circular-dependency-webpack-plugin')

module.exports = {
  entry: "./src/index",
  plugins: [
    new FastCircularDependencyPlugin({
      // exclude detection of files based on a RegExp
      exclude: /a\.js|node_modules/,
      // include only specific files based on a RegExp
      include: /dir/,
      // add errors to webpack instead of warnings
      failOnError: true,
      // allow import cycles that include an async import
      allowAsyncCycles: false,
      // set the current working directory for displaying module paths
      cwd: process.cwd(),
    })
  ]
}

Advanced Usage

Supports the same lifecycle hooks as the original plugin:

// webpack.config.js
const FastCircularDependencyPlugin = require('fast-circular-dependency-webpack-plugin')

module.exports = {
  entry: "./src/index",
  plugins: [
    new FastCircularDependencyPlugin({
      // called before cycle detection starts
      onStart({ compilation }) {
        console.log('start detecting webpack modules cycles');
      },
      // called for each detected cycle
      onDetected({ module, paths, compilation }) {
        // `paths` is an array of relative module paths that make up the cycle
        compilation.errors.push(new Error(paths.join(' -> ')))
      },
      // called after cycle detection ends
      onEnd({ compilation }) {
        console.log('end detecting webpack modules cycles');
      },
    })
  ]
}

✅ Drop-in replacement for the original plugin.

✅ Full API compatibility with all existing options and lifecycle hooks.

✅ Much faster on large projects thanks to Tarjan’s algorithm.

Acknowledgments

This project is a high-performance fork and reimplementation of circular-dependency-plugin originally created by Aaron Ackerman and contributors.

Licensed under the ISC License.