跳到主要内容

编译器和 API

svelte/compiler

在 GitHub 上编辑此页面

通常,你不会直接与 Svelte 编译器交互,而是会使用打包器插件将其集成到构建系统中。Svelte 团队最推荐并投入最多的打包器插件是 vite-plugin-svelteSvelteKit 框架提供了一个利用 vite-plugin-svelte 构建应用程序的设置,以及一个 打包 Svelte 组件库的工具。Svelte Society 维护了一个 其他打包器插件 列表,用于 Rollup 和 Webpack 等其他工具。

尽管如此,了解如何使用编译器很有用,因为打包器插件通常会向你公开编译器选项。

compile

ts
function compile(
source: string,
options?: CompileOptions
): CompileResult;

这是魔术发生的地方。svelte.compile 采用你的组件源代码,并将其转换为导出类的 JavaScript 模块。

ts
import { compile } from 'svelte/compiler';
const result = compile(source, {
// options
});

请参阅 CompileOptions 以了解所有可用选项。

返回的 result 对象包含组件的代码以及有用的元数据。

ts
const { js, css, ast, warnings, vars, stats } = compile(source);

请参阅 CompileResult 以获取编译结果的完整说明。

parse

ts
function parse(
template: string,
options?: ParserOptions
): Ast;

parse 函数解析组件,仅返回其抽象语法树。与使用 generate: false 选项进行编译不同,除了解析组件之外,它不会执行任何验证或其他分析。请注意,返回的 AST 不被视为公共 API,因此随时可能发生重大更改。

ts
import { parse } from 'svelte/compiler';
const ast = parse(source, { filename: 'App.svelte' });

preprocess

ts
function preprocess(
source: string,
preprocessor: PreprocessorGroup | PreprocessorGroup[],
options?:
| {
filename?: string | undefined;
}
| undefined
): Promise<Processed>;

一些 官方和社区维护的预处理插件 可用于让你将 Svelte 与 TypeScript、PostCSS、SCSS 和 Less 等工具配合使用。

你可以使用 svelte.preprocess API 编写自己的预处理器。

preprocess 函数提供了方便的钩子,用于任意转换组件源代码。例如,它可用于将 <style lang="sass"> 块转换为原始 CSS。

第一个参数是组件源代码。第二个参数是预处理器数组(或单个预处理器,如果你只有一个),其中预处理器是一个对象,它具有必需的 name 以及可选的 markupscriptstyle 函数。

markup 函数接收整个组件源文本以及组件的 filename(如果在第三个参数中指定了该名称)。

scriptstyle 函数分别接收 <script><style> 元素的内容(content)以及整个组件源文本(markup)。除了 filename 之外,它们还会获取一个元素属性对象。

每个 markupscriptstyle 函数都必须返回一个对象(或解析为对象的 Promise),该对象具有 code 属性,表示转换后的源代码。它们可以选择返回 dependencies 数组,该数组表示要监视其更改的文件,以及 map 对象,该对象是将转换映射回原始代码的源映射。scriptstyle 预处理器可以选择返回一个属性记录,该记录表示脚本/样式标签上的更新属性。

预处理器函数应尽可能返回 map 对象,否则调试将变得更加困难,因为堆栈跟踪无法正确链接到原始代码。

ts
import { preprocess } from 'svelte/compiler';
import MagicString from 'magic-string';
const { code } = await preprocess(
source,
{
markup: ({ content, filename }) => {
const pos = content.indexOf('foo');
if (pos < 0) {
return { code: content };
}
const s = new MagicString(content, { filename });
s.overwrite(pos, pos + 3, 'bar', { storeName: true });
return {
code: s.toString(),
map: s.generateMap()
};
}
},
{
filename: 'App.svelte'
}
);

如果返回 dependencies 数组,它将包含在结果对象中。这被 vite-plugin-svelterollup-plugin-svelte 等包使用,以监视其他文件的更改,例如,当你的 <style> 标签具有 @import(例如)。

