mrkeyoor.com_
Wed 23 Sept 00:36 UTC
Dev Toolsevaluationupdated 25 Aug 2026

swc review

SWC is a Rust compiler and transformation platform for JavaScript and TypeScript, exposed to both Rust and JavaScript projects. It parses, transpiles, minifies, and rewrites code quickly enough to sit inside build tools, while its packages and configuration cover common module and syntax targets.

+11stars / 7d
Verdict

Our SWC install finished in 53 seconds, but the build failed after 16 seconds and the test run hit 900 seconds while Cargo-backed plugin work remained, so contributing requires the full Rust and WebAssembly environment. Use the published packages when a supported framework needs fast transpilation; keep tsc for type checking and regression-test emitted code. The August 2026 release and active issue response show a living compiler, while current v1.16.1 transform bugs justify pinning versions instead of upgrading blindly.

We ran it

Lab card: what happened when we ran swcScreenshot of swc (swc.rs)
Install✓ · 53s1 packages · 494 MB
Build✗ · 16s
Tests✗ timed out · 900sran, no count parsed
Repo80852 files~3,309,371 lines of source · 395.4 MB · 16 CI workflows

Answers from our run

Does swc build from source?

Dependencies installed in 53 seconds (1 packages), and the build failed. We cloned commit 61ff097 into a clean Debian container with 3 CPUs and no project-specific setup.

Do swc's tests pass?

We could not finish them: the suite was still running after 15 minutes in our container.

Who should not use swc?

Teams expecting a TypeScript type checker: SWC's migration guide says it only transpiles and recommends continuing to run tsc for type errors.

What are the alternatives to swc?

Babel, esbuild, Oxc. Our SWC install finished in 53 seconds, but the build failed after 16 seconds and the test run hit 900 seconds while Cargo-backed plugin work remained, so contributing requires the full Rust and WebAssembly environment.

Setup2/5Easy package install, demanding Rust and Wasm source workflow
Docs4/5Strong website guides, terse repository entry point
Community5/5Current release, daily pushes, and detailed issue traffic
Maturity5/5Long-running compiler with broad APIs and active edge-case fixes

Discussed on

  1. hnSpeedy Web Compiler – A Rust port of Babel and Closure Compiler382 points
  2. hnSpeedy Web Compiler – a fast TypeScript/JavaScript compiler85 points
  3. hnSwc-project/swc: Babel port in Rust4 points
  4. hnRust-based TypeScript type-checker project leader threatens paid solution3 points
  5. hnSwc-project/swc: super-fast JavaScript compiler written in rust3 points

Who it’s for

JavaScript and TypeScript teams whose framework or bundler already supports SWC and needs fast transpilation or minification.
Build-tool authors who want a Rust parser and transform stack with JavaScript bindings.
Rust developers working directly with ECMAScript syntax trees and compiler crates.
Plugin authors prepared to manage Rust, WebAssembly targets, and SWC compatibility rules.

Who it’s NOT for

Teams expecting a TypeScript type checker: SWC's migration guide says it only transpiles and recommends continuing to run tsc for type errors.
Contributors with only a Node environment: our build stopped while spawning cargo metadata, and the 900-second test run was still invoking Cargo for wasm32-wasip1 work.
Projects assuming every tsc edge case emits identically: an open v1.16.1 report shows namespace-member enum transforms can leave a reference that throws at runtime.
Teams using aggressive minification without regression fixtures: another v1.16.1 issue reports mangling reintroducing a shadowed name and producing a runtime ReferenceError.
Anyone wanting a small source checkout: our clone contained 80,852 files and about 3,309,371 source lines.

Setup reality

Our run at commit 61ff097 installed successfully in 53 seconds and used 494 MB on disk, with the harness reporting 1 package installed. The 395.4 MB checkout contained 80,852 files and about 3,309,371 source lines. The build failed after 16 seconds, and tests hit the 900-second limit.

The build log tail shows Node v20.20.2 exiting after trying to spawn cargo metadata for the root Cargo manifest; it does not show a more specific cause, so we will not infer one. The test tail shows a Cargo build for an end-to-end plugin fixture targeting wasm32-wasip1, with plugin schema and compatibility suites still listed when time expired.

Using the published JavaScript package is a different job from developing the monorepo. The README supports Node 10+ for use, Node 20+ for development, and Rust 1.73 as the minimum for crates. Plugin work also needs a Rust toolchain and WebAssembly target. The repository had 16 CI workflow files and workspaces, but no root Dockerfile or tests directory.

SWC is a compiler platform with two audiences

JavaScript users usually meet SWC through @swc/core or a framework integration. Rust users can consume its parser and transform crates directly. The project handles JavaScript and TypeScript syntax, module conversion, minification, and configurable transforms, while WebAssembly plugins extend the pipeline. That dual identity explains both its appeal and its repository complexity. An application team can receive a native compiler behind a JavaScript API; a contributor has to understand a large Rust workspace plus the Node bindings and plugin system.

