diff --git a/e2e/docs/imports/use-template-ref-1.md b/e2e/docs/imports/use-template-ref-1.md
new file mode 100644
index 0000000000..0570be594a
--- /dev/null
+++ b/e2e/docs/imports/use-template-ref-1.md
@@ -0,0 +1,7 @@
+
use-template-ref-1
+
+
diff --git a/e2e/docs/imports/use-template-ref-2.md b/e2e/docs/imports/use-template-ref-2.md
new file mode 100644
index 0000000000..77928af55b
--- /dev/null
+++ b/e2e/docs/imports/use-template-ref-2.md
@@ -0,0 +1,7 @@
+use-template-ref-2
+
+
diff --git a/e2e/tests/imports/use-template-ref.spec.ts b/e2e/tests/imports/use-template-ref.spec.ts
new file mode 100644
index 0000000000..4651760324
--- /dev/null
+++ b/e2e/tests/imports/use-template-ref.spec.ts
@@ -0,0 +1,22 @@
+import { expect, test } from '@playwright/test'
+
+import { IS_PROD } from '../../utils/env'
+
+// pages using the same template ref key should all be rendered correctly,
+// which requires a single vue runtime in the server bundle
+for (const name of ['use-template-ref-1', 'use-template-ref-2']) {
+ test(`should render ${name} correctly`, async ({ page }) => {
+ await page.goto(`imports/${name}.html`)
+
+ await expect(page.locator('#use-template-ref')).toHaveText(name)
+
+ if (IS_PROD) {
+ expect(
+ await page.evaluate(
+ async (url) => fetch(url).then(async (res) => res.text()),
+ `./${name}.html`,
+ ),
+ ).toContain(`>${name}`)
+ }
+ })
+}
diff --git a/packages/bundler-webpack/src/build/createServerConfig.ts b/packages/bundler-webpack/src/build/createServerConfig.ts
index e446644e2e..c94fbdc636 100644
--- a/packages/bundler-webpack/src/build/createServerConfig.ts
+++ b/packages/bundler-webpack/src/build/createServerConfig.ts
@@ -33,7 +33,9 @@ export const createServerConfig = async (
// set externals
// externalize vue in ssr mode, because we need to import `'vue/server-renderer'` in node side
// for ssr usage, then we also need vue as peer-dependency when using pnpm
- config.externals(['vue'])
+ // subpaths like `'vue/server-renderer'` should also be externalized, otherwise
+ // a second vue runtime would be bundled into the server bundle
+ config.externals([/^vue($|\/)/])
// devtool
config.devtool('source-map')