preprocess-sass.js
ts
import { preprocess } from 'svelte/compiler';
import MagicString from 'magic-string';
Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.2322Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.
import sass from 'sass';
import { dirname } from 'path';
Argument of type 'string | undefined' is not assignable to parameter of type 'string'. Type 'undefined' is not assignable to type 'string'.2345Argument of type 'string | undefined' is not assignable to parameter of type 'string'. Type 'undefined' is not assignable to type 'string'.
const { code } = await preprocess(
source,
{
name: 'my-fancy-preprocessor',
markup: ({ content, filename }) => {
// Return code as is when no foo string present
const pos = content.indexOf('foo');
if (pos < 0) {
return;
}
// Replace foo with bar using MagicString which provides
// a source map along with the changed code
const s = new MagicString(content, { filename });
s.overwrite(pos, pos + 3, 'bar', { storeName: true });
return {
code: s.toString(),
map: s.generateMap({ hires: true, file: filename })
};
},
style: async ({ content, attributes, filename }) => {
// only process <style lang="sass">
if (attributes.lang !== 'sass') return;
const { css, stats } = await new Promise((resolve, reject) =>
sass.render(
{
file: filename,
data: content,
includePaths: [dirname(filename)]
},
(err, result) => {
if (err) reject(err);
else resolve(result);
}
)
);
// remove lang attribute from style tag
delete attributes.lang;
return {
code: css.toString(),
dependencies: stats.includedFiles,
attributes
};
}
},
{
filename: 'App.svelte'
}
);

多个预处理器可以一起使用。第一个的输出成为第二个的输入。在一个预处理器中,markup 首先运行,然后是 scriptstyle

在 Svelte 3 中,所有 markup 函数首先运行,然后是所有 script,最后是所有 style 预处理器。此顺序在 Svelte 4 中已更改。

multiple-preprocessor.js
ts
import { preprocess } from 'svelte/compiler';
const { code } = await preprocess(source, [
{
name: 'first preprocessor',
markup: () => {
console.log('this runs first');
},
script: () => {
console.log('this runs second');
},
style: () => {
console.log('this runs third');
}
},
{
name: 'second preprocessor',
markup: () => {
console.log('this runs fourth');
},
script: () => {
console.log('this runs fifth');
},
style: () => {
console.log('this runs sixth');
}
}
], {
filename: 'App.svelte'
});
multiple-preprocessor.ts
ts
import { preprocess } from 'svelte/compiler';
const { code } = await preprocess(
source,
[
{
name: 'first preprocessor',
markup: () => {
console.log('this runs first');
},
script: () => {
console.log('this runs second');
},
style: () => {
console.log('this runs third');
},
},
{
name: 'second preprocessor',
markup: () => {
console.log('this runs fourth');
},
script: () => {
console.log('this runs fifth');
},
style: () => {
console.log('this runs sixth');
},
},
],
{
filename: 'App.svelte',
},
);

walk

walk 函数提供了一种使用编译器自己的内置 estree-walker 实例遍历解析器生成的抽象语法树的方法。

遍历器获取要遍历的抽象语法树和一个具有两个可选方法的对象:enterleave。对于每个节点,都会调用 enter(如果存在)。然后,除非在 enter 期间调用 this.skip(),否则将遍历每个子节点,然后在节点上调用 leave

compiler-walk.js
ts
import { walk } from 'svelte/compiler';
walk(ast, {
enter(node, parent, prop, index) {
do_something(node);
if (should_skip_children(node)) {
this.skip();
}
},
leave(node, parent, prop, index) {
do_something_else(node);
}
});
compiler-walk.ts
ts
import { walk } from 'svelte/compiler';
walk(ast, {
enter(node, parent, prop, index) {
do_something(node);
if (should_skip_children(node)) {
this.skip();
}
},
leave(node, parent, prop, index) {
do_something_else(node);
},
});

VERSION

ts
const VERSION: string;

当前版本,如 package.json 中所设置。

ts
import { VERSION } from 'svelte/compiler';
console.log(`running svelte version ${VERSION}`);

类型

CompileOptions

ts
interface CompileOptions {}
ts
name?: string;
  • 默认 'Component'

设置结果 JavaScript 类的名称(尽管编译器会在与作用域中的其他变量冲突时重命名它)。通常会从 filename 推断出它

