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')