@swc/core
这些是主要对构建工具作者有用的核心 SWC API。
transform
@swc/core
提供了适当的 .d.ts
文件,因此你可能不需要此文件。返回 Promise<{ code: string, map?: string }>
const swc = require("@swc/core");
swc
.transform("source code", {
// 以下选项不能在 .swcrc 中指定
filename: "input.js",
sourceMaps: true,
// 输入文件默认被视为模块
isModule: false,
// 以下选项可以通过 .swcrc 配置
jsc: {
parser: {
syntax: "ecmascript",
},
transform: {},
},
})
.then((output) => {
output.code; // 转换后的代码
output.map; // source map(以字符串表示)
});
transformSync
Returns { code: string, map?: string }
transformFile
Returns Promise<{ code: string, map?: string }>
transformFileSync
Returns { code: string, map?: string }
parse
Returns Promise<Script | Module>
const swc = require('@swc/core')
swc
.parse("source code", {
syntax: "ecmascript", // "ecmascript" | "typescript"
comments: false,
script: true,
// 默认值为 es3
target: "es3",
// 输入源代码默认被视为模块
isModule: false,
})
.then((module) => {
module.type // 文件类型
module.body; // AST
})
Type Declarations
export declare function parse(src: string, options: ParseOptions & {
isModule: false;
}): Promise<Script>;
export declare function parse(src: string, options?: ParseOptions): Promise<Module>;
export declare function parseSync(src: string, options: ParseOptions & {
isModule: false;
}): Script;
export declare function parseSync(src: string, options?: ParseOptions): Module;
export declare function parseFile(path: string, options: ParseOptions & {
isModule: false;
}): Promise<Script>;
export declare function parseFile(path: string, options?: ParseOptions): Promise<Module>;
export declare function parseFileSync(path: string, options: ParseOptions & {
isModule: false;
}): Script;
export declare function parseFileSync(path: string, options?: ParseOptions): Module;
export interface Module extends Node, HasSpan, HasInterpreter {
type: "Module";
body: ModuleItem[];
}
export interface Script extends Node, HasSpan, HasInterpreter {
type: "Script";
body: Statement[];
}
export declare type ParseOptions = ParserConfig & {
comments?: boolean;
script?: boolean;
/**
* 默认值为 es3.
*/
target?: JscTarget;
};
export declare type JscTarget = "es3" | "es5" | "es2015" | "es2016" | "es2017" | "es2018" | "es2019" | "es2020" | "es2021" | "es2022";
export declare type ParserConfig = TsParserConfig | EsParserConfig;
export interface TsParserConfig {
syntax: "typescript";
/**
* 默认值为 `false`.
*/
tsx?: boolean;
/**
* 默认值为 `false`.
*/
decorators?: boolean;
/**
* 默认值为 `false`
*/
dynamicImport?: boolean;
}
export interface EsParserConfig {
syntax: "ecmascript";
/**
* 默认值为 false.
*/
jsx?: boolean;
/**
* 默认值为 `false`
*/
functionBind?: boolean;
/**
* 默认值为 `false`
*/
decorators?: boolean;
/**
* 默认值为 `false`
*/
decoratorsBeforeExport?: boolean;
/**
* 默认值为 `false`
*/
exportDefaultFrom?: boolean;
/**
* 默认值为 `false`
*/
importAssertions?: boolean;
}
parseSync
Returns Script | Module
parseFile
Returns Promise<Script | Module>
parseFileSync
Returns Script | Module
minify
Returns Promise<Output>
const swc = require('@swc/core')
swc
.minify('source code', opts?: JsMinifyOptions)
.then(output => {
output.code // 转换后的代码
output.map // 源映射(以字符串表示)
})
Type Declarations
export declare function minify(src: string, opts?: JsMinifyOptions): Promise<Output>;
export declare function minifySync(src: string, opts?: JsMinifyOptions): Output;
export interface Output {
code: string;
map?: string;
}
export declare type TerserEcmaVersion = 5 | 2015 | 2016 | string | number;
export interface JsMinifyOptions {
compress?: TerserCompressOptions | boolean;
mangle?: TerserMangleOptions | boolean;
ecma?: TerserEcmaVersion;
keep_classnames?: boolean;
keep_fnames?: boolean;
module?: boolean | "unknown";
safari10?: boolean;
toplevel?: boolean;
sourceMap?: boolean;
outputPath?: string;
inlineSourcesContent?: boolean;
}
export interface TerserCompressOptions {
arguments?: boolean;
arrows?: boolean;
booleans?: boolean;
booleans_as_integers?: boolean;
collapse_vars?: boolean;
comparisons?: boolean;
computed_props?: boolean;
conditionals?: boolean;
dead_code?: boolean;
defaults?: boolean;
directives?: boolean;
drop_console?: boolean;
drop_debugger?: boolean;
ecma?: TerserEcmaVersion;
evaluate?: boolean;
expression?: boolean;
global_defs?: any;
hoist_funs?: boolean;
hoist_props?: boolean;
hoist_vars?: boolean;
ie8?: boolean;
if_return?: boolean;
inline?: 0 | 1 | 2 | 3;
join_vars?: boolean;
keep_classnames?: boolean;
keep_fargs?: boolean;
keep_fnames?: boolean;
keep_infinity?: boolean;
loops?: boolean;
negate_iife?: boolean;
passes?: number;
properties?: boolean;
pure_getters?: any;
pure_funcs?: string[];
reduce_funcs?: boolean;
reduce_vars?: boolean;
sequences?: any;
side_effects?: boolean;
switches?: boolean;
top_retain?: any;
toplevel?: any;
typeofs?: boolean;
unsafe_passes?: boolean;
unsafe_arrows?: boolean;
unsafe_comps?: boolean;
unsafe_function?: boolean;
unsafe_math?: boolean;
unsafe_symbols?: boolean;
unsafe_methods?: boolean;
unsafe_proto?: boolean;
unsafe_regexp?: boolean;
unsafe_undefined?: boolean;
unused?: boolean;
module?: boolean;
}
export interface TerserMangleOptions {
props?: TerserManglePropertiesOptions;
top_level?: boolean;
keep_class_names?: boolean;
keep_fn_names?: boolean;
keep_private_props?: boolean;
ie8?: boolean;
safari10?: boolean;
reserved?: string[];
}
export interface TerserManglePropertiesOptions {
}
minifySync
Returns Output
Options
/**
* 编程选项。
*/
interface Options extends Config {
/**
* 如果为 true,文件将被解析为脚本而不是模块。
*/
script?: boolean;
/**
* 所有编程选项中的路径将相对于此工作目录进行解析。
* 默认为 `process.cwd()`。
*
cwd?: string;
*/
cwd?: string;
调用者?: CallerOptions;
/** 与当前正在编译的代码关联的文件名,
* 如果有的话。文件名是可选的,但并非所有 Swc 的
* 功能在文件名未知时都可用,因为
* 一部分选项依赖于文件名来实现其功能。
*
* 用户可能会遇到的三种主要情况是:
*
* - 文件名会暴露给插件。某些插件可能需要
* 文件名的存在。
* - 像 "test"、"exclude" 和 "ignore" 这样的选项需要文件名
* 来进行字符串/正则表达式匹配。
* - .swcrc 文件相对于正在编译的文件加载。
* 如果省略此选项,Swc 将表现为已设置 swcrc: false。
*/
filename?: string;
/**
* 初始路径将根据 "rootMode" 进行处理,以确定当前 Swc 项目的概念根文件夹。
* 这主要用于两种情况:
* - 检查默认 "configFile" 值时的基本目录
*
* - "swcrcRoots" 的默认值。
* 默认为 `opts.cwd`
*
root?: string;
*/
root?: string;
/**
* 此选项与“root”值结合,定义了 Swc 如何选择
* 其项目根目录。不同的模式定义了 Swc 处理“root”值以获取最终项目根目录的不同方式。
* 可以处理“root”值以获取最终项目根目录。
*
* “root” - 将“root”值原封不动地传递。
* “upward” - 从“root”目录向上遍历,寻找包含 swc.config.js 文件的目录,如果未找到 swc.config.js 文件,则抛出错误。
* 包含 swc.config.js 文件的目录,如果未找到 swc.config.js 文件,则抛出错误。
* 如果未找到 swc.config.js 文件,则抛出错误。
* “upward-optional” - 从“root”目录向上遍历,寻找包含 swc.config.js 文件的目录,如果未找到 swc.config.js 文件,则回退到“root”。
* 包含 swc.config.js 文件的目录,如果未找到 swc.config.js 文件,则回退到“root”。
* 如果未找到 swc.config.js 文件,则回退到“root”。
*
*
* "root" 是默认模式,因为它避免了 Swc 意外加载完全在当前项目文件夹之外的 swc.config.js 的风险。
* 会意外加载完全在当前项目文件夹之外的 swc.config.js。
* 如果你使用 "upward-optional",
* 请注意它会遍历目录结构一直到文件系统的根目录,
* 并且总是有可能有人在他们的主目录中有一个被遗忘的 swc.config.js,
* 这可能会导致你的构建中出现意外的错误。
* 对于在单仓库项目结构中按包运行构建/测试的用户,
*
*
* 可能希望使用 "upward",因为单仓库通常在项目根目录中有一个 swc.config.js。
* 在项目根目录中运行 Swc
* often have a swc.config.js in the project root. Running Swc
* 在没有“upward”的 monorepo 子目录中,将导致 Swc
* 跳过加载项目根目录中的任何 swc.config.js 文件,
* 这可能导致意外的错误和编译失败。
*/
rootMode?: "root" | "upward" | "upward-optional";
/**
* 在配置加载期间使用的当前活动环境。
* 该值在解析“env”配置时用作键,
* 并且通过 api.env() 函数在配置函数、插件和预设中也可用。
* 默认值为 `process.env.SWC_ENV || process.env.NODE_ENV || "development"`
*
envName?: string;
*/
envName?: string;
/**
* 默认搜索默认的 `.swcrc` 文件,但可以
* 传递任何 JS 或 JSON5 配置文件的路径。
*
*
* 注意:此选项不会影响 `.swcrc` 文件的加载,
* 因此虽然可能想使用 configFile: "./foo/.swcrc",
* 但不推荐这样做。如果给定的 `.swcrc` 通过
* 标准的文件相对逻辑加载,你最终会加载相同的
* 配置文件两次,并将其与自身合并。如果你正在链接
* 一个特定的配置文件,建议坚持使用
* 与 "swcrc" 名称无关的命名方案。
*
* 默认为 `path.resolve(opts.root, ".swcrc")`
*/
configFile?: string | boolean;
/**
* true 将启用相对于提供给 Swc 的 "filename" 搜索配置文件。
*
* 在编程选项中传递的 swcrc 值将覆盖配置文件中设置的值。
*
* 注意:只有在当前 "filename" 位于与 "swcrcRoots" 包匹配的包内时,才会加载 .swcrc 文件。
* 只要指定了 filename 选项,默认值为 true。
*
*
swcrc?: boolean;
*/
* 默认情况下,Babel 只会在 "root" 包中搜索 .babelrc 文件。
/**
* 因为否则 Babel 无法知道给定的 .babelrc 是否应该被加载,
* 或者它的 "plugins" 和 "presets" 是否已经安装,因为文件
* or if it's "plugins" and "presets" have even been installed, since the file
* 编译的内容可能在 node_modules 中,或者已经被符号链接到项目中。
*
*
* 此选项允许用户提供其他包的列表,这些包在考虑是否加载 .babelrc 文件时应被视为“根”包。
* 例如,一个希望允许各个包拥有自己配置的单仓库设置可能希望这样做。
*
*
* 默认为 `opts.root`
swcrcRoots?: boolean | MatchPattern | MatchPattern[];
*
*
*
* `true` 将尝试从文件本身加载输入源映射,如果它包含 //# sourceMappingURL=... 注释。如果未找到映射,或者映射加载和解析失败,它将被静默丢弃。
*/
swcrcRoots?: boolean | MatchPattern | MatchPattern[];
/**
* `true` will attempt to load an input sourcemap from the file itself, if it
* contains a //# sourceMappingURL=... comment. If no map is found, or the
* map fails to load and parse, it will be silently discarded.
*
* 如果提供了一个对象,它将被视为源映射对象本身。
*
* 默认为 `true`。
*/
inputSourceMap?: boolean | string;
/**
* 用于源映射对象中文件的名称。
*
* 默认为 `path.basename(opts.filenameRelative)`(如果可用),否则为 `"unknown"`。
*/
sourceFileName?: string;
/**
* 要在生成的源映射中设置的 sourceRoot 字段(如果需要)。
*/
sourceRoot?: string;
plugin?: Plugin;
isModule?: boolean | 'unknown';
/**
* 目标路径。请注意,此值仅用于修复源路径
* 源映射文件的路径,swc 不会将输出写入此路径。
*/
outputPath?: string;
}
其中 Config
定义为:
export interface Config {
/**
* 注意:类型为字符串,因为它遵循 Rust 的正则表达式语法。
*/
test?: string | string[];
/**
* 注意:类型为字符串,因为它遵循 Rust 的正则表达式语法。
*/
排除?: 字符串 | 字符串[];
环境?: 环境配置;
jsc?: Jsc 配置;
模块?: 模块配置;
压缩?: 布尔值;
/**
* - true 为代码生成源映射并将其包含在结果对象中。
* - "inline" 生成源映射并将其作为数据 URL 附加到代码末尾,但不包含在结果对象中。
*
* `swc-cli` 重载了其中一些选项,以影响映射如何写入磁盘:
*
* - true 会将地图写入磁盘上的 .map 文件
* - "inline" 会直接写入文件,因此它将包含一个包含地图的 data:
* - 注意:这些选项有点奇怪,所以可能最有意义的是直接使用 true
* 并根据您的用例在您自己的代码中处理其余部分。
*/
sourceMaps?: boolean | "inline";
inlineSourcesContent?: boolean;
}