From 61e1241893148111412ff0128da18bb0aabd5af1 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 9 May 2023 14:41:06 +0100 Subject: [PATCH 1/3] fix(nuxt): deduplicate global components before registration --- packages/nuxt/src/components/templates.ts | 8 +++++--- .../basic/components/global/ClientGlobal.client.vue | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/basic/components/global/ClientGlobal.client.vue diff --git a/packages/nuxt/src/components/templates.ts b/packages/nuxt/src/components/templates.ts index fa2c7eb6d1ce..b867704800df 100644 --- a/packages/nuxt/src/components/templates.ts +++ b/packages/nuxt/src/components/templates.ts @@ -39,10 +39,12 @@ export const componentsPluginTemplate: NuxtPluginTemplate c.global) if (!globalComponents.length) { return emptyComponentsPlugin } + const components = [...new Set(globalComponents.map(n => n.pascalName))] + return `import { defineNuxtPlugin } from '#app/nuxt' -import { ${globalComponents.map(c => 'Lazy' + c.pascalName).join(', ')} } from '#components' -const lazyGlobalComponents = [ - ${globalComponents.map(c => `["${c.pascalName}", Lazy${c.pascalName}]`).join(',\n')} +import { ${components.map(c => 'Lazy' + c).join(', ')} } from '#components' +const lazynames = [ + ${components.map(c => `["${c}", Lazy${c}]`).join(',\n')} ] export default defineNuxtPlugin({ diff --git a/test/fixtures/basic/components/global/ClientGlobal.client.vue b/test/fixtures/basic/components/global/ClientGlobal.client.vue new file mode 100644 index 000000000000..dfcd008e1ba6 --- /dev/null +++ b/test/fixtures/basic/components/global/ClientGlobal.client.vue @@ -0,0 +1,5 @@ + From 196bdfeab9695c56d15614a5779ed18ff447e6e5 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 9 May 2023 14:51:21 +0100 Subject: [PATCH 2/3] fix: oops --- packages/nuxt/src/components/templates.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/components/templates.ts b/packages/nuxt/src/components/templates.ts index b867704800df..ee57c6a74c6a 100644 --- a/packages/nuxt/src/components/templates.ts +++ b/packages/nuxt/src/components/templates.ts @@ -43,7 +43,7 @@ export const componentsPluginTemplate: NuxtPluginTemplate 'Lazy' + c).join(', ')} } from '#components' -const lazynames = [ +const lazyGlobalComponents = [ ${components.map(c => `["${c}", Lazy${c}]`).join(',\n')} ] From 6f90659883e317e809e74bef431329c0d7d41b55 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 9 May 2023 14:53:43 +0100 Subject: [PATCH 3/3] perf: iterate only once --- packages/nuxt/src/components/templates.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/nuxt/src/components/templates.ts b/packages/nuxt/src/components/templates.ts index ee57c6a74c6a..0c1a281a1b10 100644 --- a/packages/nuxt/src/components/templates.ts +++ b/packages/nuxt/src/components/templates.ts @@ -36,10 +36,15 @@ export default defineNuxtPlugin({ export const componentsPluginTemplate: NuxtPluginTemplate = { filename: 'components.plugin.mjs', getContents ({ app }) { - const globalComponents = app.components.filter(c => c.global) - if (!globalComponents.length) { return emptyComponentsPlugin } + const globalComponents = new Set() + for (const component of app.components) { + if (component.global) { + globalComponents.add(component.pascalName) + } + } + if (!globalComponents.size) { return emptyComponentsPlugin } - const components = [...new Set(globalComponents.map(n => n.pascalName))] + const components = [...globalComponents] return `import { defineNuxtPlugin } from '#app/nuxt' import { ${components.map(c => 'Lazy' + c).join(', ')} } from '#components'