From bff0671afecf39ef7e66ed58d329e4af73756309 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 14 Sep 2022 23:29:51 +0100 Subject: [PATCH 1/7] feat(nuxt): parse html to treeshake client-only components --- packages/nuxt/package.json | 1 + packages/nuxt/src/components/tree-shake.ts | 42 +++++++++++++++------- yarn.lock | 17 +++++++++ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 062dd960976..c58b5502c57 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -62,6 +62,7 @@ "nuxi": "3.0.0-rc.10", "ohash": "^0.1.5", "ohmyfetch": "^0.4.18", + "parse5": "^7.1.1", "pathe": "^0.3.7", "perfect-debounce": "^0.1.3", "scule": "^0.3.2", diff --git a/packages/nuxt/src/components/tree-shake.ts b/packages/nuxt/src/components/tree-shake.ts index 1cb14dde5c4..097127b0834 100644 --- a/packages/nuxt/src/components/tree-shake.ts +++ b/packages/nuxt/src/components/tree-shake.ts @@ -1,6 +1,8 @@ import { pathToFileURL } from 'node:url' import { parseURL } from 'ufo' import MagicString from 'magic-string' +import { parseFragment } from 'parse5' +import type { DocumentFragment, ChildNode } from 'parse5/dist/tree-adapters/default' import { createUnplugin } from 'unplugin' import type { Component } from '@nuxt/schema' @@ -10,7 +12,6 @@ interface TreeShakeTemplatePluginOptions { } export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplatePluginOptions) => { - const regexpMap = new WeakMap() return { name: 'nuxt:tree-shake-template', enforce: 'pre', @@ -19,23 +20,28 @@ export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplat return pathname.endsWith('.vue') }, transform (code, id) { - const components = options.getComponents() + const template = code.match(/