You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte/documentation/docs/98-reference/30-compiler-warnings.md

379 lines
12 KiB

---
title: 'Compiler warnings'
generated: 'generated by process-messages/index.js'
---
Svelte warns you at compile time if it catches potential mistakes, such as writing inaccessible markup.
Some warnings may be incorrect in your concrete use case. You can disable such false positives by placing a `<!-- svelte-ignore <code> -->` comment above the line that causes the warning. Example:
```svelte
<!-- svelte-ignore a11y_autofocus -->
<input autofocus />
```
You can list multiple rules in a single comment, and add an explanatory note alongside them:
```svelte
<!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions (because of reasons) -->
<div on:click>...</div>
```
## `a11y_accesskey`
> [!NOTE] Avoid using accesskey
## `a11y_aria_activedescendant_has_tabindex`
> [!NOTE] An element with an aria-activedescendant attribute should have a tabindex value
## `a11y_aria_attributes`
> [!NOTE] '\<%name%>' should not have aria-* attributes
## `a11y_autocomplete_valid`
> [!NOTE] '%value%' is an invalid value for 'autocomplete' on '\<input type="%type%">'
## `a11y_autofocus`
> [!NOTE] Avoid using autofocus
## `a11y_click_events_have_key_events`
> [!NOTE] Visible, non-interactive elements with a click event must be accompanied by a keyboard event handler. Consider whether an interactive element such as '\<button type="button">' or '\<a>' might be more appropriate. See https://svelte.dev/docs/accessibility-warnings#a11y-click-events-have-key-events for more details
## `a11y_consider_explicit_label`
> [!NOTE] Buttons and links should either contain text or have an 'aria-label' or 'aria-labelledby' attribute
## `a11y_distracting_elements`
> [!NOTE] Avoid '\<%name%>' elements
## `a11y_figcaption_index`
> [!NOTE] '\<figcaption>' must be first or last child of '\<figure>'
## `a11y_figcaption_parent`
> [!NOTE] '\<figcaption>' must be an immediate child of '\<figure>'
## `a11y_hidden`
> [!NOTE] '\<%name%>' element should not be hidden
## `a11y_img_redundant_alt`
> [!NOTE] Screenreaders already announce '\<img>' elements as an image
## `a11y_incorrect_aria_attribute_type`
> [!NOTE] The value of '%attribute%' must be a %type%
## `a11y_incorrect_aria_attribute_type_boolean`
> [!NOTE] The value of '%attribute%' must be either 'true' or 'false'. It cannot be empty
## `a11y_incorrect_aria_attribute_type_id`
> [!NOTE] The value of '%attribute%' must be a string that represents a DOM element ID
## `a11y_incorrect_aria_attribute_type_idlist`
> [!NOTE] The value of '%attribute%' must be a space-separated list of strings that represent DOM element IDs
## `a11y_incorrect_aria_attribute_type_integer`
> [!NOTE] The value of '%attribute%' must be an integer
## `a11y_incorrect_aria_attribute_type_token`
> [!NOTE] The value of '%attribute%' must be exactly one of %values%
## `a11y_incorrect_aria_attribute_type_tokenlist`
> [!NOTE] The value of '%attribute%' must be a space-separated list of one or more of %values%
## `a11y_incorrect_aria_attribute_type_tristate`
> [!NOTE] The value of '%attribute%' must be exactly one of true, false, or mixed
## `a11y_interactive_supports_focus`
> [!NOTE] Elements with the '%role%' interactive role must have a tabindex value
## `a11y_invalid_attribute`
> [!NOTE] '%href_value%' is not a valid %href_attribute% attribute
## `a11y_label_has_associated_control`
> [!NOTE] A form label must be associated with a control
## `a11y_media_has_caption`
> [!NOTE] '\<video>' elements must have a '\<track kind="captions">'
## `a11y_misplaced_role`
> [!NOTE] '\<%name%>' should not have role attribute
## `a11y_misplaced_scope`
> [!NOTE] The scope attribute should only be used with '\<th>' elements
## `a11y_missing_attribute`
> [!NOTE] '\<%name%>' element should have %article% %sequence% attribute
## `a11y_missing_content`
> [!NOTE] '\<%name%>' element should contain text
## `a11y_mouse_events_have_key_events`
> [!NOTE] '%event%' event must be accompanied by '%accompanied_by%' event
## `a11y_no_abstract_role`
> [!NOTE] Abstract role '%role%' is forbidden
## `a11y_no_interactive_element_to_noninteractive_role`
> [!NOTE] '\<%element%>' cannot have role '%role%'
## `a11y_no_noninteractive_element_interactions`
> [!NOTE] Non-interactive element '\<%element%>' should not be assigned mouse or keyboard event listeners
## `a11y_no_noninteractive_element_to_interactive_role`
> [!NOTE] Non-interactive element '\<%element%>' cannot have interactive role '%role%'
## `a11y_no_noninteractive_tabindex`
> [!NOTE] noninteractive element cannot have nonnegative tabIndex value
## `a11y_no_redundant_roles`
> [!NOTE] Redundant role '%role%'
## `a11y_no_static_element_interactions`
> [!NOTE] '\<%element%>' with a %handler% handler must have an ARIA role
## `a11y_positive_tabindex`
> [!NOTE] Avoid tabindex values above zero
## `a11y_role_has_required_aria_props`
> [!NOTE] Elements with the ARIA role "%role%" must have the following attributes defined: %props%
## `a11y_role_supports_aria_props`
> [!NOTE] The attribute '%attribute%' is not supported by the role '%role%'
## `a11y_role_supports_aria_props_implicit`
> [!NOTE] The attribute '%attribute%' is not supported by the role '%role%'. This role is implicit on the element '\<%name%>'
## `a11y_unknown_aria_attribute`
> [!NOTE] Unknown aria attribute 'aria-%attribute%'
> [!NOTE] Unknown aria attribute 'aria-%attribute%'. Did you mean '%suggestion%'?
## `a11y_unknown_role`
> [!NOTE] Unknown role '%role%'
> [!NOTE] Unknown role '%role%'. Did you mean '%suggestion%'?
## `attribute_avoid_is`
> [!NOTE] The "is" attribute is not supported cross-browser and should be avoided
## `attribute_global_event_reference`
> [!NOTE] You are referencing 'globalThis.%name%'. Did you forget to declare a variable with that name?
## `attribute_illegal_colon`
> [!NOTE] Attributes should not contain ':' characters to prevent ambiguity with Svelte directives
## `attribute_invalid_property_name`
> [!NOTE] '%wrong%' is not a valid HTML attribute. Did you mean '%right%'?
## `attribute_quoted`
> [!NOTE] Quoted attributes on components and custom elements will be stringified in a future version of Svelte. If this isn't what you want, remove the quotes
## `bind_invalid_each_rest`
> [!NOTE] The rest operator (...) will create a new object and binding '%name%' with the original object will not work
## `block_empty`
> [!NOTE] Empty block
## `component_name_lowercase`
> [!NOTE] '\<%name%>' will be treated as an HTML element unless it begins with a capital letter
## `css_unused_selector`
> [!NOTE] Unused CSS selector "%name%"
## `element_invalid_self_closing_tag`
> [!NOTE] Self-closing HTML tags for non-void elements are ambiguous — use '\<%name% ...>\</%name%>' rather than '\<%name% ... />'
## `event_directive_deprecated`
> [!NOTE] Using 'on:%name%' to listen to the %name% event is deprecated. Use the event attribute 'on%name%' instead
## `export_let_unused`
> [!NOTE] Component has unused export property '%name%'. If it is for external reference only, please consider using 'export const %name%'
## `legacy_code`
> [!NOTE] '%code%' is no longer valid — please use '%suggestion%' instead
## `legacy_component_creation`
> [!NOTE] Svelte 5 components are no longer classes. Instantiate them using 'mount' or 'hydrate' (imported from 'svelte') instead.
## `node_invalid_placement_ssr`
> [!NOTE] %thing% is invalid inside '\<%parent%>'. When rendering this component on the server, the resulting HTML will be modified by the browser, likely resulting in a 'hydration_mismatch' warning
HTML restricts where certain elements can appear. In case of a violation the browser will 'repair' the HTML in a way that breaks Svelte's assumptions about the structure of your components. Some examples:
- `<p>hello <div>world</div></p>` will result in `<p>hello </p><div>world</div><p></p>` for example (the `<div>` autoclosed the `<p>` because `<p>` cannot contain block-level elements)
- `<option><div>option a</div></option>` will result in `<option>option a</option>` (the `<div>` is removed)
- `<table><tr><td>cell</td></tr></table>` will result in `<table><tbody><tr><td>cell</td></tr></tbody></table>` (a `<tbody>` is auto-inserted)
This code will work when the component is rendered on the client (which is why this is a warning rather than an error), but if you use server rendering it will cause hydration to fail.
## `non_reactive_update`
> [!NOTE] '%name%' is updated, but is not declared with '$state(...)'. Changing its value will not correctly trigger updates
## `options_deprecated_accessors`
> [!NOTE] The 'accessors' option has been deprecated. It will have no effect in runes mode
## `options_deprecated_immutable`
> [!NOTE] The 'immutable' option has been deprecated. It will have no effect in runes mode
## `options_missing_custom_element`
> [!NOTE] The 'customElement' option is used when generating a custom element. Did you forget the 'customElement: true' compile option?
## `options_removed_enable_sourcemap`
> [!NOTE] The 'enableSourcemap' option has been removed. Source maps are always generated now, and tooling can choose to ignore them
## `options_removed_hydratable`
> [!NOTE] The 'hydratable' option has been removed. Svelte components are always hydratable now
## `options_removed_loop_guard_timeout`
> [!NOTE] The 'loopGuardTimeout' option has been removed
## `options_renamed_ssr_dom`
> [!NOTE] 'generate: "dom"' and 'generate: "ssr"' options have been renamed to "client" and "server" respectively
## `perf_avoid_inline_class`
> [!NOTE] Avoid 'new class' — instead, declare the class at the top level scope
## `perf_avoid_nested_class`
> [!NOTE] Avoid declaring classes below the top level scope
## `reactive_declaration_invalid_placement`
> [!NOTE] Reactive declarations only exist at the top level of the instance script
## `reactive_declaration_module_script_dependency`
> [!NOTE] Reassignments of module-level declarations will not cause reactive statements to update
## `reactive_declaration_non_reactive_property`
> [!NOTE] Properties of objects and arrays are not reactive unless in runes mode. Changes to this property will not cause the reactive statement to update
## `script_context_deprecated`
> [!NOTE] 'context="module"' is deprecated, use the 'module' attribute instead
## `script_unknown_attribute`
> [!NOTE] Unrecognized attribute — should be one of 'generics', 'lang' or 'module'. If this exists for a preprocessor, ensure that the preprocessor removes it
## `slot_element_deprecated`
> [!NOTE] Using '\<slot>' to render parent content is deprecated. Use '{@render ...}' tags instead
## `state_referenced_locally`
> [!NOTE] State referenced in its own scope will never update. Did you mean to reference it inside a closure?
## `store_rune_conflict`
> [!NOTE] It looks like you're using the '$%name%' rune, but there is a local binding called '%name%'. Referencing a local variable with a '$' prefix will create a store subscription. Please rename '%name%' to avoid the ambiguity
## `svelte_component_deprecated`
> [!NOTE] '\<svelte:component>' is deprecated in runes mode — components are dynamic by default
In previous versions of Svelte, the component constructor was fixed when the component was rendered. In other words, if you wanted `<X>` to re-render when `X` changed, you would either have to use `<svelte:component this={X}>` or put the component inside a `{#key X}...{/key}` block.
In Svelte 5 this is no longer true — if `X` changes, `<X>` re-renders.
In some cases `<object.property>` syntax can be used as a replacement; a lowercased variable with property access is recognized as a component in Svelte 5.
For complex component resolution logic, an intermediary, capitalized variable may be necessary. E.g. in places where `@const` can be used:
```diff
{#each items as item}
- <svelte:component this={item.condition ? Y : Z} />
+ {@const Component = item.condition ? Y : Z}
+ <Component />
{/each}
```
A derived value may be used in other contexts:
```diff
<script>
...
let condition = $state(false);
+ const Component = $derived(condition ? Y : Z);
</script>
- <svelte:component this={condition ? Y : Z} />
+ <Component />
```
## `svelte_element_invalid_this`
> [!NOTE] 'this' should be an '{expression}'. Using a string attribute value will cause an error in future versions of Svelte
## `svelte_self_deprecated`
> [!NOTE] '\<svelte:self>' is deprecated — use self-imports (e.g. 'import %name% from './%basename%'') instead
## `unknown_code`
> [!NOTE] '%code%' is not a recognised code
> [!NOTE] '%code%' is not a recognised code (did you mean '%suggestion%'?)