---
name: script-setup
description: Compile-time syntactic sugar for Composition API in SFCs
---
# Script Setup
`
```
## Benefits
- Less boilerplate (no `export default`, no `return`)
- TypeScript type inference
- Better runtime performance
- Better IDE support
## Top-Level Bindings
All top-level bindings are automatically available in template:
```vue
{{ capitalize(msg) }}
```
## Compiler Macros
These are available without import:
- `defineProps()` - declare props
- `defineEmits()` - declare emits
- `defineModel()` - declare v-model (3.4+)
- `defineExpose()` - expose public instance properties
- `defineOptions()` - declare component options (3.3+)
- `defineSlots()` - type slot props (3.3+)
- `withDefaults()` - provide prop defaults
## Using Components
Import and use directly without registration:
```vue
```
### Dynamic Components
```vue
```
### Recursive Components
SFCs can reference themselves by filename:
```vue
```
## Custom Directives
Variables starting with `v` are available as directives:
```vue
```
## defineExpose()
Components are closed by default. Use `defineExpose` to expose properties:
```vue
```
Parent can access via template ref:
```ts
const childRef = ref()
childRef.value.count // accessible
childRef.value.publicMethod() // accessible
```
## defineOptions() (3.3+)
Declare component options without separate `
```
## defineSlots() (3.3+)
Type slot props for IDE support:
```vue
```
## useSlots() & useAttrs()
Access slots and attrs in script:
```vue
```
## Top-Level await
Async setup with Suspense:
```vue
```
> Note: Requires `` boundary in parent.
## Generic Components (TypeScript)
```vue
```
Multiple generics with constraints:
```vue
```
## Alongside Normal Script
For advanced cases like named exports or one-time side effects:
```vue
```