Tech Blog
JavaScriptNode.jsPerformancewebpacknpm

Analyzing and Optimizing Node Modules for Performance

Feb 26, 20254 min read
Analyzing and Optimizing Node Modules for Performance

The node_modules folder is one of the most overlooked aspects of a JavaScript project. It quietly balloons in size, slows your builds, and ships unnecessary bytes to production—yet most developers rarely look inside. Systematic optimization keeps projects fast, scalable, and maintainable.

Checking node_modules Size

Start with a quick audit before optimizing anything:

# Total size of node_modules
du -sh node_modules/

# List all direct dependencies
npm ls --depth=0

# Check a package's size before installing it
npx package-size <package-name>

Analysis Tools

size-limit

size-limit lets you define a performance budget for your JavaScript bundle and fails CI if you exceed it.

npm install --save-dev size-limit

Add it to your package.json:

{
  "size-limit": [
    { "path": "dist/index.js", "limit": "50 KB" }
  ]
}

webpack-bundle-analyzer

If you're using webpack, the bundle analyzer gives you a visual treemap of exactly which modules are contributing to your output size—invaluable for spotting accidental duplicates or unexpectedly large dependencies.

npm install --save-dev webpack-bundle-analyzer

Optimization Techniques

Remove unused dependencies

depcheck scans your source files and tells you which installed packages are never actually imported.

npx depcheck

Replace heavy libraries

Some classic libraries were built long before modern APIs existed. Consider swapping them for lighter alternatives:

  • moment.jsdate-fns (tree-shakeable, no locale baggage by default)
  • lodash → individual lodash functions or native array/object methods
  • axios → native fetch with a thin wrapper

Enable tree shaking

Ensure your bundler is running in production mode so dead code is eliminated. In webpack:

// webpack.config.js
module.exports = {
  mode: "production",
};

Dedupe packages

When multiple packages depend on the same library at compatible version ranges, npm can often hoist a single copy. Run:

npm dedupe

Switch to pnpm

pnpm stores packages in a global content-addressable store and uses symlinks inside your project's node_modules. This dramatically reduces disk usage and speeds up installs across projects.

Production Optimization

  • Install only production dependencies: NODE_ENV=production npm install --omit=dev
  • Use npm ci --only=production in CI for reproducible, lockfile-faithful installs
  • Minify output with Terser or esbuild plugins
  • Strip source maps from production builds: find node_modules -name "*.map" -type f -delete
  • In Docker, copy only production dependencies before your app code so the layer is cached separately from your source

Optimization is iterative. Measure first, optimize what actually hurts, and set a budget so regressions are caught automatically rather than discovered in production.