mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-22 05:35:13 +00:00
feat(kit): support passing getter to addVitePlugin
and addWebpackPlugin
(#20525)
This commit is contained in:
parent
787d5e953e
commit
84559e84aa
@ -106,9 +106,11 @@ export function extendViteConfig (
|
|||||||
/**
|
/**
|
||||||
* Append webpack plugin to the config.
|
* Append webpack plugin to the config.
|
||||||
*/
|
*/
|
||||||
export function addWebpackPlugin (plugin: WebpackPluginInstance | WebpackPluginInstance[], options?: ExtendWebpackConfigOptions) {
|
export function addWebpackPlugin (pluginOrGetter: WebpackPluginInstance | WebpackPluginInstance[] | (() => WebpackPluginInstance | WebpackPluginInstance[]), options?: ExtendWebpackConfigOptions) {
|
||||||
const method: 'push' | 'unshift' = options?.prepend ? 'unshift' : 'push'
|
|
||||||
extendWebpackConfig((config) => {
|
extendWebpackConfig((config) => {
|
||||||
|
const method: 'push' | 'unshift' = options?.prepend ? 'unshift' : 'push'
|
||||||
|
const plugin = typeof pluginOrGetter === 'function' ? pluginOrGetter() : pluginOrGetter
|
||||||
|
|
||||||
config.plugins = config.plugins || []
|
config.plugins = config.plugins || []
|
||||||
if (Array.isArray(plugin)) {
|
if (Array.isArray(plugin)) {
|
||||||
config.plugins[method](...plugin)
|
config.plugins[method](...plugin)
|
||||||
@ -121,9 +123,11 @@ export function addWebpackPlugin (plugin: WebpackPluginInstance | WebpackPluginI
|
|||||||
/**
|
/**
|
||||||
* Append Vite plugin to the config.
|
* Append Vite plugin to the config.
|
||||||
*/
|
*/
|
||||||
export function addVitePlugin (plugin: VitePlugin | VitePlugin[], options?: ExtendViteConfigOptions) {
|
export function addVitePlugin (pluginOrGetter: VitePlugin | VitePlugin[] | (() => VitePlugin | VitePlugin[]), options?: ExtendViteConfigOptions) {
|
||||||
const method: 'push' | 'unshift' = options?.prepend ? 'unshift' : 'push'
|
|
||||||
extendViteConfig((config) => {
|
extendViteConfig((config) => {
|
||||||
|
const method: 'push' | 'unshift' = options?.prepend ? 'unshift' : 'push'
|
||||||
|
const plugin = typeof pluginOrGetter === 'function' ? pluginOrGetter() : pluginOrGetter
|
||||||
|
|
||||||
config.plugins = config.plugins || []
|
config.plugins = config.plugins || []
|
||||||
if (Array.isArray(plugin)) {
|
if (Array.isArray(plugin)) {
|
||||||
config.plugins[method](...plugin)
|
config.plugins[method](...plugin)
|
||||||
|
@ -78,17 +78,17 @@ async function initNuxt (nuxt: Nuxt) {
|
|||||||
exclude: [join(nuxt.options.rootDir, 'index.html')],
|
exclude: [join(nuxt.options.rootDir, 'index.html')],
|
||||||
patterns: vueAppPatterns(nuxt)
|
patterns: vueAppPatterns(nuxt)
|
||||||
}
|
}
|
||||||
addVitePlugin(ImportProtectionPlugin.vite(config))
|
addVitePlugin(() => ImportProtectionPlugin.vite(config))
|
||||||
addWebpackPlugin(ImportProtectionPlugin.webpack(config))
|
addWebpackPlugin(() => ImportProtectionPlugin.webpack(config))
|
||||||
|
|
||||||
if (nuxt.options.experimental.localLayerAliases) {
|
if (nuxt.options.experimental.localLayerAliases) {
|
||||||
// Add layer aliasing support for ~, ~~, @ and @@ aliases
|
// Add layer aliasing support for ~, ~~, @ and @@ aliases
|
||||||
addVitePlugin(LayerAliasingPlugin.vite({
|
addVitePlugin(() => LayerAliasingPlugin.vite({
|
||||||
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
||||||
// skip top-level layer (user's project) as the aliases will already be correctly resolved
|
// skip top-level layer (user's project) as the aliases will already be correctly resolved
|
||||||
layers: nuxt.options._layers.slice(1)
|
layers: nuxt.options._layers.slice(1)
|
||||||
}))
|
}))
|
||||||
addWebpackPlugin(LayerAliasingPlugin.webpack({
|
addWebpackPlugin(() => LayerAliasingPlugin.webpack({
|
||||||
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
||||||
// skip top-level layer (user's project) as the aliases will already be correctly resolved
|
// skip top-level layer (user's project) as the aliases will already be correctly resolved
|
||||||
layers: nuxt.options._layers.slice(1),
|
layers: nuxt.options._layers.slice(1),
|
||||||
@ -102,8 +102,8 @@ async function initNuxt (nuxt: Nuxt) {
|
|||||||
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client,
|
||||||
transformerOptions: nuxt.options.optimization.asyncTransforms
|
transformerOptions: nuxt.options.optimization.asyncTransforms
|
||||||
}
|
}
|
||||||
addVitePlugin(UnctxTransformPlugin.vite(options))
|
addVitePlugin(() => UnctxTransformPlugin.vite(options))
|
||||||
addWebpackPlugin(UnctxTransformPlugin.webpack(options))
|
addWebpackPlugin(() => UnctxTransformPlugin.webpack(options))
|
||||||
|
|
||||||
// Add composable tree-shaking optimisations
|
// Add composable tree-shaking optimisations
|
||||||
const serverTreeShakeOptions: TreeShakeComposablesPluginOptions = {
|
const serverTreeShakeOptions: TreeShakeComposablesPluginOptions = {
|
||||||
@ -111,23 +111,23 @@ async function initNuxt (nuxt: Nuxt) {
|
|||||||
composables: nuxt.options.optimization.treeShake.composables.server
|
composables: nuxt.options.optimization.treeShake.composables.server
|
||||||
}
|
}
|
||||||
if (Object.keys(serverTreeShakeOptions.composables).length) {
|
if (Object.keys(serverTreeShakeOptions.composables).length) {
|
||||||
addVitePlugin(TreeShakeComposablesPlugin.vite(serverTreeShakeOptions), { client: false })
|
addVitePlugin(() => TreeShakeComposablesPlugin.vite(serverTreeShakeOptions), { client: false })
|
||||||
addWebpackPlugin(TreeShakeComposablesPlugin.webpack(serverTreeShakeOptions), { client: false })
|
addWebpackPlugin(() => TreeShakeComposablesPlugin.webpack(serverTreeShakeOptions), { client: false })
|
||||||
}
|
}
|
||||||
const clientTreeShakeOptions: TreeShakeComposablesPluginOptions = {
|
const clientTreeShakeOptions: TreeShakeComposablesPluginOptions = {
|
||||||
sourcemap: nuxt.options.sourcemap.client,
|
sourcemap: nuxt.options.sourcemap.client,
|
||||||
composables: nuxt.options.optimization.treeShake.composables.client
|
composables: nuxt.options.optimization.treeShake.composables.client
|
||||||
}
|
}
|
||||||
if (Object.keys(clientTreeShakeOptions.composables).length) {
|
if (Object.keys(clientTreeShakeOptions.composables).length) {
|
||||||
addVitePlugin(TreeShakeComposablesPlugin.vite(clientTreeShakeOptions), { server: false })
|
addVitePlugin(() => TreeShakeComposablesPlugin.vite(clientTreeShakeOptions), { server: false })
|
||||||
addWebpackPlugin(TreeShakeComposablesPlugin.webpack(clientTreeShakeOptions), { server: false })
|
addWebpackPlugin(() => TreeShakeComposablesPlugin.webpack(clientTreeShakeOptions), { server: false })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!nuxt.options.dev) {
|
if (!nuxt.options.dev) {
|
||||||
// DevOnly component tree-shaking - build time only
|
// DevOnly component tree-shaking - build time only
|
||||||
addVitePlugin(DevOnlyPlugin.vite({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
addVitePlugin(() => DevOnlyPlugin.vite({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
||||||
addWebpackPlugin(DevOnlyPlugin.webpack({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
addWebpackPlugin(() => DevOnlyPlugin.webpack({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: [Experimental] Avoid emitting assets when flag is enabled
|
// TODO: [Experimental] Avoid emitting assets when flag is enabled
|
||||||
|
@ -81,8 +81,8 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
|
|||||||
nuxt.options.alias['#imports'] = join(nuxt.options.buildDir, 'imports')
|
nuxt.options.alias['#imports'] = join(nuxt.options.buildDir, 'imports')
|
||||||
|
|
||||||
// Transform to inject imports in production mode
|
// Transform to inject imports in production mode
|
||||||
addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
addVitePlugin(() => TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
||||||
addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
addWebpackPlugin(() => TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }))
|
||||||
|
|
||||||
const priorities = nuxt.options._layers.map((layer, i) => [layer.config.srcDir, -i] as const).sort(([a], [b]) => b.length - a.length)
|
const priorities = nuxt.options._layers.map((layer, i) => [layer.config.srcDir, -i] as const).sort(([a], [b]) => b.length - a.length)
|
||||||
|
|
||||||
|
@ -157,8 +157,8 @@ export default defineNuxtModule({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
nuxt.hook('modules:done', () => {
|
nuxt.hook('modules:done', () => {
|
||||||
addVitePlugin(PageMetaPlugin.vite(pageMetaOptions))
|
addVitePlugin(() => PageMetaPlugin.vite(pageMetaOptions))
|
||||||
addWebpackPlugin(PageMetaPlugin.webpack(pageMetaOptions))
|
addWebpackPlugin(() => PageMetaPlugin.webpack(pageMetaOptions))
|
||||||
})
|
})
|
||||||
|
|
||||||
// Add prefetching support for middleware & layouts
|
// Add prefetching support for middleware & layouts
|
||||||
|
4
test/fixtures/basic/nuxt.config.ts
vendored
4
test/fixtures/basic/nuxt.config.ts
vendored
@ -106,8 +106,8 @@ export default defineNuxtConfig({
|
|||||||
if (id === 'virtual.css') { return ':root { --virtual: red }' }
|
if (id === 'virtual.css') { return ':root { --virtual: red }' }
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
addVitePlugin(plugin.vite())
|
addVitePlugin(() => plugin.vite())
|
||||||
addWebpackPlugin(plugin.webpack())
|
addWebpackPlugin(() => plugin.webpack())
|
||||||
},
|
},
|
||||||
function (_options, nuxt) {
|
function (_options, nuxt) {
|
||||||
const routesToDuplicate = ['/async-parent', '/fixed-keyed-child-parent', '/keyed-child-parent', '/with-layout', '/with-layout2']
|
const routesToDuplicate = ['/async-parent', '/fixed-keyed-child-parent', '/keyed-child-parent', '/with-layout', '/with-layout2']
|
||||||
|
Loading…
Reference in New Issue
Block a user