Skip to content

swc-project/swc-macro-sys

Repository files navigation

SWC Macro Sys

This crate is a macro system implementation for swc macro proposal, which is used for parsing and transforming the javascript code based on swc

Warning: This crate is not recommented to use now

Build & Setup

WASM binding

# Once: Add WASM target
rustup target add wasm32-unknown-unknown

# Build the WASM binding
(cd crates/swc_macro_wasm && wasm-pack build --release)

# Your wasm file will be in `crates/swc_macro_wasm/pkg/`

Node.js Examples

# Install Node.js dependencies for examples
(cd examples && npm install)

# Run the JSX transformation demo
(cd examples && npm run jsx-demo)
# OR
(cd examples && node --experimental-wasm-modules jsx-test-server.mjs)

Requirements:

  • Node.js v20+ recommended for best WASM support
  • Use --experimental-wasm-modules flag for WASM optimization to work

Examples

Tree-Shaking Demo

Test conditional compilation and tree-shaking with a webpack bundle:

# Build WASM module first
(cd crates/swc_macro_wasm && wasm-pack build --release)

# Run tree-shaking test on bundler output
node --experimental-wasm-modules test-tree-shaking.mjs

This demonstrates:

  • Conditional compilation - Code blocks removed based on feature flags
  • Bundle optimization - Minification and dead code elimination
  • Multiple configurations - Tests different feature flag combinations
  • Size analysis - Shows bundle size reduction for each configuration

Rust Transform Example

Check crates/swc_macro_condition_transform to see how this crate works to handle the macro annotations.

Run cargo run --example transform with the following input javascript code:

/* @common:if [condition="featureFlags.enableNewFeature"] */
export function newFeature() {
  return "New feature is enabled!";
}
/* @common:endif */

const buildTarget =
  /* @common:define-inline [value="build.target" default="development"] */ "development";

The expected output is:

const buildTarget = "production";

Node.js JSX Demo

The examples/jsx-test-server.mjs demonstrates:

  • JSX Transformation: Using SWC to transform JSX syntax to React.createElement calls
  • Macro Processing: Applying conditional compilation and variable substitution
  • Component Rendering: Server-side rendering of React components to HTML

Features demonstrated:

  • Complex nested conditional blocks (@common:if/@common:endif)
  • Platform-specific code paths (mobile/desktop)
  • Feature flag conditional compilation
  • A/B testing variants
  • User type-based feature access
  • Inline variable substitution (@common:define-inline)

Run the demo to see how the macro system can optimize bundle size by eliminating unused code paths at build time.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors