通常,你不会直接与 Svelte 编译器交互,而是会使用打包器插件将其集成到构建系统中。Svelte 团队最推荐并投入最多的打包器插件是 vite-plugin-svelte。SvelteKit 框架提供了一个利用 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';constresult =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';constast =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
以及可选的 markup
、script
和 style
函数。
markup
函数接收整个组件源文本以及组件的 filename
(如果在第三个参数中指定了该名称)。
script
和 style
函数分别接收 <script>
和 <style>
元素的内容(content
)以及整个组件源文本(markup
)。除了 filename
之外,它们还会获取一个元素属性对象。
每个 markup
、script
或 style
函数都必须返回一个对象(或解析为对象的 Promise),该对象具有 code
属性,表示转换后的源代码。它们可以选择返回 dependencies
数组,该数组表示要监视其更改的文件,以及 map
对象,该对象是将转换映射回原始代码的源映射。script
和 style
预处理器可以选择返回一个属性记录,该记录表示脚本/样式标签上的更新属性。
预处理器函数应尽可能返回
map
对象,否则调试将变得更加困难,因为堆栈跟踪无法正确链接到原始代码。
ts
import {preprocess } from 'svelte/compiler';importMagicString from 'magic-string';const {code } = awaitpreprocess (source ,{markup : ({content ,filename }) => {constpos =content .indexOf ('foo');if (pos < 0) {return {code :content };}consts = newMagicString (content , {filename });s .overwrite (pos ,pos + 3, 'bar', {storeName : true });return {code :s .toString (),map :s .generateMap ()};}},{filename : 'App.svelte'});
如果返回 dependencies
数组,它将包含在结果对象中。这被 vite-plugin-svelte 和 rollup-plugin-svelte 等包使用,以监视其他文件的更改,例如,当你的 <style>
标签具有 @import
(例如)。
ts
import {preprocess } from 'svelte/compiler';importType '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'.MagicString from 'magic-string'; importsass from 'sass';import {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'.dirname } from 'path';const {code } = awaitpreprocess (source ,{name : 'my-fancy-preprocessor',markup : ({content ,filename }) => {// Return code as is when no foo string presentconstpos =content .indexOf ('foo');if (pos < 0) {return;}// Replace foo with bar using MagicString which provides// a source map along with the changed codeconsts = newMagicString (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 newPromise ((resolve ,reject ) =>sass .render ({file :filename ,data :content ,includePaths : [dirname (filename )]},(err ,result ) => {if (err )reject (err );elseresolve (result );}));// remove lang attribute from style tagdeleteattributes .lang ;return {code :css .toString (),dependencies :stats .includedFiles ,attributes };}},{filename : 'App.svelte'});
多个预处理器可以一起使用。第一个的输出成为第二个的输入。在一个预处理器中,markup
首先运行,然后是 script
和 style
。
在 Svelte 3 中,所有
markup
函数首先运行,然后是所有script
,最后是所有style
预处理器。此顺序在 Svelte 4 中已更改。
ts
import {preprocess } from 'svelte/compiler';const {code } = awaitpreprocess (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'});
ts
import {preprocess } from 'svelte/compiler';const {code } = awaitpreprocess (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 实例遍历解析器生成的抽象语法树的方法。
遍历器获取要遍历的抽象语法树和一个具有两个可选方法的对象:enter
和 leave
。对于每个节点,都会调用 enter
(如果存在)。然后,除非在 enter
期间调用 this.skip()
,否则将遍历每个子节点,然后在节点上调用 leave
。
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 );}});
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 会为组件生成源映射。使用带有 js
或 css
的对象以更精细地控制源映射生成。
ts
outputFilename?: string;
- 默认
null
用于您的 JavaScript 源映射。
ts
cssOutputFilename?: string;
- 默认
null
用于您的 CSS 源映射。
ts
sveltePath?: string;
- 默认
'svelte'
svelte
包的位置。来自 svelte
或 svelte/[module]
的任何导入都将相应地进行修改。
ts
dev?: boolean;
- 默认
false
如果为 true
,则会导致在组件中添加额外的代码,这些代码将在开发过程中执行运行时检查并提供调试信息。
ts
accessors?: boolean;
- 默认
false
如果为 true
,则会为组件的属性创建 getter 和 setter。如果为 false
,则仅为只读导出值创建它们(即使用 const
、class
和 function
声明的那些值)。如果使用 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/compiler
中 compile
返回的形状
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>>;