Skip to content

exportExpose

Stability: experimental ⚠️ Experimental feature, use at your risk

Transform export statement as defineExpose params in Vue SFC script-setup.

FeaturesSupported
Vue 3
Nuxt 3?
Vue 2
Volar Plugin

Usage

Support these syntaxes:

  • local variable/function/class
  • export with alias
  • export from other file
  • namespace export
  • rename export

1. local variable/function/class

vue
<script setup lang="ts">
export const foo: string = 'foo',
  bar = 10
export let baz: string | undefined
export var qux = fn()
export const { a, b, c } = { a: 1, b: 2, c: 3 }

export function fn() {}
export class A {}
</script>
Compiled Code
vue
<script lang="ts">
const foo: string = 'foo',
  bar = 10
let baz: string | undefined
const qux = fn()
const { a, b, c } = { a: 1, b: 2, c: 3 }

function fn() {}
class A {}

defineExpose({
  foo,
  bar,
  baz,
  qux,
  a,
  b,
  c,
  fn,
  A,
})
</script>

2. export with alias

vue
<script setup lang="ts">
export { foo as foo1 }
</script>
Compiled Code
vue
<script setup lang="ts">
defineExpose({
  foo1: foo,
})
</script>

3. export from other file

vue
<script setup lang="ts">
export { foo, type Foo, foo as bar } from './types'
</script>
Compiled Code
vue
<script setup lang="ts">
import {
  type Foo,
  foo as __MACROS_expose_0,
  foo as __MACROS_expose_1,
} from './types'
defineExpose({
  foo: __MACROS_expose_0,
  bar: __MACROS_expose_1,
})
</script>

4. namespace export

vue
<script setup lang="ts">
export * as foo from './types'
</script>
Compiled Code
vue
<script setup lang="ts">
import * as __MACROS_expose_0 from './types'
defineExpose({
  foo: __MACROS_expose_0,
})
</script>

5. rename export

vue
<script setup lang="ts">
const foo = 1,
  bar = 1

export { foo } from './types'
export * as bar from './types'
</script>
Compiled Code
vue
<script setup lang="ts">
import { foo as __MACROS_expose_0 } from './types'
import * as __MACROS_expose_1 from './types'

const foo = 1,
  bar = 1
defineExpose({
  foo: __MACROS_expose_0,
  bar: __MACROS_expose_1,
})
</script>

Limitations

Currently does't support these following cases:

ts
// 1. export all ❌
export * from '../types'

// 2. export default ❌
const a = 'a'
export default a

Volar Configuration

jsonc
// tsconfig.json
{
  "vueCompilerOptions": {
    "target": 3,
    "plugins": [
      "@vue-macros/volar/export-expose",
      // ...more feature
    ],
  },
}