ts
filename?: string;
  • 默认 null

用于调试提示和源映射。您的打包器插件会自动设置它。

ts
generate?: 'dom' | 'ssr' | false;
  • 默认 'dom'

如果为 "dom",Svelte 会为挂载到 DOM 发射一个 JavaScript 类。如果为 "ssr",Svelte 会发射一个带有适合于服务器端渲染的 render 方法的对象。如果为 false,则不会返回 JavaScript 或 CSS;仅返回元数据。

ts
errorMode?: 'throw' | 'warn';
  • 默认 'throw'

如果为 "throw",则在发生编译错误时 Svelte 会抛出异常。如果为 "warn",则 Svelte 会将错误视为警告并将其添加到警告报告中。

ts
varsReport?: 'full' | 'strict' | false;
  • 默认 'strict'

如果为 "strict",则 Svelte 仅返回一个变量报告,其中仅包含既不是全局变量也不是内部变量的变量。如果为 "full",则 Svelte 会返回一个变量报告,其中包含所有检测到的变量。如果为 false,则不会返回变量报告。

ts
sourcemap?: object | string;
  • 默认 null

一个初始源映射,它将合并到最终输出源映射中。这通常是预处理器源映射。

ts
enableSourcemap?: EnableSourcemap;
  • 默认 true

如果为 true,则 Svelte 会为组件生成源映射。使用带有 jscss 的对象以更精细地控制源映射生成。

ts
outputFilename?: string;
  • 默认 null

用于您的 JavaScript 源映射。

ts
cssOutputFilename?: string;
  • 默认 null

用于您的 CSS 源映射。

ts
sveltePath?: string;
  • 默认 'svelte'

svelte 包的位置。来自 sveltesvelte/[module] 的任何导入都将相应地进行修改。

ts
dev?: boolean;
  • 默认 false

如果为 true,则会导致在组件中添加额外的代码,这些代码将在开发过程中执行运行时检查并提供调试信息。

ts
accessors?: boolean;
  • 默认 false

如果为 true,则会为组件的属性创建 getter 和 setter。如果为 false,则仅为只读导出值创建它们(即使用 constclassfunction 声明的那些值)。如果使用 customElement: true 进行编译,则此选项默认为 true

ts
immutable?: boolean;
  • 默认 false

如果为 true,则告诉编译器您保证不会改变任何对象。这允许它在检查值是否已更改时不那么保守。

ts
hydratable?: boolean;
  • 默认 false

如果在生成 DOM 代码时为 true,则启用 hydrate: true 运行时选项,该选项允许组件升级现有的 DOM,而不是从头创建新的 DOM。在生成 SSR 代码时,这会向 <head> 元素添加标记,以便水化知道要替换哪些元素。

ts
legacy?: boolean;
  • 默认 false

如果为 true,则生成可在 IE9 和 IE10 中运行的代码,它们不支持诸如 element.dataset 之类的内容。

ts
customElement?: boolean;
  • 默认 false

如果为 true,则告诉编译器生成自定义元素构造函数,而不是常规的 Svelte 组件。

ts
tag?: string;
  • 默认 null

一个 string,它告诉 Svelte 使用哪个标签名称来注册自定义元素。它必须是一个小写的字母数字字符串,至少包含一个连字符,例如 "my-element"

ts
css?: 'injected' | 'external' | 'none' | boolean;
  • 'injected'(以前为 true),样式将包含在 JavaScript 类中,并在运行时注入到实际呈现的组件中。
  • 'external'(以前为 false),CSS 将在编译结果的 css 字段中返回。大多数 Svelte 捆绑器插件会将其设置为 'external' 并使用静态生成的 CSS 以获得更好的性能,因为它将产生更小的 JavaScript 捆绑包,并且输出可以作为可缓存的 .css 文件提供。
  • 'none',完全避免样式,并且不生成 CSS 输出。
ts
loopGuardTimeout?: number;
  • 默认值 0

一个 number,它告诉 Svelte 在线程阻塞超过 loopGuardTimeout 毫秒时中断循环。这对于防止无限循环很有用。仅在 dev: true 时可用

