Skip to content

Commit 012dc5a

Browse files
authored
fix(compiler-ssr) ensure that ssrHelpers are unique after merge from parent context (#3269)
fix #3268
1 parent 9cd9883 commit 012dc5a

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

packages/compiler-ssr/__tests__/ssrElement.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,27 @@ describe('ssr: element', () => {
7171
`)
7272
})
7373

74+
test("multiple _ssrInterpolate at parent and child import dependency once", () => {
75+
expect( compile(`<div>{{ hello }}<textarea v-bind="a"></textarea></div>`).code)
76+
.toMatchInlineSnapshot(`
77+
"const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require(\\"@vue/server-renderer\\")
78+
79+
return function ssrRender(_ctx, _push, _parent, _attrs) {
80+
let _temp0
81+
82+
_push(\`<div\${
83+
_ssrRenderAttrs(_attrs)
84+
}>\${
85+
_ssrInterpolate(_ctx.hello)
86+
}<textarea\${
87+
_ssrRenderAttrs(_temp0 = _ctx.a, \\"textarea\\")
88+
}>\${
89+
_ssrInterpolate((\\"value\\" in _temp0) ? _temp0.value : \\"\\")
90+
}</textarea></div>\`)
91+
}"
92+
`);
93+
});
94+
7495
test('should pass tag to custom elements w/ dynamic v-bind', () => {
7596
expect(
7697
compile(`<my-foo v-bind="obj"></my-foo>`, {

packages/compiler-ssr/src/ssrCodegenTransform.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ export function ssrCodegenTransform(ast: RootNode, options: CompilerOptions) {
5656

5757
// Finalize helpers.
5858
// We need to separate helpers imported from 'vue' vs. '@vue/server-renderer'
59-
ast.ssrHelpers = [
59+
ast.ssrHelpers = Array.from(new Set([
6060
...ast.helpers.filter(h => h in ssrHelpers),
6161
...context.helpers
62-
]
62+
]))
63+
6364
ast.helpers = ast.helpers.filter(h => !(h in ssrHelpers))
6465
}
6566

0 commit comments

Comments
 (0)