From 26b1c9ca0ece63d4ea6731d75b83fbe253022485 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 10 Oct 2022 16:48:23 +0100 Subject: [PATCH] feat(nuxt): parse html to treeshake client-only components (#7527) --- packages/nuxt/package.json | 1 + packages/nuxt/src/components/tree-shake.ts | 49 ++++++++++++++++------ yarn.lock | 8 ++++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index afc03527aa7..ff063a267f1 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -67,6 +67,7 @@ "scule": "^0.3.2", "strip-literal": "^0.4.2", "ufo": "^0.8.5", + "ultrahtml": "^0.1.1", "unctx": "^2.0.2", "unenv": "^0.6.2", "unimport": "^0.6.8", diff --git a/packages/nuxt/src/components/tree-shake.ts b/packages/nuxt/src/components/tree-shake.ts index 23d869ddde9..263fb489750 100644 --- a/packages/nuxt/src/components/tree-shake.ts +++ b/packages/nuxt/src/components/tree-shake.ts @@ -1,6 +1,7 @@ import { pathToFileURL } from 'node:url' import { parseURL } from 'ufo' import MagicString from 'magic-string' +import { parse, walk, ELEMENT_NODE, Node } from 'ultrahtml' import { createUnplugin } from 'unplugin' import type { Component } from '@nuxt/schema' @@ -9,8 +10,10 @@ interface TreeShakeTemplatePluginOptions { getComponents (): Component[] } +const PLACEHOLDER_RE = /^(v-slot|#)(fallback|placeholder)/ + export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplatePluginOptions) => { - const regexpMap = new WeakMap() + const regexpMap = new WeakMap() return { name: 'nuxt:tree-shake-template', enforce: 'pre', @@ -18,28 +21,48 @@ export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplat const { pathname } = parseURL(decodeURIComponent(pathToFileURL(id).href)) return pathname.endsWith('.vue') }, - transform (code, id) { + async transform (code, id) { + const template = code.match(/