Skip to main content

Compilateur et API

svelte/compiler

Modifier cette page sur Github

En général, vous n'interagirez pas directement avec le compilateur Svelte, mais vous l'intègrerez plutôt dans un processus de build à travers un plugin de bundler. Le plugin que l'équipe Svelte recommande et avec lequel elle travaille est vite-plugin-svelte. Le framework SvelteKit fournit une configuration de vite-plugin-svelte qui permet de compiler des applications et de packager des librairies de composants Svelte. Svelte Society maintient des plugins pour d'autres bundlers (notamment Rollup et Webpack).

Néanmoins, il est utile de comprendre comment utiliser le compilateur, puisque les plugins exposent généralement des options.

compile

ts
function compile(
source: string,
options?: CompileOptions

C'est ici que la magie opère. svelte.compile convertit le code source des composants en module JavaScript qui exporte des classes.

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

Référez-vous à la section CompilerOptions pour voir les options disponibles.

L'objet retourné result contient le code du composant, ainsi que des métadonnées utiles.

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

Référez-vous à la section CompilerResult pour une description du résultat compilé.

parse

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

La méthode parse convertit un composant pour retourner son arbre syntaxique abstrait (AST). Contrairement à la compilation avec l'option generate: false, aucune validation ni analyse n'est effectuée. Notez que l'AST n'est pas considéré comme une API publique ; des changements critiques pourraient survenir à n'importe quel moment.

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

preprocess

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

Un certain nombre de plugins de pré-processeur maintenus par la communauté est disponible pour vous permettre d'utiliser Svelte avec des outils comme TypeScript, PostCSS, SCSS, et Less.

Vous pouvez écrire votre propre pré-processeur en utilisant l'API `svelte.

La fonction preprocess fournit des framework pour transformer le code source d'un composant selon vos besoins. Par exemple, elle peut convertir un bloc <style lang="sass"> en css natif.

Le premier argument est le code source du composant lui-même. Le second argument est un tableau de pré-processeurs (ou éventuellement un seul pré-processeur si vous n'en avez qu'un). Un pré-processeur est un objet contenant trois fonctions : markup, script et style, toutes optionnelles.

La fonction markup reçoit en argument le markup du composant, et le nom du composant filename s'il était spécifié comme troisième argument.

Les fonctions script et style reçoivent le contenu des blocs <script> et <style> respectivement (content) ainsi que toute la source textuelle (markup) du composant. En plus du nom du fichier filename, elles reçoivent un objet contenant les attributs de l'élément.

Chaque fonction markup, script et style doit retourner un objet (ou une Promesse qui résout un objet) contenant un attribut code, représentant le code source transformé. Ces fonctions peuvent aussi renvoyer un tableau facultatif de dépendances dependencies qui représente les fichiers dont les changements sont à surveiller, ainsi qu'un objet map qui est une sourcemap renvoyant la transformation vers le code d'origine. Les pré-processeurs script et style peuvent de manière optionnelle renvoyer un ensemble d'attributs qui représentent les attributs mis à jour sur les balises <script>/<style>.

Les fonctions de preprocessing doivent également retourner un objet map en plus de code et dependencies, où map correspond à la sourcemap de la transformation.

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'
}
);

Si un tableau de dépendances dependencies est retourné, il sera inclus dans l'objet retourné. Ce tableau est utilisé par des librairies comme rollup-plugin-svelte pour surveiller les changements dans les fichiers, par exemple si un bloc <style> contient un import de type @import.

ts
import { preprocess } from 'svelte/compiler';
import MagicString from 'magic-string';
import sass from 'sass';
import { dirname } from 'path';
 
const { code } = await preprocess(
source,
{
name: 'my-fancy-preprocessor',
markup: ({ content, filename }) => {
// renvoie le code tel quel quand aucune string foo n'est présente
const pos = content.indexOf('foo');
if (pos < 0) {
return;
}
 
// Remplace foo par bar en utilisant MagicString qui fournit
// une sourcemap en plus du code modifié
const s = new MagicString(content, { filename });
s.overwrite(pos, pos + 3, 'bar', { storeName: true });
Property 'css' does not exist on type 'unknown'.
Property 'stats' does not exist on type 'unknown'.
2339
2339
Property 'css' does not exist on type 'unknown'.
Property 'stats' does not exist on type 'unknown'.
 
return {
code: s.toString(),
map: s.generateMap({ hires: true, file: filename })
};
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'.
},
style: async ({ content, attributes, filename }) => {
// traite uniquement <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);
}
)
);
 
// supprime l'attribut lang de la balise <style>
delete attributes.lang;
 
return {
code: css.toString(),
dependencies: stats.includedFiles,
attributes
};
}
},
{
filename: 'App.svelte'
}
);

Plusieurs pré-processeurs peuvent être utilisés ensemble. La sortie du premier devient l'argument du second. Les fonctions sont exécutées dans l'ordre suivant : markup, script puis style.

