From ec8967b4b83457b75eee9ef14ec28f329579a641 Mon Sep 17 00:00:00 2001 From: julien huang Date: Tue, 15 Nov 2022 23:12:32 +0100 Subject: [PATCH 01/34] fix(nuxt): use parser for treeshake module --- packages/nuxt/src/components/module.ts | 22 ++-- packages/nuxt/src/components/tree-shake.ts | 129 ++++++++++++++------- 2 files changed, 98 insertions(+), 53 deletions(-) diff --git a/packages/nuxt/src/components/module.ts b/packages/nuxt/src/components/module.ts index 6f4b9419d73..4d4167d76a5 100644 --- a/packages/nuxt/src/components/module.ts +++ b/packages/nuxt/src/components/module.ts @@ -188,33 +188,31 @@ export default defineNuxtModule({ const mode = isClient ? 'client' : 'server' config.plugins = config.plugins || [] + if (nuxt.options.experimental.treeshakeClientOnly && isServer) { + config.plugins.push(TreeShakeTemplatePlugin.vite({ + sourcemap: nuxt.options.sourcemap[mode] + })) + } config.plugins.push(loaderPlugin.vite({ sourcemap: nuxt.options.sourcemap[mode], getComponents, mode })) - if (nuxt.options.experimental.treeshakeClientOnly && isServer) { - config.plugins.push(TreeShakeTemplatePlugin.vite({ - sourcemap: nuxt.options.sourcemap[mode], - getComponents - })) - } }) nuxt.hook('webpack:config', (configs) => { configs.forEach((config) => { const mode = config.name === 'client' ? 'client' : 'server' config.plugins = config.plugins || [] + if (nuxt.options.experimental.treeshakeClientOnly && mode === 'server') { + config.plugins.push(TreeShakeTemplatePlugin.webpack({ + sourcemap: nuxt.options.sourcemap[mode] + })) + } config.plugins.push(loaderPlugin.webpack({ sourcemap: nuxt.options.sourcemap[mode], getComponents, mode })) - if (nuxt.options.experimental.treeshakeClientOnly && mode === 'server') { - config.plugins.push(TreeShakeTemplatePlugin.webpack({ - sourcemap: nuxt.options.sourcemap[mode], - getComponents - })) - } }) }) } diff --git a/packages/nuxt/src/components/tree-shake.ts b/packages/nuxt/src/components/tree-shake.ts index 8e07ad02e78..deef54b8b93 100644 --- a/packages/nuxt/src/components/tree-shake.ts +++ b/packages/nuxt/src/components/tree-shake.ts @@ -1,66 +1,97 @@ import { pathToFileURL } from 'node:url' import { parseURL } from 'ufo' import MagicString from 'magic-string' -import { parse, walk, ELEMENT_NODE, Node } from 'ultrahtml' +import { walk } from 'estree-walker' +import type { CallExpression, Property, Identifier, ImportDeclaration } from 'estree' import { createUnplugin } from 'unplugin' -import type { Component } from '@nuxt/schema' interface TreeShakeTemplatePluginOptions { sourcemap?: boolean - getComponents (): Component[] } -const PLACEHOLDER_RE = /^(v-slot|#)(fallback|placeholder)/ +type AcornNode = N & { start: number, end: number } export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplatePluginOptions) => { - const regexpMap = new WeakMap() return { name: 'nuxt:tree-shake-template', - enforce: 'pre', + enforce: 'post', transformInclude (id) { const { pathname } = parseURL(decodeURIComponent(pathToFileURL(id).href)) return pathname.endsWith('.vue') }, - async transform (code, id) { - const template = code.match(/