From 67d38a50f6dddc099f3eee0f5161569535dbcc81 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 4 Nov 2025 12:12:09 +0000 Subject: [PATCH] perf: use `moduleDependencies` to install mdc module --- src/module.ts | 85 ++++++++++++++++++++++++++++++++---------------- src/utils/mdc.ts | 30 +++-------------- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/module.ts b/src/module.ts index 7349aac4f..6f50b15e5 100644 --- a/src/module.ts +++ b/src/module.ts @@ -28,7 +28,7 @@ import type { ModuleOptions } from './types/module' import { getContentChecksum, logger, chunks, NuxtContentHMRUnplugin } from './utils/dev' import { loadContentConfig } from './utils/config' import { createParser } from './utils/content' -import { installMDCModule } from './utils/mdc' +import { configureMDCModule } from './utils/mdc' import { findPreset } from './presets' import type { Manifest } from './types/manifest' import { setupPreview, setupPreviewWithAPI, shouldEnablePreview } from './utils/preview/module' @@ -41,40 +41,69 @@ import { initiateValidatorsContext } from './utils/dependencies' export * from './utils' export type * from './types' +const moduleDefaults: Partial = { + _localDatabase: { + type: 'sqlite', + filename: '.data/content/contents.sqlite', + }, + preview: {}, + watch: { enabled: true }, + renderer: { + alias: {}, + anchorLinks: { + h2: true, + h3: true, + h4: true, + }, + }, + build: { + pathMeta: {}, + markdown: {}, + yaml: {}, + csv: { + delimiter: ',', + json: true, + }, + }, + experimental: { + nativeSqlite: false, + }, +} + export default defineNuxtModule({ meta: { name: '@nuxt/content', configKey: 'content', version, + compatibility: { + nuxt: '>=4.1.0 || ^3.19.0', + }, docs: 'https://content.nuxt.com', }, - defaults: { - _localDatabase: { - type: 'sqlite', - filename: '.data/content/contents.sqlite', - }, - preview: {}, - watch: { enabled: true }, - renderer: { - alias: {}, - anchorLinks: { - h2: true, - h3: true, - h4: true, - }, - }, - build: { - pathMeta: {}, - markdown: {}, - yaml: {}, - csv: { - delimiter: ',', - json: true, + defaults: moduleDefaults, + moduleDependencies(nuxt) { + const nuxtOptions = nuxt.options as unknown as { content: ModuleOptions } + const contentOptions = defu(nuxtOptions.content, moduleDefaults) + + return { + '@nuxtjs/mdc': { + overrides: { + highlight: contentOptions.build?.markdown?.highlight, + components: { + prose: true, + map: contentOptions.renderer.alias, + }, + headings: { + anchorLinks: contentOptions.renderer.anchorLinks, + }, + remarkPlugins: contentOptions.build?.markdown?.remarkPlugins, + rehypePlugins: contentOptions.build?.markdown?.rehypePlugins, + }, + defaults: { + highlight: { noApiRoute: true }, + }, }, - }, - experimental: { - nativeSqlite: false, - }, + } }, async setup(options, nuxt) { const resolver = createResolver(import.meta.url) @@ -184,7 +213,7 @@ export default defineNuxtModule({ installModule(resolver.resolve('./features/llms')) } - await installMDCModule(options, nuxt) + await configureMDCModule(options, nuxt) nuxt.hook('modules:done', async () => { const preset = findPreset(nuxt) diff --git a/src/utils/mdc.ts b/src/utils/mdc.ts index 19a9b88dc..ceb1ce251 100644 --- a/src/utils/mdc.ts +++ b/src/utils/mdc.ts @@ -1,33 +1,13 @@ -import type { ModuleOptions as MDCModuleOptions, MdcConfig } from '@nuxtjs/mdc' -import { defu } from 'defu' +import type { MdcConfig } from '@nuxtjs/mdc' import type { Nuxt } from '@nuxt/schema' -import { extendViteConfig, installModule } from '@nuxt/kit' +import { extendViteConfig } from '@nuxt/kit' import { createJiti } from 'jiti' import type { ModuleOptions } from '../types' import { setParserOptions } from './content' -export async function installMDCModule(contentOptions: ModuleOptions, nuxt: Nuxt) { - const options = nuxt.options as unknown as { mdc: MDCModuleOptions } - // Install mdc module - const highlight = contentOptions.build?.markdown?.highlight as unknown as MDCModuleOptions['highlight'] - - options.mdc = defu({ - highlight: highlight !== false - ? { ...highlight, noApiRoute: (options.mdc?.highlight as { noApiRoute: boolean })?.noApiRoute ?? true } - : highlight, - components: { - prose: true, - map: contentOptions.renderer.alias, - }, - headings: { - anchorLinks: contentOptions.renderer.anchorLinks, - }, - remarkPlugins: contentOptions.build?.markdown?.remarkPlugins, - rehypePlugins: contentOptions.build?.markdown?.rehypePlugins, - }, options.mdc) as MDCModuleOptions - +export async function configureMDCModule(contentOptions: ModuleOptions, nuxt: Nuxt) { // Hook into mdc configs and store them for parser - await nuxt.hook('mdc:configSources', async (mdcConfigs) => { + nuxt.hook('mdc:configSources', async (mdcConfigs) => { if (mdcConfigs.length) { const jiti = createJiti(nuxt.options.rootDir) const configs = await Promise.all(mdcConfigs.map(path => jiti.import(path).then(m => (m as { default: MdcConfig }).default || m))) @@ -38,8 +18,6 @@ export async function installMDCModule(contentOptions: ModuleOptions, nuxt: Nuxt } }) - await installModule('@nuxtjs/mdc') - // Update mdc optimizeDeps options extendViteConfig((config) => { config.optimizeDeps ||= {}