En Svelte 3, toutes les fonctions markup étaient exécutées en premier, puis toutes les fonctions script et enfin toutes les fonctions style. Cet ordre a été changé dans Svelte 4.

ts
import { preprocess } from 'svelte/compiler';
 
const { code } = await preprocess(source, [
{
name: 'premier pré-processeur',
markup: () => {
console.log('ceci est éxécuté en premier');
},
script: () => {
console.log('ça en second');
},
style: () => {
console.log('ça en troisième');
}
},
{
name: 'second pré-processeur',
markup: () => {
console.log('ça en quatrième');
},
script: () => {
console.log('ça en cinquième');
},
style: () => {
console.log('ça en sixième');
}
}
], {
filename: 'App.svelte'
});

walk

La fonction walk fournit un un moyen de parcourir les arbres AST générés par le parser, en utilisant l'utilitaire estree-walker du compilateur.

La fonction prend comme argument l'arbre AST à traiter et un objet contenant 2 méthodes facultatives : enter et leave. enter est appelée pour chaque noeud (si la méthode est définie). Puis, à moins que this.skip() n'ait été appelée lors de l'exécution de enter, chaque enfant est également traversé. Enfin, la méthode leave est appelée pour le noeud actuel.

ts
import { walk } from 'svelte/compiler';
 
walk(ast, {
enter(node, parent, prop, index) {
faire_quelque_chose(node);
if (doit_ignorer_les_enfants(node)) {
this.skip();
}
},
leave(node, parent, prop, index) {
faire_autre_chose(node);
}
});

VERSION

ts
const VERSION: string;

La version actuelle, définie dans le fichier package.json.

ts
import { VERSION } from 'svelte/compiler';
console.log(`la version ${VERSION} de Svelte est en cours d'exécution`);

Types

CompileOptions

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

définit le nom de la classe JavaScript généré (bien que le compilateur la renomera si son nom entre en conflit avec une autre variable). Il est normalement inféré à partir l'option filename.

ts
filename?: string;
  • default null

utilisée pour les conseils de déboggage et les sourcemaps. Le plugin du bundler la définit automatiquement.

ts
generate?: 'dom' | 'ssr' | false;
  • default 'dom'

Si "dom": Svelte émet une classe JavaScript pour monter le composant dans le DOM.

Si "ssr": Svelte émet un objet avec une méthode render, appropriée pour les rendus côté serveur.

Si false: aucun JavaScript ni CSS n'est émis, seules les metadata sont retournées.

ts
errorMode?: 'throw' | 'warn';
  • default 'throw'

Si "throw": Svelte lève une exception lorsqu'il rencontre une erreur de compilation.

Si "warn": Svelte traitera les erreurs comme des warnings et les ajoutera au rapport de warnings.

ts
varsReport?: 'full' | 'strict' | false;
  • default 'strict'

Si "strict": Svelte retourne un rapport de variables ne contenant que celles qui ne sont ni globales (globals) ni internes (internals).

Si "full": Svelte retourne un rapport de variables avec toutes les variables détectées.

Si false: aucun rapport n'est retourné.

ts
sourcemap?: object | string;
  • default null

Une sourcemap initiale qui sera fusionnée dans la sourcemap finale. C'est souvent la sourcemap du pré-processeur.

ts
enableSourcemap?: EnableSourcemap;
  • default true

Si true, Svelte génère des sourcemaps pour les composants. Utilisez un objet avec js ou css pour un contrôle plus fin de la génération des sourcemaps. Par défaut, l'option est à true.

ts
outputFilename?: string;
  • default null

Nom de fichier utilisé pour les sourcemaps JavaScript.

ts
cssOutputFilename?: string;
  • default null

Nom de fichier utilisé pour les sourcemaps CSS.

ts
sveltePath?: string;
  • default 'svelte'

L'emplacement de la librairie svelte. Tous les imports à svelte ou svelte/[module] seront modifiés en conséquence.

ts
dev?: boolean;
  • default false

If true, entraîne l'ajout de code supplémentaire dans les composants pour effectuer des vérifications à runtime et fournir des informations de déboggage pendant les développements.

ts
accessors?: boolean;
  • default false

