Skip to content

Commit 0803973

Browse files
zhiyuanzmjsxzz
andauthored
feat: introduce exportRender feature (#483)
Co-authored-by: 三咲智子 Kevin Deng <sxzz@sxzz.moe>
1 parent 8067a81 commit 0803973

File tree

29 files changed

+413
-1
lines changed

29 files changed

+413
-1
lines changed

.changeset/pink-items-compare.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@vue-macros/export-render': minor
3+
'@vue-macros/volar': minor
4+
'unplugin-vue-macros': patch
5+
---
6+
7+
Introduce `exportRender`

docs/.vitepress/locales/common.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ export const sidebar = (lang: string): DefaultTheme.SidebarItem[] => {
179179
text: 'exportExpose',
180180
link: `${urlPrefix}/features/export-expose`,
181181
},
182+
{
183+
text: 'exportRender',
184+
link: `${urlPrefix}/features/export-render`,
185+
},
182186
{
183187
text: 'jsxDirective',
184188
link: `${urlPrefix}/features/jsx-directive`,

docs/features/export-render.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# exportRender
2+
3+
<StabilityLevel level="experimental" />
4+
5+
Transform the default export statement, in `<script setup>` of Vue SFC, as a component render function.
6+
7+
| Features | Supported |
8+
| :----------: | :----------------: |
9+
| Vue 3 | :white_check_mark: |
10+
| Nuxt 3 | :question: |
11+
| Vue 2 | :question: |
12+
| Volar Plugin | :white_check_mark: |
13+
14+
::: tip
15+
16+
This feature depends on `defineRender`, and make sure `defineRender` is not disabled.
17+
18+
:::
19+
20+
## Usage
21+
22+
```vue
23+
<script setup lang="tsx">
24+
// JSX passed directly
25+
export default <div>ok</div>
26+
27+
// Or using render function
28+
export default () => <div>ok</div>
29+
</script>
30+
```

docs/guide/configurations.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ All features are enabled by default except the following.
1010
- `shortEmits` (Vue >= 3.3)
1111
- `exportExpose`
1212
- `exportProps`
13+
- `exportRender`
1314
- `setupSFC`
1415

1516
You can disable them by setting the option to `false`.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# exportRender
2+
3+
<StabilityLevel level="experimental" />
4+
5+
在 Vue SFC 的 `<script setup>` 中,把 export default 语句转换为组件的渲染函数。
6+
7+
| Features | Supported |
8+
| :----------: | :----------------: |
9+
| Vue 3 | :white_check_mark: |
10+
| Nuxt 3 | :question: |
11+
| Vue 2 | :question: |
12+
| Volar Plugin | :white_check_mark: |
13+
14+
::: tip
15+
16+
这个特性依赖于 `defineRender`,并确保 `defineRender` 没有被禁用。
17+
18+
:::
19+
20+
## 用法
21+
22+
```vue
23+
<script setup lang="tsx">
24+
// 可以直接传递 JSX
25+
export default <div>ok</div>
26+
27+
// 或使用渲染函数
28+
export default () => <div>ok</div>
29+
</script>
30+
```

docs/zh-CN/guide/configurations.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
## 插件选项
44

5-
默认情况下启用所有功能,但以下功能除外
5+
以下功能除外,默认情况下将启用所有功能
66

77
- `defineOptions` (Vue >= 3.3)
88
- `defineSlots` (Vue >= 3.3)
99
- `hoistStatic` (Vue >= 3.3)
1010
- `shortEmits` (Vue >= 3.3)
1111
- `exportExpose`
1212
- `exportProps`
13+
- `exportRender`
1314
- `setupSFC`
1415

1516
您可以通过将选项设置为 `false` 来禁用它们。

packages/export-render/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# @vue-macros/export-render [![npm](https://img.shields.io/npm/v/@vue-macros/export-render.svg)](https://npmjs.com/package/@vue-macros/export-render)
2+
3+
Please refer to [README.md](https://github.com/vue-macros/vue-macros#readme)
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
{
2+
"name": "@vue-macros/export-render",
3+
"version": "0.0.0",
4+
"packageManager": "pnpm@8.6.12",
5+
"description": "export-render feature from Vue Macros.",
6+
"keywords": [
7+
"vue-macros",
8+
"macros",
9+
"vue",
10+
"sfc",
11+
"setup",
12+
"script-setup",
13+
"export-render",
14+
"unplugin"
15+
],
16+
"license": "MIT",
17+
"homepage": "https://github.com/vue-macros/vue-macros#readme",
18+
"bugs": {
19+
"url": "https://github.com/vue-macros/vue-macros/issues"
20+
},
21+
"repository": {
22+
"type": "git",
23+
"url": "git+https://github.com/vue-macros/vue-macros.git",
24+
"directory": "packages/export-render"
25+
},
26+
"author": "三咲智子 <sxzz@sxzz.moe>",
27+
"files": [
28+
"dist"
29+
],
30+
"main": "dist/index.js",
31+
"module": "dist/index.mjs",
32+
"types": "dist/index.d.ts",
33+
"exports": {
34+
".": {
35+
"dev": "./src/index.ts",
36+
"require": "./dist/index.js",
37+
"import": "./dist/index.mjs"
38+
},
39+
"./api": {
40+
"dev": "./src/api.ts",
41+
"require": "./dist/api.js",
42+
"import": "./dist/api.mjs"
43+
},
44+
"./esbuild": {
45+
"dev": "./src/esbuild.ts",
46+
"require": "./dist/esbuild.js",
47+
"import": "./dist/esbuild.mjs"
48+
},
49+
"./rollup": {
50+
"dev": "./src/rollup.ts",
51+
"require": "./dist/rollup.js",
52+
"import": "./dist/rollup.mjs"
53+
},
54+
"./vite": {
55+
"dev": "./src/vite.ts",
56+
"require": "./dist/vite.js",
57+
"import": "./dist/vite.mjs"
58+
},
59+
"./webpack": {
60+
"dev": "./src/webpack.ts",
61+
"require": "./dist/webpack.js",
62+
"import": "./dist/webpack.mjs"
63+
},
64+
"./*": [
65+
"./*",
66+
"./*.d.ts"
67+
]
68+
},
69+
"typesVersions": {
70+
"*": {
71+
"*": [
72+
"./dist/*",
73+
"./*"
74+
]
75+
}
76+
},
77+
"scripts": {
78+
"build": "tsup",
79+
"dev": "DEV=true tsup"
80+
},
81+
"peerDependencies": {
82+
"vue": "^2.7.0 || ^3.2.25"
83+
},
84+
"dependencies": {
85+
"@vue-macros/common": "workspace:*",
86+
"@vue/compiler-sfc": "^3.3.4",
87+
"unplugin": "^1.4.0"
88+
},
89+
"devDependencies": {
90+
"vue": "^3.3.4"
91+
},
92+
"engines": {
93+
"node": ">=16.14.0"
94+
}
95+
}

packages/export-render/src/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './core'
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { MagicString, generateTransform, parseSFC } from '@vue-macros/common'
2+
3+
export function transformExportRender(code: string, id: string) {
4+
const { scriptSetup, getSetupAst } = parseSFC(code, id)
5+
if (!scriptSetup) return
6+
7+
const s = new MagicString(code)
8+
const nodes = getSetupAst()!.body
9+
const offset = scriptSetup.loc.start.offset
10+
11+
let codegen = ''
12+
for (const stmt of nodes) {
13+
if (
14+
stmt.type === 'ExportDefaultDeclaration' &&
15+
stmt.exportKind === 'value'
16+
) {
17+
codegen = s.sliceNode(stmt.declaration, { offset })
18+
s.removeNode(stmt, { offset })
19+
}
20+
}
21+
22+
if (codegen.length === 0) return
23+
24+
codegen = `defineRender(${codegen})`
25+
26+
s.prependLeft(scriptSetup.loc.end.offset, `${codegen}\n`)
27+
28+
return generateTransform(s, id)
29+
}

0 commit comments

Comments
 (0)