If that's
not you (yet), you may prefer to visit the interactive tutorial or the examples before consulting this reference.
Don't be shy about asking for help in the Discord chatroom.
Using an older version of Svelte? Have a look at the
v2 docs.
Getting started
To try Svelte in an interactive online environment you can try
the REPL or StackBlitz.
To create a project locally, run:
npm create vite@latest myapp -- --template svelte
cd myapp
npm install
npm run dev
Or use SvelteKit, the official application framework from the Svelte team (currently in release candidate status).
The Svelte team maintains a
VS Code extension and the Svelte community has created a list of integrations with various other tooling and editors.
If you're having trouble, get help on Discord or
StackOverflow.
Component format
Components are the building blocks of Svelte
applications. They are written into .svelte files, using a superset of HTML.
All three sections — script, styles and markup — are optional.
<script>// logic goes herescript><style>/* styles go here */style>
A block contains JavaScript that runs when a component instance is created. Variables declared (or imported) at the top level are 'visible' from the component's markup. There are four additional rules:
1. export creates a component prop
Svelte uses the export keyword to mark a variable declaration as a property or prop, which means it becomes accessible to consumers of the component (see the section on attributes and props for more information).
<script>exportlet foo;// Values that are passed in as props// are immediately available
console.log({ foo });script>
You can specify a default initial value for a prop. It will be used if the component's consumer doesn't specify the prop on the component (or if its initial value is undefined) when instantiating the component. Note that whenever a prop is removed by the consumer, its value is set to undefined rather than the initial value.
In development mode (see the compiler options), a warning
will be printed if no default initial value is provided and the consumer does not specify a value. To squelch this warning, ensure that a default initial value is specified, even if it is undefined.
<script>exportlet bar ='optional default initial value';exportlet baz =undefined;script>
If you export a const, class or function, it is readonly from outside the component. Functions are valid prop values, however, as shown below.
<script>// these are readonlyexportconst thisIs ='readonly';exportfunctiongreet(name){alert(`hello ${name}!`);}// this is a propexportletformat=n=> n.toFixed(2);script>
Readonly props can be accessed as properties on the element, tied to the component
using bind:this syntax.
You can use reserved words as prop names.
<script>let className;// creates a `class` property, even// though it is a reserved wordexport{ className asclass};script>
2. Assignments are 'reactive'
To change component state and trigger a re-render, just assign to a locally declared variable.
Update expressions (count += 1) and property assignments
(obj.x = y) have the same effect.
<script>let count =0;functionhandleClick(){// calling this function will trigger an// update if the markup references `count`
count = count +1;}script>
Because Svelte's reactivity is based on assignments, using array methods like .push() and .splice() won't automatically trigger updates. A subsequent assignment is required to trigger the update. This and more details can also be found in the tutorial.
<script>let arr =[0,1];functionhandleClick(){// this method call does not trigger an update
arr.push(2);// this assignment will trigger an update// if the markup references `arr`
arr = arr
}script>
Svelte's
blocks are run only when the component is created, so assignments within a block are not automatically run again when a prop updates. If you'd like to track changes to a prop, see the next example in the following section.
<script>exportlet person;// this will only set `name` on component creation// it will not update when `person` doeslet{ name }= person;script>
3. $: marks a statement as reactive
Any top-level statement (i.e. not inside a block or a function) can be made reactive by
prefixing it with the $: JS label syntax. Reactive statements run after other script code and before the component markup is rendered, whenever the values that they depend on have changed.
<script>exportlet title;exportlet person
// this will update `document.title` whenever// the `title` prop changes
$: document.title = title;
$:{
console.log(`multiple statements can be combined`);
console.log(`the current title is ${title}`);}// this will update `name` when 'person' changes
$:({ name }= person);// don't do this. it will run before the previous linelet name2 = name;script>
Only values which directly appear within the $: block will become dependencies of the reactive statement. For example, in the
code below total will only update when x changes, but not y.
<script>let x =0;let y =0;functionyPlusAValue(value){return value + y;}
$: total =yPlusAValue(x);script>
Total: {total}<buttonon:click={()=> x++}>
Increment X
button><buttonon:click={()=> y++}>
Increment Y
button>
It is important to note that the reactive blocks are ordered via simple static analysis at compile time, and all the compiler looks at are the variables that are assigned to and used within the block itself, not in any functions called by them. This means that yDependent will not be updated when x is updated in the following example:
<script>let x =0;let y =0;constsetY=(value)=>{
y = value;}
$: yDependent = y;
$:setY(x);script>
Moving the line
$: yDependent = y below $: setY(x) will cause yDependent to be updated when x is updated.
If a statement consists entirely of an assignment to an undeclared variable, Svelte will inject a let declaration on your behalf.
<script>exportlet num;// we don't need to declare `squared` and `cubed`// — Svelte does it for us
$: squared = num * num;
$: cubed = squared * num;script>
4. Prefix stores with $ to access their values
A store is an object that allows reactive access to a value via a simple store
contract. The svelte/store module contains minimal store implementations which fulfil this contract.
Any time you have a reference to a store, you can access its value inside a component by prefixing it with the $ character. This causes Svelte to declare the prefixed variable, subscribe to the store at component initialization and unsubscribe when appropriate.
Assignments to
$-prefixed variables require that the variable be a writable store, and will result in a call to the store's .set method.
Note that the store must be declared at the top level of the component — not inside an if block or a function, for example.
Local variables (that do not represent store values) must not have a $ prefix.
store ={subscribe:(subscription:(value: any)=>void)=>(()=>void), set?:(value: any)=>void}
You can create your own stores without relying on svelte/store, by implementing the store contract:
A store must contain a .subscribe method, which must accept as its argument a subscription function. This subscription function must be immediately and synchronously called with the store's current value upon calling .subscribe. All of a store's active
subscription functions must later be synchronously called whenever the store's value changes.
The .subscribe method must return an unsubscribe function. Calling an unsubscribe function must stop its subscription, and its corresponding subscription function must not be called again by the store.
A store may optionally contain a .set method, which must accept as its argument a new value for the store, and which synchronously calls all of the store's active subscription
functions. Such a store is called a writable store.
For interoperability with RxJS Observables, the .subscribe method is also allowed to return an object with an .unsubscribe method, rather than return the unsubscription function directly. Note however that unless .subscribe synchronously calls the subscription (which is not required by the Observable spec), Svelte will see the value of the store as undefined until it does.
A tag with a context="module" attribute runs once when the module first evaluates, rather than for each component instance. Values declared in this block are accessible from a regular (and the component markup) but not vice versa.
You can export bindings from this block, and they will become exports of the compiled module.
You cannot export default, since the default export is the component itself.
Variables defined in
module scripts are not reactive — reassigning them will not trigger a rerender even though the variable itself will update. For values shared between multiple components, consider using a store.
<scriptcontext="module">let totalComponents =0;// this allows an importer to do e.g.// `import Example, { alertTotal } from './Example.svelte'`exportfunctionalertTotal(){alert(totalComponents);}script><script>
totalComponents +=1;
console.log(`total number of times this component has been created: ${totalComponents}`);script>
CSS inside a block will be scoped to that component.
This works by
adding a class to affected elements, which is based on a hash of the component styles (e.g. svelte-123xyz).
<style>p{/* this will only affect
elements in this component */
color: burlywood;}style>
To apply styles to a selector globally, use the :global(...) modifier.
<style>:global(body){/* this will apply to */margin: 0;}div :global(strong){/* this will apply to all elements, in any
component, that are inside
elements belonging
to this component */
color: goldenrod;}p:global(.red){/* this will apply to all
elements belonging to this
component with a class of red, even if class="red" does
not initially appear in the markup, and is instead
added at runtime. This is useful when the class
of the element is dynamically applied, for instance
when updating the element's classList property directly. */
}style>
If you want to make @keyframes that are accessible globally, you need to prepend your keyframe names with -global-.
The -global- part will be removed when compiled, and the keyframe then be referenced using just my-animation-name elsewhere in your
code.
Attribute values can contain JavaScript expressions.
<ahref="page/{p}">page {p}a>
Or they can be JavaScript expressions.
<buttondisabled={!clickable}>...button>
Boolean attributes are included on the element if their value is truthy and excluded if it's falsy.
All other attributes are included unless their value is nullish (null or undefined).
<inputrequired={false}placeholder="This input field is not required"><divtitle={null}>This div has no title attributediv>
An expression might include characters that would cause syntax
highlighting to fail in regular HTML, so quoting the value is permitted. The quotes do not affect how the value is parsed:
<buttondisabled="{number !==42}">...button>
When the attribute name and value match (name={name}), they can be replaced with {name}.
By convention, values passed to components are referred to as properties or props rather than attributes, which are a feature of the DOM.
As with elements, name={name} can be replaced
with the {name} shorthand.
<Widgetfoo={bar}answer={42}text="hello"/>
Spread attributes allow many attributes or properties to be passed to an element or component at once.
An element or component can have multiple spread attributes, interspersed with regular ones.
$$props references all props that are passed to a component, including ones that are not declared with export. It is not generally recommended, as it is difficult for Svelte to optimise. But
it can be useful in rare cases – for example, when you don't know at compile time what props might be passed to a component.
$$restProps contains only the props which are not declared with export. It can be used to pass down other unknown attributes to an element in a component. It shares the same optimisation problems as $$props, and is likewise not recommended.
The value attribute of an input element or its children
option elements must not be set with spread attributes when using bind:group or bind:checked. Svelte needs to be able to see the element's value directly in the markup in these cases so that it can link it to the bound variable.
Text expressions
Text can also contain JavaScript expressions:
If you're using a regular expression (RegExp)
literal notation, you'll need to wrap it in parentheses.
Comments beginning with svelte-ignore disable warnings for the next block of markup. Usually, these are accessibility warnings; make sure
that you're disabling them for a good reason.
<inputbind:value={name}autofocus>
{#if ...}
{#if expression}...{:elseif expression}...{/if}
{#if expression}...{:else}...{/if}
Content that is conditionally rendered can be wrapped in an if block.
{#if answer ===42}<p>what was the question?p>{/if}
Additional conditions can be added with {:else if expression}, optionally ending in an {:else} clause.
Iterating over lists of values can be done with an each block.
<h2>Shopping listh2><ul>{#eachitems asitem}<li>{item.name} x {item.qty}li>{/each}ul>
You can use each blocks to iterate over any array or array-like value — that is, any object with a length property.
An each block can also specify an index, equivalent to the second argument in an array.map(...) callback:
{#eachitems asitem, i}<li>{i +1}: {item.name} x {item.qty}li>{/each}
If a key expression is provided — which must uniquely identify each list item — Svelte will use it
to diff the list when data changes, rather than adding or removing items at the end. The key can be any object, but strings and numbers are recommended since they allow identity to persist when the objects themselves change.
{#eachitems asitem (item.id)}<li>{item.name} x {item.qty}li>{/each}{#eachitems asitem, i (item.id)}<li>{i +1}: {item.name} x {item.qty}li>{/each}
You can freely use destructuring and rest patterns in each blocks.
{#eachitems as{ id, name, qty }, i (id)}<li>{i +1}: {name} x {qty}li>{/each}{#eachobjects as{ id,...rest }}<li><span>{id}span><MyComponent{...rest}/>li>{/each}{#eachitems as[id,...rest]}<li><span>{id}span><MyComponentvalues={rest}/>li>{/each}
An each block can also have an {:else} clause, which is rendered if the list is empty.
Await blocks allow you to branch on the three possible states of a Promise — pending, fulfilled or rejected. In SSR mode, only the pending state will be rendered on the server.
{#await promise}<p>waiting for the promise to resolve...p>{:then value}<p>The value is {value}p>{:catch error}<p>Something went wrong: {error.message}p>{/await}
The catch block can be omitted if you don't need to render anything when the promise rejects (or no error is possible).
{#await promise}<p>waiting for the promise to resolve...p>{:then value}<p>The value is {value}p>{/await}
If you
don't care about the pending state, you can also omit the initial block.
{#await promise then value}<p>The value is {value}p>{/await}
Similarly, if you only want to show the error state, you can omit the then block.
{#await promise catch error}<p>The error is {error}p>{/await}
{#key ...}
{#key expression}...{/key}
Key blocks destroy and recreate their contents when the value of an expression changes.
This is useful if you want an element to play its transition whenever a value changes.
{#key value}<divtransition:fade>{value}div>{/key}
When used around components, this will cause them to be reinstantiated and reinitialised.
{#key value}<Component/>{/key}
{@html ...}
In a text expression, characters like < and > are escaped; however, with HTML expressions, they're not.
The expression should be valid standalone HTML — {@html "
"}content{@html "
"} will not work, because
is not valid HTML. It also will not compile Svelte code.
Svelte
does not sanitize expressions before injecting HTML. If the data comes from an untrusted source, you must sanitize it, or you are exposing your users to an XSS vulnerability.
The {@debug ...} tag offers an alternative to console.log(...). It logs the values of specific variables whenever they change, and pauses code execution if you have devtools open.
<script>let user ={
firstname:'Ada',
lastname:'Lovelace'};script>{@debug user}<h2>Hello {user.firstname}!h2>
{@debug ...}
accepts a comma-separated list of variable names (not arbitrary expressions).
The {@debug} tag without any arguments will insert a debugger statement that gets triggered when any state changes, as opposed to the specified variables.
Data ordinarily flows down, from parent to child. The bind: directive allows data to flow
the other way, from child to parent. Most bindings are specific to particular elements.
The simplest bindings reflect the value of a property, such as input.value.
If the name matches the value, you can use shorthand.
<inputbind:value={value}><inputbind:value>
Numeric input values are coerced; even though input.value is a string as far as the DOM is concerned, Svelte will treat it as a number. If the input is empty or invalid (in the case of type="number"), the value
is undefined.
On elements with type="file", you can use bind:files to get the FileList of selected files. It is readonly.
<labelfor="avatar">Upload a picture:label><inputaccept="image/png, image/jpeg"bind:filesid="avatar"name="avatar"type="file"/>
If you're using bind: directives together with on: directives, the order that they're defined in affects the value of the bound variable when the event handler is called.
<script>let value ='Hello World';script><inputon:input="{()=> console.log('Old value:', value)}"bind:valueon:input="{()=> console.log('New value:', value)}"/>
Here we were binding to the value of a text input, which uses the input event. Bindings on other elements may use different events such as change.
Binding value
A value binding corresponds to the value property on the selected , which can be any value (not just strings, as is normally the case in the DOM).
Actions are functions that are called when an element is created. They can return an object with a destroy method that is called after the element is unmounted:
<script>functionfoo(node){// the node has been mounted in the DOMreturn{destroy(){// the node has been removed from the DOM}};}script><divuse:foo>div>
An action can have a parameter. If the returned value has an update method, it will be called whenever that parameter changes, immediately after Svelte has applied updates to the markup.
Don't worry about the fact that we're redeclaring the foo function for every component instance — Svelte will hoist any functions that don't depend on local state out of the component definition.
<script>exportlet bar;functionfoo(node, bar){// the node has been mounted in the DOMreturn{update(bar){// the value of `bar` has changed},destroy(){// the node has been removed from the DOM}};}script><divuse:foo={bar}>div>
A transition is triggered by an element entering or leaving the DOM as a result of a state change.
When a block is transitioning out, all elements inside the block, including those that do not have their own transitions, are kept in the DOM until every transition in the block has been completed.
The transition: directive indicates a bidirectional
transition, which means it can be smoothly reversed while the transition is in progress.
{#if visible}<divtransition:fade>
fades in and out
div>{/if}
By default intro transitions will not play on first render. You can modify this behaviour by setting intro: true when you create a component.
Transition
parameters
Like actions, transitions can have parameters.
(The double {{curlies}} aren't a special syntax; this is an object literal inside an expression tag.)
{#if visible}<divtransition:fade="{{ duration:2000}}">
fades in and out over two seconds
div>{/if}
Custom transition functions
Transitions can use custom functions. If the returned object has a css function, Svelte will create a CSS animation that plays on the element.
The
t argument passed to css is a value between 0 and 1 after the easing function has been applied. In transitions run from 0 to 1, out transitions run from 1 to 0 — in other words 1 is the element's natural state, as though no transition had been applied. The u argument is equal to 1 - t.
The function is called repeatedly before the transition begins, with different t and u
arguments.
A custom transition function can also return a tick function, which is called during the transition with the same t and u arguments.
If it's possible to use css instead of tick, do so — CSS animations can run off the main thread, preventing jank on slower devices.
<script>exportlet visible =false;functiontypewriter(node,{ speed =1}){const valid =(
node.childNodes.length ===1&&
node.childNodes[0].nodeType === Node.TEXT_NODE);if(!valid){thrownewError(`This transition only works on elements with a single text node child`);}const text = node.textContent;const duration = text.length /(speed *0.01);return{
duration,tick:t=>{const i =~~(text.length * t);
node.textContent = text.slice(0, i);}};}script>{#if visible}<pin:typewriter="{{ speed:1}}">
The quick brown fox jumps over the lazy dog
p>{/if}
If a transition returns a function instead of a transition object, the
function will be called in the next microtask. This allows multiple transitions to coordinate, making crossfade effects possible.
Transition events
An element with transitions will dispatch the following events in addition to any standard DOM events:
introstart
introend
outrostart
outroend
{#if visible}<ptransition:fly="{{ y:200, duration:2000}}"on:introstart="{()=> status ='intro started'}"on:outrostart="{()=> status ='outro started'}"on:introend="{()=> status ='intro ended'}"on:outroend="{()=> status ='outro ended'}">
Flies in and out
p>{/if}
Local transitions only play when the block they belong to is created or destroyed, not when parent blocks are created or destroyed.
{#if x}{#if y}<ptransition:fade>
fades in and out when x or y change
p><ptransition:fade|local>
fades in and out only when y changes
p>{/if}{/if}
in:fn/out:fn
Similar to transition:, but only applies to elements entering (in:) or leaving (out:) the DOM.
Unlike with transition:, transitions applied with in:
and out: are not bidirectional — an in transition will continue to 'play' alongside the out transition, rather than reversing, if the block is outroed while the transition is in progress. If an out transition is aborted, transitions will restart from scratch.
{#if visible}<divin:flyout:fade>
flies in, fades out
div>{/if}
An animation is triggered when the contents of a
keyed each block are re-ordered. Animations do not run when an element is added or removed, only when the index of an existing data item within the each block changes. Animate directives must be on an element that is an immediate child of a keyed each block.
Animations can be used with Svelte's built-in animation functions or custom animation functions.
{#eachlist asitem, index (item)}<lianimate:flip>{item}li>{/each}
Animation Parameters
As with actions and transitions, animations can have parameters.
(The double {{curlies}} aren't a special syntax; this is
an object literal inside an expression tag.)
{#eachlist asitem, index (item)}<lianimate:flip="{{ delay:500}}">{item}li>{/each}
Custom animation functions
Animations can use custom functions that provide the node, an animation object and any parameters as arguments. The animation parameter is an object containing from and to properties each containing a
DOMRect describing the geometry of the element in its start and end positions. The from property is the DOMRect of the element in its starting position, and the to property is the DOMRect of the element in its final position after the list has been reordered and the DOM updated.
If the returned object has a css method, Svelte will create a CSS
animation that plays on the element.
The t argument passed to css is a value that goes from 0 and 1 after the easing function has been applied. The u argument is equal to 1 - t.
The function is called repeatedly before the animation begins, with different t and u arguments.
<script>import{ cubicOut }from'svelte/easing';functionwhizz(node,{from, to }, params){const dx =from.left - to.left;const dy =from.top - to.top;const d = Math.sqrt(dx * dx + dy * dy);return{
delay:0,
duration: Math.sqrt(d)*120,
easing: cubicOut,css:(t, u)=>`transform: translate(${u * dx}px, ${u * dy}px) rotate(${t*360}deg);`};}script>{#eachlist asitem, index (item)}<divanimate:whizz>{item}div>{/each}
A custom animation function can also return a tick function, which is called during the
animation with the same t and u arguments.
If it's possible to use css instead of tick, do so — CSS animations can run off the main thread, preventing jank on slower devices.
<script>import{ cubicOut }from'svelte/easing';functionwhizz(node,{from, to }, params){const dx =from.left - to.left;const dy =from.top - to.top;const d = Math.sqrt(dx * dx + dy * dy);return{
delay:0,
duration: Math.sqrt(d)*120,
easing: cubicOut,tick:(t, u)=>
Object.assign(node.style,{
color: t >0.5?'Pink':'Blue'});};}script>{#eachlist asitem, index (item)}<divanimate:whizz>{item}div>{/each}
Component directives
on:eventname
Components can emit events using
createEventDispatcher, or by forwarding DOM events. Listening for component events looks the same as listening for DOM events:
<SomeComponenton:whatever={handler}/>
As with DOM events, if the on: directive is used without a value, the component will forward the event, meaning that a consumer of the component can listen for it.
<SomeComponenton:whatever/>
--style-props
--style-props="anycssvalue"
You can also pass styles as props to components for the purposes of theming, using CSS custom properties.
Svelte's implementation is essentially syntactic sugar for adding a wrapper element. This example:
Note: Since this is an extra , beware that your CSS structure might accidentally target this. Be mindful of this added wrapper element when using this feature.
Svelte's CSS Variables support allows for easily themeable components:
Components can have child content, in the same way that elements can.
The content is exposed in the child component using the element, which can
contain fallback content that is rendered if no children are provided.
<div><slot>
this fallback content will be rendered when no content is provided, like in the first example
slot>div><Widget>Widget><Widget><p>this is some child content that will overwrite the default slot contentp>Widget>
Named slots allow consumers to target specific areas. They can also have fallback content.
<div><slotname="header">No header was providedslot><p>Some content between header and footerp><slotname="footer">slot>div><Widget><h2slot="header">Helloh2><pslot="footer">Copyright (c) 2019 Svelte Industriesp>Widget>
Components can be placed in a named slot using the syntax . In order to place content in a slot without using a wrapper element, you can use the special element .
<div><slotname="header">No header was providedslot><p>Some content between header and footerp><slotname="footer">slot>div><Widget><HeaderComponentslot="header"/><svelte:fragmentslot="footer"><p>All rights reserved.p><p>Copyright (c) 2019 Svelte Industriesp>svelte:fragment>Widget>
$$slots
$$slots is an object whose keys are the names of the slots passed into the component by the parent. If the parent does not pass in a slot with a particular name, that name will not be present in $$slots. This allows components to render a slot (and other elements, like wrappers for styling) only if the parent provides it.
Note that explicitly passing in an empty named slot will add that slot's name to $$slots.
For example, if a parent passes to a child component, $$slots.title will be truthy within the child.
<div><slotname="title">slot>{#if $$slots.description}<hr><slotname="description">slot>{/if}div><Card><h2slot="title">Blog Post Titleh2>Card>
value}>
Slots can be rendered zero or more times, and can pass values back to the parent using props. The parent exposes the values to the slot template using the let: directive.
The usual shorthand rules apply — let:item is equivalent to let:item={item}, and
is equivalent to .
The element renders a component dynamically, using the component constructor specified as the this property. When the property changes, the component is destroyed and recreated.
The element lets you render an element of a dynamically specified type. This is useful for example when displaying rich text content from a CMS. Any properties and event listeners present will be applied to the element.
The only supported binding is bind:this, since the element type specific bindings that Svelte does at build time (e.g. bind:value for input elements) do not work with a dynamic tag type.
If this has a nullish value, the element and its children will
not be rendered.
If this is the name of a void tag (e.g., br) and has child elements, a runtime error will be thrown in development mode.
<script>let tag ='div';exportlet handler;script><svelte:elementthis={tag}on:click={handler}>Foosvelte:element>
<svelte:windowon:event={handler}/>
<svelte:windowbind:prop={value}/>
The element allows you to add event listeners to the window object without worrying about removing them when the component is destroyed, or checking for the existence of window when
server-side rendering.
Unlike , this element may only appear at the top level of your component and must never be inside a block or element.
<script>functionhandleKeydown(event){alert(`pressed the ${event.key} key`);}script><svelte:windowon:keydown={handleKeydown}/>
You can also bind to the following properties:
innerWidth
innerHeight
outerWidth
outerHeight
scrollX
scrollY
online — an alias for window.navigator.onLine
All except scrollX and scrollY are readonly.
<svelte:windowbind:scrollY={y}/>
Note that the page will not be scrolled to the initial value to avoid accessibility issues. Only subsequent changes to the bound variable of scrollX and scrollY will cause scrolling. However, if the scrolling behaviour is desired, call scrollTo() in onMount().
<svelte:bodyon:event={handler}/>
Similarly to , this element allows you to add listeners to events on document.body, such as mouseenter and mouseleave,
which don't fire on window. It also lets you use actions on the element.
As with , this element may only appear the top level of your component and must never be inside a block or element.
This element makes it possible to insert
elements into document.head. During server-side rendering, head content is exposed separately to the main html content.
As with and , this element may only appear at the top level of your component and must never be inside a block or element.
The element provides a place to specify per-component compiler options, which are detailed in the
compiler section. The possible options are:
immutable={true} — you never use mutable data, so the compiler can do simple referential equality checks to determine if values have changed
immutable={false} — the default. Svelte will be more conservative about whether or not mutable objects have changed
accessors={true} — adds getters and setters for the component's props
accessors={false} —
the default
namespace="..." — the namespace where this component will be used, most commonly "svg"; use the "foreign" namespace to opt out of case-insensitive attribute names and HTML-specific warnings
tag="..." — the name to use when compiling this component as a custom element
<svelte:optionstag="my-custom-element"/>
The element allows you to place content in a
named slot without wrapping it in a container DOM element. This keeps the flow layout of your document intact.
<div><slotname="header">No header was providedslot><p>Some content between header and footerp><slotname="footer">slot>div><Widget><h2slot="header">Helloh2><svelte:fragmentslot="footer"><p>All rights reserved.p><p>Copyright (c) 2019 Svelte Industriesp>svelte:fragment>Widget>
Run time
svelte
The svelte package exposes lifecycle functions and the context API.
onMount
onMount(callback:()=>void)
onMount(callback:()=>()=>void)
The onMount function schedules a callback to run as soon as
the component has been mounted to the DOM. It must be called during the component's initialisation (but doesn't need to live inside the component; it can be called from an external module).
onMount does not run inside a server-side component.
<script>import{ onMount }from'svelte';onMount(()=>{
console.log('the component has mounted');});script>
If a function is returned from onMount, it will be called when the component is
unmounted.
This behaviour will only work when the function passed to onMount synchronously returns a value. async functions always return a Promise, and as such cannot synchronously return a function.
beforeUpdate
beforeUpdate(callback:()=>void)
Schedules a callback to run immediately before the component is updated after any state change.
The first time the
callback runs will be before the initial onMount
<script>import{ beforeUpdate }from'svelte';beforeUpdate(()=>{
console.log('the component is about to update');});script>
afterUpdate
afterUpdate(callback:()=>void)
Schedules a callback to run immediately after the component has been updated.
The first time the callback runs will be after the initial onMount
<script>import{ afterUpdate }from'svelte';afterUpdate(()=>{
console.log('the component just updated');});script>
onDestroy
onDestroy(callback:()=>void)
Schedules a callback to run
immediately before the component is unmounted.
Out of onMount, beforeUpdate, afterUpdate and onDestroy, this is the only one that runs inside a server-side component.
<script>import{ onDestroy }from'svelte';onDestroy(()=>{
console.log('the component is being destroyed');});script>
tick
promise: Promise =tick()
Returns a promise that resolves once any pending state changes have been applied, or in the next microtask if there are none.
<script>import{ beforeUpdate, tick }from'svelte';beforeUpdate(async()=>{
console.log('the component is about to update');awaittick();
console.log('the component just updated');});script>
setContext
setContext(key: any, context: any)
Associates an arbitrary context object with the current component and the specified key and returns that object. The context is then available to children of the component (including slotted content) with getContext.
Like lifecycle functions, this must be called during component initialisation.
Checks whether a given key has been set in the context of a parent component. Must be called during component initialisation.
<script>import{ hasContext }from'svelte';if(hasContext('answer')){// do something}script>
getAllContexts
contexts: Map<any, any>=getAllContexts()
Retrieves the whole context map that belongs to the closest parent component. Must be called during component initialisation. Useful, for example, if you programmatically create a component and want to pass the existing context to it.
Creates an event dispatcher that can be used to dispatch
component events. Event dispatchers are functions that can take two arguments: name and detail.
Component events created with createEventDispatcher create a CustomEvent. These events do not
bubble. The detail argument corresponds to the CustomEvent.detail property and can contain any type of data.
Events dispatched from child components can be listened to
in their parent. Any data provided when the event was dispatched is available on the detail property of the event object.
Events can be cancelable by passing a third parameter to the dispatch function. The function returns false if the event is cancelled with event.preventDefault(), otherwise it returns true.
<script>import{ createEventDispatcher }from'svelte';const dispatch =createEventDispatcher();functionnotify(){const shouldContinue =dispatch('notify','detail value',{ cancelable:true});if(shouldContinue){// no one called preventDefault}else{// a listener called preventDefault}}script>
svelte/store
The svelte/store module exports functions for creating
readable, writable and derived stores.
Keep in mind that you don't have to use these functions to enjoy the
reactive $store syntax in your components. Any object that correctly implements .subscribe, unsubscribe, and (optionally) .set is a valid store, and will work both with the special syntax, and with Svelte's built-in derived stores.
This makes it possible to wrap almost any other reactive state handling library for use in Svelte. Read more about the store contract to see what a correct implementation looks like.
writable
store =writable(value?: any)
store =writable(value?: any, start?:(set:(value: any)=>void)=>()=>void)
Function that creates a store which has
values that can be set from 'outside' components. It gets created as an object with additional set and update methods.
set is a method that takes one argument which is the value to be set. The store value gets set to the value of the argument if the store value is not already equal to it.
update is a method that takes one argument which is a callback. The callback takes the existing store value as its argument and returns the new value to be set to the store.
If a function is passed as the second argument, it will be called when the number of subscribers goes from zero to one (but not from one to two, etc). That function will be passed a set function which changes the value of the store. It must return a stop function that is called when the subscriber count goes from one to zero.
import{ writable }from'svelte/store';const count =writable(0,()=>{
console.log('got a subscriber');return()=> console.log('no more subscribers');});
count.set(1);// does nothingconst unsubscribe = count.subscribe(value=>{
console.log(value);});// logs 'got a subscriber', then '1'unsubscribe();// logs 'no more subscribers'
Note that the value of a writable is lost when it is destroyed, for example when the page is
refreshed. However, you can write your own logic to sync the value to for example the localStorage.
readable
store =readable(value?: any, start?:(set:(value: any)=>void)=>()=>void)
Creates a store whose value cannot be set from 'outside', the first argument is the store's initial value, and the second argument to readable is the same as the second argument to writable.
import{ readable }from'svelte/store';const time =readable(null,set=>{set(newDate());const interval =setInterval(()=>{set(newDate());},1000);return()=>clearInterval(interval);});
derived
store =derived(a,callback:(a: any)=> any)
store =derived(a,callback:(a: any,set:(value: any)=>void)=>void|()=>void, initial_value: any)
store =derived([a,...b],callback:([a: any,...b: any[]])=> any)
store =derived([a,...b],callback:([a: any,...b: any[]],set:(value: any)=>void)=>void|()=>void, initial_value: any)
Derives a store from one or more other stores. The callback runs initially when the first subscriber subscribes and then whenever the store dependencies change.
In the simplest version, derived takes a single store, and the callback returns a derived value.
Generally, you should read the value of a store by subscribing to it and using the value as it changes over time. Occasionally, you may need to retrieve the value of a store to which you're not subscribed. get allows you to do so.
This works by creating a subscription, reading the value, then unsubscribing. It's therefore not recommended in hot code paths.
import{ get }from'svelte/store';const value =get(store);
svelte/motion
The svelte/motion
module exports two functions, tweened and spring, for creating writable stores whose values change over time after set and update, rather than immediately.
tweened
store =tweened(value: any, options)
Tweened stores update their values over a fixed duration. The following options are available:
delay (number, default 0) — milliseconds before starting
easing (function, default t => t) — an easing function
interpolate (function) — see below
store.set and store.update can accept a second options argument that will override the options passed in upon instantiation.
Both functions return a Promise that resolves when the tween completes. If the tween is interrupted, the promise will never resolve.
Out of the
box, Svelte will interpolate between two numbers, two arrays or two objects (as long as the arrays and objects are the same 'shape', and their 'leaf' properties are also numbers).
<script>import{ tweened }from'svelte/motion';import{ cubicOut }from'svelte/easing';const size =tweened(1,{
duration:300,
easing: cubicOut
});functionhandleClick(){// this is equivalent to size.update(n => n + 1)
$size +=1;}script><buttonon:click={handleClick}style="transform:scale({$size});transform-origin:00">embiggenbutton>
If the initial value is undefined or null, the first value change will take effect immediately. This is useful when you have tweened values that are based on props, and don't want any motion when the component first renders.
The interpolate option
allows you to tween between any arbitrary values. It must be an (a, b) => t => value function, where a is the starting value, b is the target value, t is a number between 0 and 1, and value is the result. For example, we can use the d3-interpolate package to smoothly interpolate between two colours.
A spring store gradually changes to its target value based on its stiffness and damping parameters. Whereas tweened stores change their values over a fixed duration, spring stores change over a duration that is determined by their existing velocity, allowing for more natural-seeming motion in many situations. The following options are available:
stiffness (number, default 0.15) — a value between 0 and 1 where higher means a 'tighter' spring
damping
(number, default 0.8) — a value between 0 and 1 where lower means a 'springier' spring
precision (number, default 0.01) — determines the threshold at which the spring is considered to have 'settled', where lower means more precise
All of the options above can be changed while the spring is in motion, and will take immediate effect.
As with
tweened stores, set and update return a Promise that resolves if the spring settles.
Both set and update can take a second argument — an object with hard or soft properties. { hard: true } sets the target value immediately; { soft: n } preserves existing momentum for n seconds before settling. { soft: true } is equivalent to { soft: 0.5 }.
const coords =spring({ x:50, y:50});// updates the value immediately
coords.set({ x:100, y:200},{ hard:true});// preserves existing momentum for 1s
coords.update((target_coords, coords)=>{return{ x: target_coords.x, y: coords.y };},{ soft:1});
See a full example on the spring tutorial.
<script>import{ spring }from'svelte/motion';const coords =spring({ x:50, y:50},{
stiffness:0.1,
damping:0.25});script>
If the initial value is undefined or null, the first value change will take effect immediately, just as with tweened values (see above).
const size =spring();
$: $size = big ?100:10;
svelte/transition
The svelte/transition module exports seven functions: fade, blur, fly, slide, scale, draw and
crossfade. They are for use with Svelte transitions.
fade
Animates the opacity of an element from 0 to the current opacity for in transitions and from the current opacity to 0 for out transitions.
fade accepts the following parameters:
delay (number, default 0) —
milliseconds before starting
duration (number, default 400) — milliseconds the transition lasts
easing (function, default linear) — an easing function
You can see the fade transition in action in the transition tutorial.
<script>import{ fade }from'svelte/transition';script>{#if condition}<divtransition:fade="{{delay:250, duration:300}}">
fades in and out
div>{/if}
blur
Animates a blur filter alongside an element's opacity.
blur accepts the following parameters:
delay (number, default 0) — milliseconds before starting
duration (number, default 400) — milliseconds the transition lasts
easing (function, default cubicInOut) — an easing function
opacity
(number, default 0) - the opacity value to animate out to and in from
amount (number, default 5) - the size of the blur in pixels
<script>import{ blur }from'svelte/transition';script>{#if condition}<divtransition:blur="{{amount:10}}">
fades in and out
div>{/if}
fly
Animates the x and y positions and the opacity of an element. in transitions animate from an element's current (default) values to the provided values, passed as parameters. out transitions animate from the provided values to an element's
default values.
fly accepts the following parameters:
delay (number, default 0) — milliseconds before starting
duration (number, default 400) — milliseconds the transition lasts
easing (function, default cubicOut) — an easing function
x (number, default 0) - the x offset to animate out to and in from
y (number,
default 0) - the y offset to animate out to and in from
opacity (number, default 0) - the opacity value to animate out to and in from
You can see the fly transition in action in the transition tutorial.
<script>import{ fly }from'svelte/transition';import{ quintOut }from'svelte/easing';script>{#if condition}<divtransition:fly="{{delay:250, duration:300, x:100, y:500, opacity:0.5, easing: quintOut}}">
flies in and out
div>{/if}
slide
transition:slide={params}
Slides an element in and out.
slide accepts the following parameters:
delay (number, default 0) — milliseconds before starting
duration (number, default 400) — milliseconds the transition lasts
easing (function, default cubicOut) — an easing function
<script>import{ slide }from'svelte/transition';import{ quintOut }from'svelte/easing';script>{#if condition}<divtransition:slide="{{delay:250, duration:300, easing: quintOut }}">
slides in and out
div>{/if}
scale
transition:scale={params}
Animates
the opacity and scale of an element. in transitions animate from an element's current (default) values to the provided values, passed as parameters. out transitions animate from the provided values to an element's default values.
scale accepts the following parameters:
delay (number, default 0) — milliseconds before starting
duration (number, default 400) — milliseconds the transition lasts
easing (function, default cubicOut) — an
easing function
start (number, default 0) - the scale value to animate out to and in from
opacity (number, default 0) - the opacity value to animate out to and in from
<script>import{ scale }from'svelte/transition';import{ quintOut }from'svelte/easing';script>{#if condition}<divtransition:scale="{{duration:500, delay:500, opacity:0.5, start:0.5, easing: quintOut}}">
scales in and out
div>{/if}
draw
Animates the stroke of an SVG element, like a snake in a tube. in transitions begin with the
path invisible and draw the path to the screen over time. out transitions start in a visible state and gradually erase the path. draw only works with elements that have a getTotalLength method, like and .
draw accepts the following parameters:
delay (number, default 0) — milliseconds before starting
speed (number, default undefined) - the speed of the animation, see below.
easing (function, default cubicInOut) — an easing function
The speed parameter is a means of setting the duration of the transition relative to the path's length. It is a modifier that is applied to the length of the path: duration = length / speed. A path that is 1000 pixels with a speed of 1 will have a duration of 1000ms, setting the speed to
0.5 will double that duration and setting it to 2 will halve it.
The crossfade function creates a pair of transitions called send and receive. When an element is 'sent', it looks for a corresponding element being 'received', and generates a transition
that transforms the element to its counterpart's position and fades it out. When an element is 'received', the reverse happens. If there is no counterpart, the fallback transition is used.
crossfade accepts the following parameters:
delay (number, default 0) — milliseconds before starting
easing (function, default cubicOut) — an
easing function
fallback (function) — A fallback transition to use for send when there is no matching element being received, and for receive when there is no element being sent.
The svelte/animate module exports one function for use with Svelte animations.
flip
The flip function calculates the start and end position of an element and animates between them, translating the x and y values. flip stands for
First, Last, Invert, Play.
flip accepts the following parameters:
delay (number, default 0) — milliseconds before starting
duration (number | function, default d => Math.sqrt(d) * 120) — see below
easing (function, default cubicOut) — an easing function
duration can be provided as either:
a number, in milliseconds.
a function, distance: number => duration: number, receiving the distance the element will travel in pixels and returning the duration in milliseconds. This allows you to assign a duration that is relative to the distance travelled by each element.
Easing functions specify the rate of change over time and are useful when working with Svelte's built-in
transitions and animations as well as the tweened and spring utilities. svelte/easing contains 31 named exports, a linear ease and 3 variants of 10 different easing functions: in, out and inOut.
You can explore the various eases using the ease visualiser in the examples section.
ease
in
out
inOut
back
backIn
backOut
backInOut
bounce
bounceIn
bounceOut
bounceInOut
circ
circIn
circOut
circInOut
cubic
cubicIn
cubicOut
cubicInOut
elastic
elasticIn
elasticOut
elasticInOut
expo
expoIn
expoOut
expoInOut
quad
quadIn
quadOut
quadInOut
quart
quartIn
quartOut
quartInOut
quint
quintIn
quintOut
quintInOut
sine
sineIn
sineOut
sineInOut
svelte/register
To render Svelte components in Node.js without bundling, use require('svelte/register'). After that, you can use require to include any .svelte file.
require('svelte/register');const App =require('./App.svelte').default;...const{ html, css, head }= App.render({ answer:42});
The .default is necessary because we're converting from native JavaScript modules to the CommonJS modules recognised by Node. Note that if your component imports JavaScript modules, they will fail to load in Node and you will need to use a bundler
instead.
To set compile options, or to use a custom file extension, call the register hook as a function:
require('svelte/register')({
extensions:['.customextension'],// defaults to ['.html', '.svelte']
preserveComments:true});
Client-side component API
Creating a component
const component =newComponent(options)
A client-side component — that is, a component compiled with generate: 'dom' (or the generate option left unspecified) is a JavaScript class.
The
following initialisation options can be provided:
option
default
description
target
none
An HTMLElement or ShadowRoot to render to. This option is required
anchor
null
A child of target to render the component immediately before
props
{}
An object of properties to supply to the component
context
new Map()
A Map of root-level context key-value pairs to supply to the component
hydrate
false
See below
intro
false
If true, will play transitions on initial render, rather than waiting for subsequent state changes
Existing children of target are left where they are.
The hydrate option instructs Svelte to upgrade existing DOM (usually from server-side rendering) rather than creating new elements. It will only work if the component was compiled with the hydratable: true option. Hydration of elements only works properly if the server-side rendering code
was also compiled with hydratable: true, which adds a marker to each element in the so that the component knows which elements it's responsible for removing during hydration.
Whereas children of target are normally left alone, hydrate: true will cause any children to be removed. For that reason, the anchor option cannot be used alongside hydrate: true.
The existing DOM doesn't need to match the component — Svelte will 'repair' the DOM as it goes.
Programmatically sets props on an instance. component.$set({ x: 1 }) is equivalent to x = 1 inside the component's block.
Calling this method schedules an update for the next microtask — the DOM is not updated synchronously.
component.$set({ answer:42});
$on
component.$on(event, callback)
Causes the callback function to be called whenever the component
dispatches an event.
A function is returned that will remove the event listener when called.
const off = app.$on('selected',event=>{
console.log(event.detail.selection);});off();
$destroy
Removes a component from the DOM and triggers any onDestroy handlers.
Component props
If a component is compiled with accessors: true, each instance will have getters and setters corresponding to each of the component's
props. Setting a value will cause a synchronous update, rather than the default async update caused by component.$set(...).
By default, accessors is false, unless you're compiling as a custom element.
console.log(app.count);
app.count +=1;
Custom element API
Svelte components can also be compiled to custom elements (aka web components) using the customElement: true compiler option. You should specify a tag name for the component using the
element.
<svelte:optionstag="my-element"/><script>exportlet name ='world';script><h2>Hello {name}!h2><slot>slot>
Alternatively, use tag={null} to indicate that the consumer of the custom element should name it.
Once a custom element has been defined, it can be used as a regular DOM element:
document.body.innerHTML =`
This is some slotted content
`;
By default, custom elements are compiled with accessors: true, which means that any
props are exposed as properties of the DOM element (as well as being readable/writable as attributes, where possible).
To prevent this, add accessors={false} to .
const el = document.querySelector('my-element');// get the current value of the 'name' prop
console.log(el.name);// set a new value, updating the shadow DOM
el.name ='everybody';
Custom elements can be a useful way to package components for consumption in a non-Svelte app, as they will work with vanilla HTML and JavaScript as well as
most frameworks. There are, however, some important differences to be aware of:
Styles are encapsulated, rather than merely scoped. This means that any non-component styles (such as you might have in a global.css file) will not apply to the custom element, including styles with the :global(...) modifier
Instead of being extracted out as a separate .css file, styles are
inlined into the component as a JavaScript string
Custom elements are not generally suitable for server-side rendering, as the shadow DOM is invisible until JavaScript loads
In Svelte, slotted content renders lazily. In the DOM, it renders eagerly. In other words, it will always be created even if the component's element is inside an {#if ...} block. Similarly, including a in an {#each ...} block will not cause the slotted content to be rendered
multiple times
The let: directive has no effect
Polyfills are required to support older browsers
Server-side component API
const result = Component.render(...)
Unlike client-side components, server-side components don't have a lifespan after you render them — their whole job is to create some HTML and CSS. For that reason, the API is somewhat different.
A server-side component exposes a render method that can be
called with optional props. It returns an object with head, html, and css properties, where head contains the contents of any elements encountered.
You can import a Svelte component directly into Node using svelte/register.
Typically, you won't interact with the Svelte compiler directly, but will instead integrate it into your build system using a bundler plugin.
The bundler plugin that the Svelte team most recommends and invests in is vite-plugin-svelte. The SvelteKit framework provides a setup leveraging vite-plugin-svelte to build applications as well as a tool for packaging Svelte component
libraries. Svelte Society maintains a list of other bundler plugins for additional tools like Rollup and Webpack.
Nonetheless, it's useful to understand how to use the compiler, since bundler plugins generally expose compiler options to you.
This is where the magic happens. svelte.compile takes your component source
code, and turns it into a JavaScript module that exports a class.
const svelte =require('svelte/compiler');const result = svelte.compile(source,{// options});
The following options can be passed to the compiler. None are required:
option
default
description
filename
null
string used for debugging hints and sourcemaps. Your bundler plugin will set it automatically.
name
"Component"
string that sets the name of the resulting JavaScript class (though the compiler will rename it if it would otherwise conflict with other variables in scope). It will normally be inferred from filename.
format
"esm"
If "esm", creates a JavaScript module (with import and export). If "cjs", creates a CommonJS module (with require and module.exports), which is useful in some server-side rendering situations or for testing.
generate
"dom"
If "dom", Svelte emits a JavaScript class for mounting to the DOM. If "ssr", Svelte emits an object with a render method suitable for server-side rendering. If false, no JavaScript or CSS is returned; just metadata.
errorMode
"throw"
If "throw", Svelte throws when a compilation error occurred. If "warn", Svelte will treat errors as warnings and add them to the warning report.
varsReport
"strict"
If "strict", Svelte returns a variables report with only variables that are not globals nor internals. If "full", Svelte returns a variables report with all detected variables. If false, no variables report is returned.
dev
false
If true, causes extra code to be added to components that will perform runtime checks and provide debugging information during development.
immutable
false
If true, tells the compiler that you promise not to mutate any objects. This allows it to be less conservative about checking whether values have changed.
hydratable
false
If true when generating DOM code, enables the hydrate: true runtime option, which allows a component to upgrade existing DOM rather than creating new DOM from scratch. When generating SSR code, this adds markers to elements so that hydration knows which to replace.
legacy
false
If true, generates code that will work in IE9 and IE10, which don't support things like element.dataset.
accessors
false
If true, getters and setters will be created for the component's props. If false, they will only be created for readonly exported values (i.e. those declared with const, class and function). If compiling with customElement: true this option defaults to true.
customElement
false
If true, tells the compiler to generate a custom element constructor instead of a regular Svelte component.
tag
null
A string that tells Svelte what tag name to register the custom element with. It must be a lowercase alphanumeric string with at least one hyphen, e.g. "my-element".
css
true
If true, styles will be included in the JavaScript class and injected at runtime for the components actually rendered. If false, the CSS will be returned in the css field of the compilation result. Most Svelte bundler plugins will set this to false and use the CSS that is statically generated for better performance, as it will result in smaller JavaScript bundles and the output can be served as cacheable .css files.
cssHash
See right
A function that takes a { hash, css, name, filename } argument and returns the string that is used as a classname for scoped CSS. It defaults to returning svelte-${hash(css)}
loopGuardTimeout
0
A number that tells Svelte to break the loop if it blocks the thread for more than loopGuardTimeout ms. This is useful to prevent infinite loops. Only available when dev: true
preserveComments
false
If true, your HTML comments will be preserved during server-side rendering. By default, they are stripped out.
preserveWhitespace
false
If true, whitespace inside and between elements is kept as you typed it, rather than removed or collapsed to a single space where possible.
sourcemap
object | string
An initial sourcemap that will be merged into the final output sourcemap. This is usually the preprocessor sourcemap.
enableSourcemap
boolean | { js: boolean; css: boolean; }
If true, Svelte generate sourcemaps for components. Use an object with js or css for more granular control of sourcemap generation. By default, this is true.
outputFilename
null
A string used for your JavaScript sourcemap.
cssOutputFilename
null
A string used for your CSS sourcemap.
sveltePath
"svelte"
The location of the svelte package. Any imports from svelte or svelte/[module] will be modified accordingly.
namespace
"html"
The namespace of the element; e.g., "mathml", "svg", "foreign".
The returned result object contains the code for your component, along with useful bits of metadata.
The parse function parses a component, returning only its abstract syntax tree. Unlike compiling with the generate: false option, this will not perform any validation or other analysis of the component beyond parsing it. Note that the returned AST is not considered
public API, so breaking changes could occur at any point in time.
The
preprocess function provides convenient hooks for arbitrarily transforming component source code. For example, it can be used to convert a block into vanilla CSS.
The first argument is the component source code. The second is an array of preprocessors (or a single preprocessor, if you only have one), where a preprocessor is an object with markup, script and style functions, each of which is optional.
Each markup, script or style function must return an
object (or a Promise that resolves to an object) with a code property, representing the transformed source code, and an optional array of dependencies.
The markup function receives the entire component source text, along with the component's filename if it was specified in the third argument.
Preprocessor functions should additionally return a map object alongside code and dependencies, where map is a sourcemap representing the transformation.
The script and style functions receive the contents of and elements respectively (content) as well as the entire component source text (markup). In addition to filename, they get an object of the element's attributes.
If a dependencies array is returned, it will be included in the result object. This is used by packages like
rollup-plugin-svelte to watch additional files for changes, in the case where your tag has an @import (for example).
Multiple preprocessors can be used together. The output of the first becomes the input to the second. markup functions run first, then script and style.
The walk function provides a way to walk the abstract syntax trees generated by the parser, using the compiler's own built-in instance of estree-walker.
The walker takes an abstract syntax tree to walk and an object with two optional methods: enter and leave. For each node, enter is called (if present). Then, unless this.skip() is called during
enter, each of the children are traversed, and then leave is called on the node.
const svelte =require('svelte/compiler');
console.log(`running svelte version ${svelte.VERSION}`);
Accessibility warnings
Accessibility (shortened to a11y) isn't always easy to get right, but Svelte will help by warning you at compile time if you write inaccessible markup. However, keep in mind that many accessibility issues can only be identified at runtime using other automated tools
and by manually testing your application.
Here is a list of accessibility checks Svelte will do for you.
a11y-accesskey
Enforce no accesskey on element. Access keys are HTML attributes that allow web developers to assign keyboard shortcuts to elements. Inconsistencies between keyboard shortcuts and keyboard commands used by screen reader and keyboard-only users create accessibility complications. To avoid complications, access
keys should not be used.
<divaccessKey='z'>div>
a11y-aria-attributes
Certain reserved DOM elements do not support ARIA roles, states and properties. This is often because they are not visible, for example meta, html, script, style. This rule enforces that these DOM elements do not contain the aria-* props.
<metaaria-hidden="false">
a11y-autofocus
Enforce
that autofocus is not used on elements. Autofocusing elements can cause usability issues for sighted and non-sighted users alike.
<inputautofocus>
a11y-click-events-have-key-events
Enforce on:click is accompanied by at least one of the following: onKeyUp, onKeyDown, onKeyPress. Coding for the keyboard is important for users with physical disabilities who cannot use a mouse, AT compatibility, and screenreader users.
This
does not apply for interactive or hidden elements.
<divon:click={()=>{}}/>
a11y-distracting-elements
Enforces that no distracting elements are used. Elements that can be visually distracting can cause accessibility issues with visually impaired users. Such elements are most likely deprecated, and should be avoided.
The following elements are visually distracting: and .
<marquee/>
a11y-hidden
Certain DOM elements are useful for screen reader navigation and should not be hidden.
<h2aria-hidden="true">invisible headerh2>
a11y-img-redundant-alt
Enforce img alt attribute does not contain the word image, picture, or photo. Screen readers already announce img elements as an image. There is no need to use words such as image, photo, and/or
picture.
<imgsrc="foo"alt="Foo eating a sandwich."/><imgsrc="bar"aria-hidden="true"alt="Picture of me taking a photo of an image"/><imgsrc="foo"alt="Photo of foo being weird."/><imgsrc="bar"alt="Image of me at a bar!"/><imgsrc="foo"alt="Picture of baz fixing a bug."/>
a11y-incorrect-aria-attribute-type
Enforce that only the correct type of value is used for aria attributes. For example, aria-hidden should only receive a boolean.
<divaria-hidden="yes"/>
a11y-invalid-attribute
Enforce that attributes important for accessibility have a valid value. For example, href should not be empty,
'#', or javascript:.
<ahref=''>invalida>
a11y-label-has-associated-control
Enforce that a label tag has a text label and an associated control.
There are two supported ways to associate a label with a control:
Wrapping a control in a label tag.
Adding for to a label and assigning it the ID of an input on the page.
Providing captions for media is essential for deaf users to follow along. Captions should be a transcription or translation of the dialogue, sound effects, relevant musical cues, and other relevant audio information. Not only is this important for accessibility, but can also be useful for all users in the case that the media is unavailable (similar to alt text on an image when an image is unable to load).
The captions
should contain all important and relevant information to understand the corresponding media. This may mean that the captions are not a 1:1 mapping of the dialogue in the media content. However, captions are not necessary for video components with the muted attribute.
Certain reserved DOM elements do not support ARIA roles, states and properties. This is often because they are not
visible, for example meta, html, script, style. This rule enforces that these DOM elements do not contain the role props.
<metarole="tooltip">
a11y-misplaced-scope
The scope attribute should only be used on
elements.
<divscope="row"/>
a11y-missing-attribute
Enforce that attributes required for accessibility are present on an
element. This includes the following checks:
should have an href (unless it's a fragment-defining tag)
should have alt, aria-label, or aria-labelledby
should have lang
should have title
should have alt
should have title, aria-label, or aria-labelledby
should have alt,
aria-label, or aria-labelledby
<inputtype="image"><html>html><a>texta>
a11y-missing-content
Enforce that heading elements (h2, h2, etc.) and anchors have content and that the content is accessible to screen readers
<ahref='/foo'>a><h2>h2>
a11y-mouse-events-have-key-events
Enforce that on:mouseover and on:mouseout are accompanied by on:focus and on:blur, respectively.
This helps to ensure that any functionality triggered by these mouse events is also accessible to keyboard users.
WAI-ARIA roles should not be used to convert an interactive element to a non-interactive element. Non-interactive ARIA roles include article, banner, complementary, img, listitem, main, region and tooltip.
<textarearole="listitem"/>
a11y-no-noninteractive-tabindex
Tab key navigation should be limited to elements on the page that can be interacted with.
<divtabindex='0'/>
a11y-positive-tabindex
Avoid positive tabindex property values. This will move elements out of the expected tab order, creating a confusing experience for keyboard users.
<divtabindex='1'/>
a11y-role-has-required-aria-props
Elements with ARIA roles must have all required attributes for that role.