Si true, des getters et setters seront générés pour les props des composants. Si false, ils ne seront créés que pour les valeurs exportées en lecture seules (c'est-à-dire celles déclarées avec const, class et function). Activer l'option de compilation customElement: true changera la valeur par défaut de accessors à true.

ts
immutable?: boolean;
  • default false

Si true, indique au compilateur que vous vous engagez à ne pas muter d'objets. Cela permet au compilateur d'être moins conservatif lorsqu'il vérifie si une valeur a changé.

ts
hydratable?: boolean;
  • default false

Si true, lors de la génération du code DOM, autorise l'option de runtime hydrate: true, qui permet à un composant de mettre à jour le DOM existant sans avoir à créer un nouveau noeud. Lors de la génération de code côté serveur (SSR), cela ajoute des marqueurs à la section <head> pour identifier quels éléments hydrater.

ts
legacy?: boolean;
  • default false

Si true, génère du code compatible avec IE9 et IE10, navigateurs qui ne supportent pas par exemple : element.dataset.

ts
customElement?: boolean;
  • default false

Si true, indique au compilateur de générer un constructeur de custom element à la place d'un composant Svelte traditionnel.

ts
tag?: string;
  • default null

Une string qui indique à Svelte le nom à donner au custom element. Ce doit être une chaîne composée de caractères alphanumériques avec au moins un tiret, par exemple "mon-element".

ts
css?: 'injected' | 'external' | 'none' | boolean;
  • 'injected' (anciennement true): le style sera inclus dans les classes JavaScript et injecté au runtime pour les composants réellement rendus.
  • 'external' (anciennement false): le style sera renvoyé dans la propriété css du résultat de la compilation. La plupart des plugins Svelte de bundler définiront cette option à 'external' et utiliseront le CSS généré statiquement. Cela permet d'atteindre de meilleures performances, puisque les bundles JavaScript seront plus petits et le style généré sous forme de fichiers .css pourra être mis en cache.
  • 'none': le style sera complètement ignoré et aucun CSS ne sera généré.
ts
loopGuardTimeout?: number;
  • default 0

Un number qui indique à Svelte d'arrêter une boucle si elle bloque le thread durant plus de loopGuardTimeout ms. Utile pour éviter les boucles infinies. Uniquement disponible lorsque dev: true

ts
namespace?: string;
  • default 'html'

Le namespace de l'élément; par exemple, "mathml", "svg", "foreign".

ts
cssHash?: CssHashGetter;
  • default undefined

Une fonction qui prend comme arguments { hash, css, name, filename } et retourne un nom de classe utilisé pour le css scopé. La fonction par défaut retourne svelte-${hash(css)}.

ts
preserveComments?: boolean;
  • default false

Si true, les commentaires HTML seront conservés au cours du rendu côté serveur. Par défault, ils sont supprimés.

ts
preserveWhitespace?: boolean;
  • default false

Si true, les caractères blancs (espaces, tabulations, ...) seront gardés tels quels, plutôt que supprimés ou fusionnés lorsque c'est possible.

ts
discloseVersion?: boolean;
  • default true

Si true, expose la version majeure de Svelte dans l'objet global window du navigateur.

CompileResult

La forme de ce que renvoie compile du svelte/compiler

ts
interface CompileResult {}
ts
js: {}

Le code JavaScript généré après compilation du composant

ts
code: string;

Code en tant que string

ts
map: any;

Une sourcemap

ts
css: CssResult;

Le code CSS généré après compilation du composant

ts
ast: Ast;

L'arbre AST représentant la structure du composant

ts
warnings: Warning[];

Un tableau de warnings générés pendant la compilation. Chaque warning possède les attributs suivants :

  • code : une string identifiant la catégorie du warning
  • message : décrit le problème de manière intelligible
  • start et end : si le warning est relevé à un endroit particulier, ce sont des objets avec les propriétés line, column et character
  • frame : si pertinent, correspond à du texte précisant l'emplacement du code concerné, avec le numéro de ligne
ts
vars: Var[];

Un tableau reprenant les objets déclarés dans le composant et utilisés par l'écosystème (comme le plugin Svelte ESLint) pour inféré plus d'informations

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

Objet utilisé par l'équipe de développement de Svelte pour diagnostiquer le compilateur. Évitez de vous en servir car il pourrait changer à tout moment !

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

A markup preprocessor that takes a string of code and returns a processed version.

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

A script/style preprocessor that takes a string of code and returns a processed version.

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

A preprocessor group is a set of preprocessors that are applied to a Svelte file.

ts
interface PreprocessorGroup {}
ts
name?: string;

Name of the preprocessor. Will be a required option in the next major version

ts
ts
style?: Preprocessor;
ts
script?: Preprocessor;

Processed

The result of a preprocessor run. If the preprocessor does not return a result, it is assumed that the code is unchanged.

ts
interface Processed {}
ts
code: string;

The new code

ts
map?: string | object;

A source map mapping back to the original code

ts
dependencies?: string[];

A list of additional files to watch for changes

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

Only for script/style preprocessors: The updated attributes to set on the tag. If undefined, attributes stay unchanged.

ts
toString?: () => string;

SveltePreprocessor

Utility type to extract the type of a preprocessor from a preprocessor group

ts
interface SveltePreprocessor<
PreprocessorType extends keyof PreprocessorGroup,
Options = any
> {}
ts
(options?: Options): Required<Pick<PreprocessorGroup, PreprocessorType>>;