swc 0.163.0

Speedy web compiler
Documentation

The main crate of the swc project.

Customizing

This is documentation for building custom build tools on top of swc.

Dependency version management

swc has swc_ecmascript and swc_css, which re-exports required modules.

Testing

See [testing] and swc_ecma_transform_testing.

Custom javascript transforms

What is JsWord?

It's basically an interned string. See [swc_atoms].

Choosing between JsWord vs String

You should prefer JsWord over [String] if it's going to be stored in an AST node.

See [swc_atoms] for detailed description.

Fold vs VisitMut vs Visit

See [swc_visit] for detailed description.

Variable management (Scoping)

See [swc_ecma_transforms_base::resolver::resolver_with_mark].

How identifiers work

See the doc on [swc_ecma_ast::Ident] or on [swc_ecma_transforms_base::resolver::resolver_with_mark].

Comparing two identifiers

See [swc_ecma_utils::Id]. You can use [swc_ecma_utils::IdentLike::to_id] to extract important parts of an [swc_ecma_ast::Ident].

Creating a unique identifier

See [swc_ecma_utils::private_ident].

Prepending statements

If you want to prepend statements to the beginning of a file, you can use [swc_ecma_utils::prepend_stmts] or [swc_ecma_utils::prepend] if len == 1.

These methods are aware of the fact that "use strict" directive should be first in a file, and insert statements after directives.

Improving readability

Each stuffs are documented at itself.

  • If you are creating or binding an [swc_ecma_ast::Expr] with operator, you can use [swc_ecma_ast::op].

  • If you want to create [swc_ecma_ast::CallExpr], you can use [swc_ecma_utils::ExprFactory::as_callee] to create callee.

  • If you want to create [swc_ecma_ast::CallExpr] or [swc_ecma_ast::NewExpr], you can use [swc_ecma_utils::ExprFactory::as_arg] to create arguments.

  • If you want to create [swc_ecma_ast::MemberExpr] where all identifiers are static (e.g. Object.prototype.hasOwnProperty), you can use [swc_ecma_utils::member_expr].

  • If you want to create [swc_ecma_ast::MemberExpr], you can use [swc_ecma_utils::ExprFactory::as_obj] to create object field.

Reducing binary size

The visitor expands to a lot of code. You can reduce it by using macros like

Note that this will make typescript-related nodes not processed, but it's typically fine as typescript::strip is invoked at the start and it removes typescript-specific nodes.

Porting expr.evaluate() of babel

See [swc_ecma_minifier::eval::Evaluator].