The README keeps the top-level choice simple. JavaScript users are sent to the website installation guide, Rust users to rustdoc, and contributors to separate architecture and contribution documents. It lists Node 10 or newer for package use, Node 20 or newer for development, and Rust 1.73 as the minimum supported Rust version for crates. Those version lines matter because a Node-only checkout does not contain the whole development environment.

What happened when we ran it

Our sandbox cloned commit 61ff097 and counted 80,852 files, roughly 3,309,371 source lines, and 395.4 MB checked out. The pnpm install succeeded in 53 seconds. Our harness reported one package installed and 494 MB on disk afterward. The repository is a monorepo with 16 CI workflow files and workspaces. It had no root Dockerfile or tests directory, although the later test command clearly discovered suites elsewhere in the tree.

The build failed with exit code 1 after 16 seconds. Its final log lines show a process trying to spawn cargo metadata against /work/repo/Cargo.toml, followed by Node v20.20.2 and pnpm lifecycle failures. The tail does not state why that Cargo invocation failed, so claiming a missing package or incompatible toolchain would go beyond the evidence. The useful finding is narrower: the build path crossed from Node into the Rust workspace and did not complete in our fresh lab image.

Tests ran for the full 900-second allowance and timed out. The final lines show cargo build being spawned for ./e2e/fixtures/plugin_analyze/Cargo.toml with the wasm32-wasip1 target. Plugin schema and compatibility suites were still listed. A timeout is not a failed assertion count, and we do not know how many tests had completed. It does show that the repository's end-to-end verification can include compiling Rust WebAssembly fixtures and can exceed 15 minutes under 3 CPUs and 8 GB of RAM.

Published packages avoid most source friction

A product team adopting SWC should judge the package path separately from our monorepo build. Prebuilt bindings are the usual reason to choose it: application developers call a JavaScript API while the work happens in Rust. Configuration can keep ES modules, emit CommonJS or other module forms, select syntax and target behavior, and enable minification. A framework that already owns the SWC integration removes even more setup because it selects package versions and feeds configuration through its build system.

Type checking remains outside that bargain. SWC's migration guide says it transpiles one file at a time and does not perform TypeScript type checking, so tsc should remain in CI for semantic errors. File-by-file compilation also creates edge cases around type-only imports and transforms that depend on broader type information. A fast emit step is useful, but replacing tsc without preserving a type-check command would remove a safety net rather than speed it up.

Version 1.16.1 still has observable emit bugs

The latest GitHub release is v1.16.1, published August 19, 2026, and the repository was pushed again on August 25. Recent issue reports are technically specific. One shows namespace-member values in TypeScript enums surviving emit in a way that can produce ReferenceError. Another shows minifier mangling assigning a shadowed name back to a binding after compression had renamed it, also changing runtime behavior. A third describes object-rest lowering that changes var scope inside a loop.

These reports do not make SWC unusable. Compilers operate across a huge syntax surface, and detailed reproductions give maintainers something actionable. They do change the upgrade policy. Pin the compiler version, keep fixtures for decorators, enums, module boundaries, and minification-sensitive code, then compare runtime behavior during upgrades. GitHub's open count of 417 includes both issues and pull requests, so it is evidence of queue size rather than 417 confirmed compiler defects.

Choose SWC when the integration owns the complexity

SWC is easiest to recommend when a framework already supports it or a build team has a measured reason to replace a slower transform stage. Babel remains the safer choice for a project built around its plugin ecosystem. esbuild is attractive when bundling with a compact configuration is the main requirement. Oxc deserves comparison for teams evaluating a broader Rust JavaScript toolchain, while Biome addresses formatting and linting rather than this compiler role.

For contributors, our run is the warning label: a 53-second install was followed by a 16-second build failure and a test command still working at 900 seconds. Set up Rust, Cargo, the required WebAssembly target, and the repository's documented Node version before expecting the root workflow to pass. For application users, install the published binding, retain tsc, pin v1.16.1 or another tested version, and let real project fixtures decide whether SWC's output matches the codebase.

Alternatives

ProjectWhat it isPick it when
BabelThe established JavaScript compiler with a large transform and plugin ecosystem.pick this instead when plugin breadth and exact Babel compatibility matter more than SWC's Rust core.
esbuild gh↗A Go-based bundler and minifier designed around fast, simple builds.pick this instead when bundling is the main job and you want a smaller configuration surface.
Oxc gh↗A Rust toolchain covering parsing, transforms, linting, formatting, and minification.pick this instead when you want to evaluate a wider Rust-based toolchain under one project.
Biome gh↗A Rust-based formatter and linter with a unified developer-tool experience.pick this instead when formatting and linting are the requirement rather than compilation.

What people are saying

  1. [github-trending] swc-project/swc

Sources

  1. SWC README
  2. SWC v1.16.1 release
  3. SWC migration from tsc guide
  4. SWC plugin getting started guide
  5. SWC enum transform issue 12102
  6. SWC minifier issue 12155

More dev tools reviews

crabbox · asdf · discord.js · h4cker · bend · 100-exercises-to-learn-rust · the whole board →