ts
namespace?: string;
  • 默认值 'html'

元素的命名空间;例如,"mathml""svg""foreign"

ts
cssHash?: CssHashGetter;
  • 默认值 undefined

一个函数,它接受一个 { hash, css, name, filename } 参数,并返回用作作用域 CSS 的类名的字符串。它默认为返回 svelte-${hash(css)}

ts
preserveComments?: boolean;
  • 默认 false

如果为 true,则在服务器端渲染期间保留 HTML 注释。默认情况下,它们会被删除。

ts
preserveWhitespace?: boolean;
  • 默认 false

如果为 true,则保留元素内部和之间的空白,就像您键入的那样,而不是删除或尽可能折叠成一个空格。

ts
discloseVersion?: boolean;
  • 默认 true

如果为 true,则通过将其添加到存储在全局 window.__svelte.v 中的 Set 中,在浏览器中公开 Svelte 主要版本。

CompileResult

svelte/compilercompile 返回的形状

ts
interface CompileResult {}
ts
js: {}

从组件编译中生成的结果 JavaScript 代码

ts
code: string;

字符串形式的代码

ts
map: any;

源映射

ts
css: CssResult;

从组件编译中生成的结果 CSS 代码

ts
ast: Ast;

表示组件结构的抽象语法树

ts
warnings: Warning[];

编译期间生成的警告对象数组。每个警告都有几个属性

  • code 是一个标识警告类别的字符串
  • message 以人类可读的术语描述问题
  • 如果警告与特定位置相关,则开始和结束是具有行、列和字符属性的对象
  • 如果适用,则框架是一个突出显示带有行号的违规代码的字符串
ts
vars: Var[];

生态系统中的工具(如我们的 ESLint 插件)使用的组件声明数组,用于推断更多信息

ts
stats: {
timings: {
total: number;
};
};

Svelte 开发团队用于诊断编译器的一个对象。避免依赖它保持不变!

CssHashGetter

ts
type CssHashGetter = (args: {
name: string;
filename: string | undefined;
css: string;
hash: (input: string) => string;
}) => string;

EnableSourcemap

ts
type EnableSourcemap =
| boolean
| { js: boolean; css: boolean };

MarkupPreprocessor

一个标记预处理器,它获取一个代码字符串并返回一个经过处理的版本。

ts
type MarkupPreprocessor = (options: {
/**
* The whole Svelte file content
*/
content: string;
/**
* The filename of the Svelte file
*/
filename?: string;
}) => Processed | void | Promise<Processed | void>;

Preprocessor

一个脚本/样式预处理器,它获取一个代码字符串并返回一个经过处理的版本。

ts
type Preprocessor = (options: {
/**
* The script/style tag content
*/
content: string;
/**
* The attributes on the script/style tag
*/
attributes: Record<string, string | boolean>;
/**
* The whole Svelte file content
*/
markup: string;
/**
* The filename of the Svelte file
*/
filename?: string;
}) => Processed | void | Promise<Processed | void>;

PreprocessorGroup

预处理器组是一组应用于 Svelte 文件的预处理器。

ts
interface PreprocessorGroup {}
ts
name?: string;

预处理器的名称。将在下一个主要版本中成为一个必需选项

ts
markup?: MarkupPreprocessor;
ts
style?: Preprocessor;
ts
script?: Preprocessor;

Processed

预处理器运行的结果。如果预处理器未返回结果,则假定代码未更改。

ts
interface Processed {}
ts
code: string;

新代码

ts
map?: string | object;

映射回原始代码的源映射

ts
dependencies?: string[];

要监视其更改的附加文件列表

ts
attributes?: Record<string, string | boolean>;

仅适用于脚本/样式预处理器:要设置在标记上的更新属性。如果未定义,则属性保持不变。

ts
toString?: () => string;

SveltePreprocessor

实用程序类型,用于从预处理器组中提取预处理器的类型

ts
interface SveltePreprocessor<
PreprocessorType extends keyof PreprocessorGroup,
Options = any
> {}
ts
(options?: Options): Required<Pick<PreprocessorGroup, PreprocessorType>>;
上一个 svelte/action