Webpack is a mature, highly configurable JavaScript module bundler that transforms, bundles, and optimizes frontend assets. Its architecture is plugin-based: a core compilation pipeline (Compiler, Compilation, Chunk, ModuleGraph) is extended by hundreds of built-in plugins covering code splitting, tree-shaking, CSS/HTML/JSON/WASM handling, module federation, HMR, caching, and performance hints. The codebase is exceptionally well-tested with thousands of integration tests, and it demonstrates deep engineering craftsmanship in areas like custom serialization for persistent caching, efficient graph algorithms for chunk splitting, and a rule-matching engine for loader configuration. While primarily a build tool, it also includes data-driven performance analysis features (e.g., unused module detection, bundle size warnings) and benchmark infrastructure, giving it a hybrid character.
Rollup is a production-grade JavaScript module bundler that compiles small code fragments into optimized single-file or multi-chunk outputs. It is used extensively in the JavaScript ecosystem (e.g., by Vite, React, and many libraries) to produce distributable packages in formats such as ES modules, CommonJS, AMD, UMD, IIFE, and SystemJS. The core functionality includes static analysis for tree-shaking, dependency resolution, chunking with manual and dynamic splits, source map generation, and a comprehensive plugin system for customization. The architecture is centered around a graph-based module resolution pipeline. Input files are parsed into an AST (using a Rust-based parser via NAPI or WASM for performance), then analyzed for imports, exports, and side effects. The tree-shaking engine traces variable usage and eliminates dead code. Modules are grouped into chunks based on entry points, manual chunk definitions, and dynamic imports, then rendered by format-specific finalisers. The plugin system provides hooks at every stage (resolution, loading, transformation, output generation) and supports both sequential and parallel execution. Key entry points include the CLI (`cli/cli.ts`), the programmatic API (`src/node-entry.ts`), and the core `rollup` function (`src/rollup/rollup.ts`). The data flow begins with configuration loading (from CLI flags or config files), followed by module resolution, AST parsing, tree-shaking analysis, chunk assignment, and final output generation. The watch mode (`src/watch/watch.ts`) re-triggers the pipeline on file changes. External dependencies include various `@rollup/plugin-*` packages for common tasks (e.g., resolving node modules, transforming TypeScript), `source-map` for source map handling, `fsevents` for file watching on macOS, and the Rust `swc_ecma_ast` crate for fast parsing. The project maintains native binaries for 25+ platforms and a WASM variant for browser environments.
Parcel is a zero-configuration web application bundler designed for speed and simplicity. In production, it parses entry points (HTML, JS, CSS, etc.), resolves dependencies via a plugin system, transforms assets using Rust-based processors (SWC for JS, Lightning CSS for CSS, custom HTML/SVG), optimizes and minifies output, and writes bundles with content hashing. It supports code splitting, tree shaking, CSS modules, TypeScript, and multiple output formats (ESM, CommonJS, global). The architecture is a monorepo with a core orchestrator (`@parcel/core`) that coordinates a pipeline of plugins (transformers, resolvers, packagers, optimizers, compressors, reporters). Performance-critical work is offloaded to Rust crates (e.g., JS transformer, resolver, image optimization) exposed via NAPI bindings. Key entry points include the CLI (`parcel serve`/`watch`/`build`), the `Parcel` API, and the dev server with HMR. The data flow is request-driven: entry resolution → asset graph construction → transformation → bundling → packaging → writing. Parcel relies on Node.js, SWC, Lightning CSS, and various language-specific libraries (PostCSS, Babel, etc.). It is a production-grade tool used by thousands of projects and is actively maintained with frequent releases.
Microbundle is a zero-configuration bundler for small JavaScript/TypeScript libraries, built on top of Rollup. It automatically generates multiple output formats (ESM, CJS, UMD, and a modern ES2017 bundle) from a single source entry, using package.json fields to determine input and output paths. The system reads the package.json, resolves entry points, and creates Rollup configurations for each format, applying Babel for transpilation (with custom presets for modern vs legacy targets), TypeScript via rollup-plugin-typescript2, CSS handling via PostCSS, and minification via Terser. It supports features like JSX, CSS Modules, property mangling, build-time constant replacement, module aliasing, Web Workers, and bundle visualization. The architecture is a CLI tool (`src/cli.js`) that parses arguments with `sade` and calls the core `microbundle()` function (`src/index.js`), which orchestrates the build pipeline. The codebase is well-structured, with reusable utility modules for option normalization, Babel plugin customization, and size reporting. While the dependency versions are somewhat dated (Rollup 2, Babel 7.12), the project remains actively maintained with recent commits and a comprehensive test suite covering many edge cases.