hypnagaga/bin/llms/svelte-kit/llms-small.txt
Ben Aultowski 04877468cf initial
2026-02-27 11:58:02 -05:00

893 lines
No EOL
30 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Project types
SvelteKit supports all rendering modes: SPA, SSR, SSG, and you can mix them within one project.
## Setup
Scaffold a new SvelteKit project using `npx sv create` then follow the instructions. Do NOT use `npm create svelte` anymore, this command is deprecated.
A SvelteKit project needs a `package.json` with the following contents at minimum:
```json
{
"devDependencies": {
"@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/kit": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"svelte": "^5.0.0",
"vite": "^6.0.0"
}
}
```
Do NOT put any of the `devDependencies` listed above into `dependencies`, keep them all in `devDependencies`.
It also needs a `vite.config.js` with the following at minimum:
```js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';
export default defineConfig({
plugins: [sveltekit()]
});
```
It also needs a `svelte.config.js` with the following at minimum:
```js
import adapter from '@sveltejs/adapter-auto';
export default {
kit: {
adapter: adapter()
}
};
```
## Project structure
- **`src/` directory:**
- `lib/` for shared code (`$lib`), `lib/server/` for serveronly modules (`$lib/server`), `params/` for matchers, `routes/` for your pages/components, plus `app.html`, `error.html`, `hooks.client.js`, `hooks.server.js`, and `service-worker.js`.
- Do **NOT** import serveronly code into client files
- **Toplevel assets & configs:**
- `static/` for public assets; `tests/` (if using Playwright); config files: `package.json` (with `@sveltejs/kit`, `svelte`, `vite` as devDeps), `svelte.config.js`, `tsconfig.json` (or `jsconfig.json`, extending `.svelte-kit/tsconfig.json`), and `vite.config.js`.
- Do **NOT** forget `"type": "module"` in `package.json` if using ESM.
- **Build artifacts:**
- `.svelte-kit/` is autogenerated and safe to ignore or delete; it will be recreated on `dev`/`build`.
- Do **NOT** commit `.svelte-kit/` to version control.
## Routing
- **Filesystem router:** `src/routes` maps directories to URL paths: Everything with a `+page.svelte` file inside it becomes a visitable URL, e.g. `src/routes/hello/+page.svelte` becomes `/hello`. `[param]` folders define dynamic segments. Do NOT use other file system router conventions, e.g. `src/routes/hello.svelte` does NOT become available als URL `/hello`
- **Route files:** Prefix with `+`: all run serverside; only non`+server` run clientside; `+layout`/`+error` apply recursively.
- **Best practice:** Do **not** hardcode routes in code; instead rely on the filesystem convention.
### +page.svelte
- Defines UI for a route, SSR on first load and CSR thereafter
- Do **not** fetch data inside the component; instead use a `+page.js` or `+page.server.js` `load` function; access its return value through `data` prop via `let { data } = $props()` (typed with `PageProps`).
```svelte
<script lang="ts">
import type { PageProps } from './$types';
let { data }: PageProps = $props();
</script>
<h1>{data.title}</h1>
```
### +page.js
- Load data for pages via `export function load({ params })` (typed `PageLoad`), return value is put into `data` prop in component
- Can export `prerender`, `ssr`, and `csr` consts here to influence how page is rendered.
- Do **not** include private logic (DB or env vars), can **not** export `actions` from here; if needed, use `+page.server.js`.
```js
import type { PageLoad } from './$types';
export const load: PageLoad = () => {
return {
title: 'Hello world!',
};
}
```
### +page.server.js
- `export async function load(...)` (typed `PageServerLoad`) to access databases or private env; return serializable data.
- Can also export `actions` for `<form>` handling on the server.
### +error.svelte
- Add `+error.svelte` in a route folder to render an error page, can use `page.status` and `page.error.message` from `$app/state`.
- SvelteKit walks up routes to find the closest boundary; falls back to `src/error.html` if none.
### +layout.svelte
- Place persistent elements (nav, footer) and include `{@render children()}` to render page content. Example:
```svelte
<script>
import { LayoutProps } from './$types';
let { children, data } = $props();
</script>
<p>Some Content that is shared for all pages below this layout</p>
<!-- child layouts/page goes here -->
{@render children()}
```
- Create subdirectory `+layout.svelte` to scope UI to nested routes, inheriting parent layouts.
- Use layouts to avoid repeating common markup; do **not** duplicate UI in every `+page.svelte`.
### +layout.js / +layout.server.js
- In `+layout.js` or `+layout.server.js` export `load()` (typed `LayoutLoad`) to supply `data` to the layout and its children; set `prerender`, `ssr`, `csr`.
- Use `+layout.server.js` (typed `LayoutServerLoad`) for server-only things like DB or env access.
- Do **not** perform serveronly operations in `+layout.js`; use the server variant.
```js
import type { LayoutLoad } from './$types';
export const load: LayoutLoad = () => {
return {
sections: [
{ slug: 'profile', title: 'Profile' },
{ slug: 'notifications', title: 'Notifications' }
]
};
}
```
### +server.js (Endpoints)
- Export HTTP handlers (`GET`, `POST`, etc.) in `+server.js` under `src/routes`; receive `RequestEvent`, return `Response` or use `json()`, `error()`, `redirect()` (exported from `@sveltejs/kit`).
- export `fallback` to catch all other methods.
```js
import type { RequestHandler } from './$types';
export const GET: RequestHandler = ({ url }) => {
return new Response('hello world');
}
```
### $types
- SvelteKit creates `$types.d.ts` with `PageProps`, `LayoutProps`, `RequestHandler`, `PageLoad`, etc., for typesafe props and loaders.
- Use them inside `+page.svelte`/`+page.server.js`/`+page.js`/`+layout.svelte`/`+layout.server.js`/`+layout.js` by importing from `./$types`
### Other files
- Any non`+` files in route folders are ignored by the router, use this to your advantage to colocate utilities or components.
- For crossroute imports, place modules under `src/lib` and import via `$lib`.
## Loading data
### Page data
- `+page.js` exports a `load` (`PageLoad`) whose returned object is available in `+page.svelte` via `let { data } = $props()` (e.g. when you do `return { foo }` from `load` it is available within `let { data } = $props()` in `+page.svelte` as `data.foo`)
- Universal loads run on SSR and CSR; private or DBbacked loads belong in `+page.server.js` (`PageServerLoad`) and must return devalueserializable data.
Example:
```js
// file: src/routes/foo/+page.js
export async function load({ fetch }) {
const result = await fetch('/data/from/somewhere').then((r) => r.json());
return { result }; // return property "result"
}
```
```svelte
<!-- file: src/routes/foo/+page.svelte -->
<script>
// "data" prop contains property "result"
let { data } = $props();
</script>
{data.result}
```
### Layout data
- `+layout.js` or `+layout.server.js` exports a `load` (`LayoutLoad`/`LayoutServerLoad`)
- Layout data flows downward: child layouts and pages see parent data in their `data` prop.
- Data loading flow (interaction of load function and props) works the same as for `+page(.server).js/svelte`
### page.data
- The `page` object from `$app/state` gives access to all data from `load` functions via `page.data`, usable in any layout or page.
- Ideal for things like `<svelte:head><title>{page.data.title}</title></svelte:head>`.
- Types come from `App.PageData`
- earlier Svelte versions used `$app/stores` for the same concepts, do NOT use `$app/stores` anymore unless prompted to do so
### Universal vs. server loads
- Universal (`+*.js`) run on server first, then in browser; server (`+*.server.js`) always run serverside and can use secrets, cookies, DB, etc.
- Both receive `params`, `route`, `url`, `fetch`, `setHeaders`, `parent`, `depends`; server loads additionally get `cookies`, `locals`, `platform`, `request`.
- Use server loads for private data or nonserializable items; universal loads for public APIs or returning complex values (like constructors).
### Load function arguments
- `url` is a `URL` object (no `hash` serverside); `route.id` shows the route pattern; `params` map path segments to values.
- Query parameters via `url.searchParams` trigger reruns when they change.
- Use these to branch logic and fetch appropriate data in `load`.
## Making Fetch Requests
Use the provided `fetch` function for enhanced features:
```js
// src/routes/items/[id]/+page.js
export async function load({ fetch, params }) {
const res = await fetch(`/api/items/${params.id}`);
const item = await res.json();
return { item };
}
```
## Headers and Cookies
Set response headers using `setHeaders`:
```js
export async function load({ fetch, setHeaders }) {
const response = await fetch(url);
setHeaders({
age: response.headers.get('age'),
'cache-control': response.headers.get('cache-control')
});
return response.json();
}
```
Access cookies in server load functions using `cookies`:
```js
export async function load({ cookies }) {
const sessionid = cookies.get('sessionid');
return {
user: await db.getUser(sessionid)
};
}
```
Do not set `set-cookie` via `setHeaders`; use `cookies.set()` instead.
## Using Parent Data
Access data from parent load functions:
```js
export async function load({ parent }) {
const { a } = await parent();
return { b: a + 1 };
}
```
## Errors and Redirects
Redirect users using `redirect`:
```js
import { redirect } from '@sveltejs/kit';
export function load({ locals }) {
if (!locals.user) {
redirect(307, '/login');
}
}
```
Throw expected errors using `error`:
```js
import { error } from '@sveltejs/kit';
export function load({ locals }) {
if (!locals.user) {
error(401, 'not logged in');
}
}
```
Unexpected exceptions trigger `handleError` hook and a 500 response.
## Streaming with Promises
Server load functions can stream promises as they resolve:
```js
export async function load({ params }) {
return {
comments: loadComments(params.slug),
post: await loadPost(params.slug)
};
}
```
```svelte
<h1>{data.post.title}</h1>
<div>{@html data.post.content}</div>
{#await data.comments}
Loading comments...
{:then comments}
{#each comments as comment}
<p>{comment.content}</p>
{/each}
{:catch error}
<p>error loading comments: {error.message}</p>
{/await}
```
## Rerunning Load Functions
Load functions rerun when:
- Referenced params or URL properties change
- A parent load function reran and `await parent()` was called
- A dependency was invalidated with `invalidate(url)` or `invalidateAll()`
Manually invalidate load functions:
```js
// In load function
export async function load({ fetch, depends }) {
depends('app:random');
// ...
}
// In component
import { invalidate } from '$app/navigation';
function rerunLoadFunction() {
invalidate('app:random');
}
```
## Dependency Tracking
Exclude from dependency tracking with `untrack`:
```js
export async function load({ untrack, url }) {
if (untrack(() => url.pathname === '/')) {
return { message: 'Welcome!' };
}
}
```
### Implications for authentication
- Layout loads dont automatically rerun on CSR; guards in `+layout.server.js` require child pages to await the parent.
- To avoid missed auth checks and waterfalls, use hooks like `handle` for global protection or perpage server loads.
### Using getRequestEvent
- `getRequestEvent()` retrieves the current server `RequestEvent`, letting shared functions (e.g. `requireLogin()`) access `locals`, `url`, etc., without parameter passing.
## Using forms
### Form actions
- A `+page.server.js` can export `export const actions: Actions = { default: async (event) => {…} }`; `<form method="POST">` in `+page.svelte` posts to the default action without any JS. `+page.js` or `+layout.js` or `+layout.server.js` can NOT export `actions`
- Name multiple actions (`login`, `register`) in `actions`, invoke with `action="?/register"` or `button formaction="?/register"`; do NOT use `default` name in this case.
- Each action gets `{ request, cookies, params }`, uses `await request.formData()`, sets cookies or DB state, and returns an object that appears on the page as `form` (typed via `PageProps`).
Example: Define a default action in `+page.server.js`:
```js
// file: src/routes/login/+page.server.js
import type { Actions } from './$types';
export const actions: Actions = {
default: async (event) => {
// TODO log the user in
}
};
```
Use it with a simple form:
```svelte
<!-- file: src/routes/login/+page.svelte -->
<form method="POST">
<label>
Email
<input name="email" type="email">
</label>
<label>
Password
<input name="password" type="password">
</label>
<button>Log in</button>
</form>
```
### Validation errors
- Return `fail(400, { field, error: true })` from an action to send back status and data; display via `form?.field` and repopulate inputs with `value={form?.field ?? ''}`.
- Use `fail` instead of throwing so the nearest `+error.svelte` isnt invoked and the user can correct their input.
- `fail` payload must be JSONserializable.
### Redirects
- In an action, call `redirect(status, location)` to send a 3xx redirect; this throws and bypasses form re-render.
- Client-side, use `goto()` from `$app/navigation` for programmatic redirects.
### Loading data after actions
- After an action completes (unless redirected), SvelteKit reruns `load` functions and rerenders the page, merging the actions return value into `form`.
- The `handle` hook runs once before the action; if you modify cookies in your action, you must also update `event.locals` there to keep `load` in sync.
- Do NOT assume `locals` persists automatically; set `event.locals` inside your action when auth state changes.
### Progressive enhancement
- Apply `use:enhance` from `$app/forms` to `<form>` to intercept submissions, prevent full reloads, update `form`, `page.form`, `page.status`, reset the form, invalidate all data, handle redirects, render errors, and restore focus. Do NOT use onsubmit event for progressive enhancement
- To customize, provide a callback that runs before submit and returns a handler; use `update()` for default logic or `applyAction(result)` to apply form data without full invalidation.
- You can also write your own `onsubmit` listener using `fetch`, then `deserialize` the response and `applyAction`/`invalidateAll`; do NOT use `JSON.parse` for action responses.
```svelte
<script>
import type { PageProps } from './$types';
import { enhance } from '$app/forms';
let { form } = $props();
</script>
<form method="POST" use:enhance>
<!-- form content -->
</form>
```
## Page options
#### prerender
- Set `export const prerender = true|false|'auto'` in page or layout modules; `true` generates static HTML, `false` skips, `'auto'` includes in SSR manifest.
- Applies to pages **and** `+server.js` routes (inherit parent flags); dynamic routes need `entries()` or `config.kit.prerender.entries` to tell the crawler which parameter values to use.
- Do NOT prerender pages that use form actions or rely on `url.searchParams` serverside.
#### entries
- In a dynamic routes `+page(.server).js` or `+server.js`, export `export function entries(): Array<Record<string,string>>` (can be async) to list parameter sets for prerendering.
- Overrides default crawling to ensure dynamic pages (e.g. `/blog/[slug]`) are generated.
- Do NOT forget to pair `entries()` with `export const prerender = true`.
### ssr
- `export const ssr = false` disables server-side rendering, sending only an HTML shell and turning the page into a client-only SPA.
- Use sparingly (e.g. when using browseronly globals); do NOT set both `ssr` and `csr` to `false` or nothing will render.
#### csr
- `export const csr = false` prevents hydration, omits JS bundle, disables `<script>`s, form enhancements, client routing, and HMR.
- Ideal for purely static pages (e.g. marketing or blog posts); do NOT disable CSR on pages requiring interactivity.
## State management
- Avoid shared server variables—servers are stateless and shared across users. Authenticate via cookies and persist to a database instead of writing to inmemory globals.
- Keep `load` functions pure: no sideeffects or global store writes. Return data from `load` and pass it via `data` or `page.data`.
- For shared clientonly state across components, use Sveltes context API (`setContext`/`getContext`) or URL parameters for persistent filters; snapshots for ephemeral UI state tied to navigation history.
## Building your app
- Build runs in two phases: Vite compiles and prerenders (if enabled), then an adapter tailors output for your deployment target.
- Guard any code that should not execute at build time with `import { building } from '$app/environment'; if (!building) { … }`.
- Preview your production build locally with `npm run preview` (Nodeonly, no adapter hooks).
## Adapters
- Adapters transform the built app into deployable assets for various platforms (Cloudflare, Netlify, Node, static, Vercel, plus community adapters).
- Configure in `svelte.config.js` under `kit.adapter = adapter(opts)`, importing the adapter module and passing its options.
- Some adapters expose a `platform` object (e.g. Cloudflares `env`); access it via `event.platform` in hooks and server routes.
## Singlepage apps
- Turn your app into a fully CSR SPA by setting `export const ssr = false;` in the root `+layout.js`.
- For static hosting, use `@sveltejs/adapter-static` with a `fallback` HTML (e.g. `200.html`) so client routing can handle unknown paths.
- You can still prerender select pages by enabling `prerender = true` and `ssr = true` in their individual `+page.js` or `+layout.js` modules.
## Advanced routing
- Rest parameters (`[...file]`) capture an unknown number of segments (e.g. `src/routes/hello/[...path]` catches all routes under `/hello`) and expose them as a single string; use a catchall route `+error.svelte` to render nested custom 404 pages.
- Optional parameters (`[[lang]]`) make a segment optional, e.g. for `[[lang]]/home` both `/home` and `/en/home` map to the same route; cannot follow a rest parameter.
- Matchers in `src/params/type.js` let you constrain `[param=type]` (e.g. only “apple” or “orange”), falling back to other routes or a 404 if the test fails.
### Advanced layouts
- Group directories `(app)` or `(marketing)` apply a shared layout without affecting URLs.
- Break out of the inherited layout chain per page with `+page@segment.svelte` (e.g. `+page@(app).svelte`) or per layout with `+layout@.svelte`.
- Use grouping judiciously: overuse can complicate nesting; sometimes simple composition or wrapper components suffice.
## Hooks
### Server hooks
- `handle({ event, resolve })`: runs on every request; mutate `event.locals`, bypass routing, or call `resolve(event, { transformPageChunk, filterSerializedResponseHeaders, preload })` to customize HTML, headers, and asset preloading.
- `handleFetch({ event, request, fetch })`: intercepts serverside `fetch` calls to rewrite URLs, forward cookies on crossorigin, or route internal requests directly to handlers.
- `init()`: runs once at server startup for async setup (e.g. database connections).
### Shared hooks
- `handleError({ error, event, status, message })`: catches unexpected runtime errors on server or client; log via Sentry or similar, return a safe object (e.g. `{ message: 'Oops', errorId }`) for `$page.error`.
### Universal hooks
- `reroute({ url, fetch? })`: map incoming `url.pathname` to a different route ID (without changing the address bar), optionally async and using `fetch`.
- `transport`: define `encode`/`decode` for custom types (e.g. class instances) to serialize them across server/client boundaries in loads and actions.
## Errors
- Expected errors thrown with `error(status, message|object)` set the response code, render the nearest `+error.svelte` with `page.error`, and let you pass extra props (e.g. `{ code: 'NOT_FOUND' }`).
- Unexpected exceptions invoke the `handleError` hook, are logged internally, and expose a generic `{ message: 'Internal Error' }` to users; customize reporting or usersafe messages in `handleError`.
- Errors in server handlers or `handle` return JSON or your `src/error.html` fallback based on `Accept` headers; errors in `load` render component boundaries as usual. Typesafe shapes via a global `App.Error` interface.
## Link options
The following are HTML attributes you can put on any HTML element.
- `data-sveltekit-preload-data="hover"|"tap"` preloads `load` on link hover (`touchstart`) or immediate tap; use `"tap"` for fastchanging data.
- `data-sveltekit-preload-code="eager"|"viewport"|"hover"|"tap"` preloads JS/CSS aggressively or on scroll/hover/tap to improve load times.
- `data-sveltekit-reload` forces full-page reload; `data-sveltekit-replacestate` uses `replaceState`; `data-sveltekit-keepfocus` retains focus; `data-sveltekit-noscroll` preserves scroll position; disable any by setting the value to `"false"`.
## Server-only modules
- `$env/static/private` and `$env/dynamic/private` can only be imported into serveronly files (`hooks.server.js`, `+page.server.js`); prevents leaking secrets to the client.
- `$app/server` (e.g. the `read()` API) is likewise restricted to serverside code.
- Make your own modules serveronly by naming them `*.server.js` or placing them in `src/lib/server/`; any publicfacing import chain to these files triggers a build error.
## Shallow routing
- Use `pushState(path, state)` or `replaceState('', state)` from `$app/navigation` to create history entries without full navigation; read/write `page.state` from `$app/state`.
- Ideal for UI like modals: `if (page.state.showModal) <Modal/>` and dismiss with `history.back()`.
- To embed a routes page component without navigation, preload data with `preloadData(href)` then `pushState`, falling back to `goto`; note SSR and initial load have empty `page.state`, and shallow routing requires JS.
## Images
- Vites asset handling inlines small files, adds hashes, and lets you `import logo from '...png'` for use in `<img src={logo}>`.
- Install `@sveltejs/enhanced-img` and add `enhancedImages()` to your Vite config; use `<enhanced:img src="...jpg" alt="…"/>` to autogenerate `<picture>` tags with AVIF/WebP, responsive `srcset`/`sizes`, and intrinsic dimensions.
- For CMS or dynamic images, leverage a CDN with Svelte libraries like `@unpic/svelte`; always supply highresolution originals (2×), specify `sizes` for LCP images, set `fetchpriority="high"`, constrain layout via CSS to avoid CLS, and include meaningful `alt` text.
## Reference docs
### Imports from `@sveltejs/kit`
- **error**: throw an HTTP error and halt request processing
```js
import { error } from '@sveltejs/kit';
export function load() {
error(404, 'Not found');
}
```
- **fail**: return a form action failure without throwing
```js
import { fail } from '@sveltejs/kit';
export const actions = {
default: async ({ request }) => {
const data = await request.formData();
if (!data.get('name')) return fail(400, { missing: true });
}
};
```
- **isActionFailure**: typeguard for failures from `fail`
```js
import { isActionFailure } from '@sveltejs/kit';
if (isActionFailure(result)) {
/* handle invalid form */
}
```
- **isHttpError**: typeguard for errors from `error`
```js
import { isHttpError } from '@sveltejs/kit';
try {
/* … */
} catch (e) {
if (isHttpError(e, 404)) console.log('Not found');
}
```
- **isRedirect**: typeguard for redirects from `redirect`
```js
import { redirect, isRedirect } from '@sveltejs/kit';
try {
redirect(302, '/login');
} catch (e) {
if (isRedirect(e)) console.log('Redirecting');
}
```
- **json**: build a JSON `Response`
```js
import { json } from '@sveltejs/kit';
export function GET() {
return json({ hello: 'world' });
}
```
- **normalizeUrl** _(v2.18+)_: strip internal suffixes/trailing slashes
```js
import { normalizeUrl } from '@sveltejs/kit';
const { url, denormalize } = normalizeUrl('/foo/__data.json');
url.pathname; // /foo
```
- **redirect**: throw a redirect response
```js
import { redirect } from '@sveltejs/kit';
export function load() {
redirect(303, '/dashboard');
}
```
- **text**: build a plaintext `Response`
```js
import { text } from '@sveltejs/kit';
export function GET() {
return text('Hello, text!');
}
```
### Imports from `@sveltejs/kit/hooks`
- **sequence**: compose multiple `handle` hooks into one, merging their options
```js
import { sequence } from '@sveltejs/kit/hooks';
export const handle = sequence(handleOne, handleTwo);
```
### Imports from `$app/forms`
- **applyAction**: apply an `ActionResult` to update `page.form` and `page.status`
```js
import { applyAction } from '$app/forms';
// inside enhance callback:
await applyAction(result);
```
- **deserialize**: parse a serialized form action response back into `ActionResult`
```js
import { deserialize } from '$app/forms';
const result = deserialize(await response.text());
```
- **enhance**: progressively enhance a `<form>` for AJAX submissions
```svelte
<script>
import { enhance } from '$app/forms';
</script>
<form use:enhance on:submit={handle}>
```
### Imports from `$app/navigation`
- **afterNavigate**: run code after every clientside navigation. Needs to be called at component initialization
```js
import { afterNavigate } from '$app/navigation';
afterNavigate(({ type, to }) => console.log('navigated via', type));
```
- **beforeNavigate**: intercept and optionally cancel upcoming navigations. Needs to be called at component initialization
```js
import { beforeNavigate } from '$app/navigation';
beforeNavigate(({ cancel }) => {
if (!confirm('Leave?')) cancel();
});
```
- **disableScrollHandling**: disable automatic scroll resetting after navigation
```js
import { disableScrollHandling } from '$app/navigation';
disableScrollHandling();
```
- **goto**: programmatically navigate within the app
```svelte
<script>
import { goto } from '$app/navigation';
function navigate() {
goto('/dashboard', { replaceState: true });
}
</script>
<button onclick={navigate}>navigate</button>
```
- **invalidate**: rerun `load` functions that depend on a given URL or custom key
```js
import { invalidate } from '$app/navigation';
await invalidate('/api/posts');
```
- **invalidateAll**: rerun every `load` for the current page
```js
import { invalidateAll } from '$app/navigation';
await invalidateAll();
```
- **onNavigate**: hook invoked immediately before clientside navigations. Needs to be called at component initialization
```js
import { onNavigate } from '$app/navigation';
onNavigate(({ to }) => console.log('about to go to', to.url));
```
- **preloadCode**: import route modules ahead of navigation (no data fetch)
```js
import { preloadCode } from '$app/navigation';
await preloadCode('/about');
```
- **preloadData**: load both code and data for a route ahead of navigation
```js
import { preloadData } from '$app/navigation';
const result = await preloadData('/posts/1');
```
- **pushState**: create a shallowrouting history entry with custom state
```js
import { pushState } from '$app/navigation';
pushState('', { modalOpen: true });
```
- **replaceState**: replace the current history entry with new custom state
```js
import { replaceState } from '$app/navigation';
replaceState('', { modalOpen: false });
```
### Imports from `$app/paths`
- **assets**: the absolute URL prefix for static assets (`config.kit.paths.assets`)
```js
import { assets } from '$app/paths';
console.log(`<img src="${assets}/logo.png">`);
```
- **base**: the base path for your app (`config.kit.paths.base`)
```svelte
<a href="{base}/about">About Us</a>
```
- **resolveRoute**: interpolate a route ID with parameters to form a pathname
```js
import { resolveRoute } from '$app/paths';
resolveRoute('/blog/[slug]/[...rest]', {
slug: 'hello',
rest: '2024/updates'
});
// → "/blog/hello/2024/updates"
```
### Imports from `$app/server`
- **getRequestEvent** _(v2.20+)_: retrieve the current server `RequestEvent`
```js
import { getRequestEvent } from '$app/server';
export function load() {
const event = getRequestEvent();
console.log(event.url);
}
```
- **read** _(v2.4+)_: read a static asset imported by Vite as a `Response`
```js
import { read } from '$app/server';
import fileUrl from './data.txt';
const res = read(fileUrl);
console.log(await res.text());
```
- **navigating**: a readonly object describing any inflight navigation (or `null`)
```svelte
<script>
import { navigating } from '$app/state';
console.log(navigating.from, navigating.to);
</script>
```
### Imports from `$app/state`
- **page**: readonly reactive info about the current page (`url`, `params`, `data`, etc.)
```svelte
<script>
import { page } from '$app/state';
const path = $derived(page.url.pathname);
</script>
{path}
```
- **updated**: reactive flag for new app versions; call `updated.check()` to poll immediately
```svelte
<script>
import { updated } from '$app/state';
$effect(() => {
if (updated.current) {
alert('A new version is available. Refresh?');
}
})
</script>
```
### Imports from `$env/dynamic/private`
- **env (dynamic/private)**: runtime private env vars (`process.env…`), not exposed to client
```js
import { env } from '$env/dynamic/private';
console.log(env.SECRET_API_KEY);
```
### Imports from `$env/dynamic/public`
- **env (dynamic/public)**: runtime public env vars (`PUBLIC_…`), safe for client use
```js
import { env } from '$env/dynamic/public';
console.log(env.PUBLIC_BASE_URL);
```
### Imports from `$env/static/private`
- **$env/static/private**: compiletime private env vars, deadcode eliminated
```js
import { DATABASE_URL } from '$env/static/private';
console.log(DATABASE_URL);
```
### Imports from `$env/static/public`
- **$env/static/public**: compiletime public env vars (`PUBLIC_…`), safe on client
```js
import { PUBLIC_WS_ENDPOINT } from '$env/static/public';
console.log(PUBLIC_WS_ENDPOINT);
```
### `$lib` alias
Alias for `src/lib` folder, e.g.
```svelte
<script>
import Button from '$lib/Button.svelte';
</script>
<Button>Click me</Button>
```
means that there's a component at `src/lib/Button.svelte`.