Skip to content

Commit 3340c51

Browse files
committed
pref(transform): improve bundle size
1 parent 1c0b50b commit 3340c51

File tree

5 files changed

+119
-32
lines changed

5 files changed

+119
-32
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "unplugin-vue-jsx-vapor",
33
"version": "1.0.3",
4-
"packageManager": "pnpm@9.4.0",
4+
"packageManager": "pnpm@9.5.0",
55
"description": "Converts Vue JSX to Vapor",
66
"type": "module",
77
"keywords": [

playground/App.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default defineComponent({
1717
}
1818
1919
const Count1 = ({ value }) => {
20-
return <div>{value}</div>
20+
return <div>{value.value}</div>
2121
}
2222
2323
return (
@@ -30,7 +30,7 @@ export default defineComponent({
3030
/>
3131
3232
<Count value={count.value} />
33-
<Count1 value={count.value} />
33+
<Count1 value={count} />
3434
<Count2 value={count.value} />
3535
</fieldset>
3636

pnpm-lock.yaml

Lines changed: 41 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/core/transform.ts

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ export function transformVueJsxVapor(
3535
},
3636
})
3737

38-
const importSet = new Set()
39-
const preambles: string[] = []
38+
let preambleIndex = 0
39+
const importSet = new Set<string>()
40+
const delegateEventSet = new Set<string>()
41+
const preambleMap = new Map<string, string>()
4042
for (const { node } of rootNodes) {
4143
if (isJSXElement(node)) {
4244
let { code, vaporHelpers, preamble } = compile(s.sliceNode(node), {
@@ -47,22 +49,47 @@ export function transformVueJsxVapor(
4749
...options?.compile,
4850
})
4951
vaporHelpers.forEach((helper) => importSet.add(helper))
50-
preamble = preamble.replace(/^[^\n]*;\n?/, '')
52+
5153
preamble = preamble.replaceAll(
52-
/(?<=const t)(?=\d)/g,
53-
`_${preambles.length}`,
54-
)
55-
s.overwriteNode(
56-
node,
57-
code.replaceAll(/(?<= t)(?=\d)/g, `_${preambles.length}`),
54+
/(?<=const )t(?=(\d))/g,
55+
`_${preambleIndex}`,
5856
)
59-
preambles.push(preamble)
57+
code = code.replaceAll(/(?<== )t(?=\d)/g, `_${preambleIndex}`)
58+
preambleIndex++
59+
60+
for (const [, key, value] of preamble.matchAll(
61+
/const (_\d+) = (_template\(.*\))/g,
62+
)) {
63+
const result = preambleMap.get(value)
64+
if (result) {
65+
code = code.replaceAll(key, result)
66+
} else {
67+
preambleMap.set(value, key)
68+
}
69+
}
70+
71+
for (const [, events] of preamble.matchAll(/_delegateEvents\((.*)\)/g)) {
72+
events.split(', ').forEach((event) => delegateEventSet.add(event))
73+
}
74+
75+
s.overwriteNode(node, code)
76+
}
77+
}
78+
79+
if (delegateEventSet.size) {
80+
s.prepend(`_delegateEvents(${Array.from(delegateEventSet).join(', ')});\n`)
81+
}
82+
83+
if (preambleMap.size) {
84+
let preambleResult = ''
85+
for (const [value, key] of preambleMap) {
86+
preambleResult += `const ${key} = ${value}\n`
6087
}
88+
s.prepend(preambleResult)
6189
}
6290

63-
s.prepend(
64-
`import { ${Array.from(importSet).map((i) => `${i} as _${i}`)} } from 'vue/vapor';\n${preambles.join('')}`,
65-
)
91+
const importResult = Array.from(importSet).map((i) => `${i} as _${i}`)
92+
s.prepend(`import { ${importResult} } from 'vue/vapor';\n`)
6693

6794
return generateTransform(s, id)
6895
}

test/transform.spec.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { describe, expect, test } from 'vitest'
2+
import { transformVueJsxVapor } from '../src/core/transform'
3+
4+
describe('transform', () => {
5+
test('transform multiple components', () => {
6+
const { code } = transformVueJsxVapor(
7+
`const a = <div onClick={onClick}>Hello</div>
8+
const b = <>{foo? <div onClick={onClick}>Hello</div> : <div onDblclick={onDblclick}>World</div>}</>`,
9+
'tsx',
10+
)!
11+
expect(code).toMatchInlineSnapshot(`
12+
"import { delegate as _delegate,createIf as _createIf,delegateEvents as _delegateEvents,template as _template } from 'vue/vapor';
13+
const _00 = _template("<div>Hello</div>")
14+
const _01 = _template("<div>World</div>")
15+
_delegateEvents("click", "dblclick");
16+
const a = (() => {
17+
const n0 = _00()
18+
_delegate(n0, "click", () => onClick)
19+
return n0
20+
})()
21+
const b = (() => {
22+
const n0 = _createIf(() => (foo), () => {
23+
const n2 = _00()
24+
_delegate(n2, "click", () => onClick)
25+
return n2
26+
}, () => {
27+
const n4 = _01()
28+
_delegate(n4, "dblclick", () => onDblclick)
29+
return n4
30+
})
31+
return n0
32+
})()"
33+
`)
34+
})
35+
})

0 commit comments

Comments
 (0)