From harness-claude
Creates Nuxt modules with defineNuxtModule to extend apps at build time, adding components, imports, plugins, server routes, and Nitro/Vite configs programmatically. For reusable integrations.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Extend Nuxt at build time with defineNuxtModule — add components, imports, plugins, and server routes programmatically
Develops Nuxt modules including published npm packages, local project modules, runtime/server extensions, with defineNuxtModule patterns, Kit utilities, hooks, E2E testing, publishing, and CI/CD workflows.
Build and ship Nuxt modules with @nuxt/module-builder. Scaffolds projects, sets unbuild presets, generates types/shims, transforms src/runtime/ to dist/runtime/. Use for module creation/maintenance.
Guides Nuxt 3 auto-imports for composables, components, and utilities, enabling zero import statements. Covers directories, config, disabling, naming, and troubleshooting.
Share bugs, ideas, or general feedback.
Extend Nuxt at build time with defineNuxtModule — add components, imports, plugins, and server routes programmatically
defineNuxtModule from @nuxt/kit:// modules/my-feature/index.ts
import { defineNuxtModule, addComponent, addImports, createResolver } from '@nuxt/kit';
export default defineNuxtModule({
meta: {
name: 'my-feature',
configKey: 'myFeature',
},
defaults: {
enabled: true,
prefix: 'My',
},
setup(options, nuxt) {
if (!options.enabled) return;
const { resolve } = createResolver(import.meta.url);
// Register a component
addComponent({
name: `${options.prefix}Button`,
filePath: resolve('./runtime/components/Button.vue'),
});
// Register a composable
addImports({
name: 'useMyFeature',
as: 'useMyFeature',
from: resolve('./runtime/composables/useMyFeature'),
});
},
});
nuxt.config.ts:export default defineNuxtConfig({
modules: ['./modules/my-feature'],
myFeature: {
prefix: 'Acme',
},
});
addPlugin:import { addPlugin, createResolver } from '@nuxt/kit'
setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url)
addPlugin(resolve('./runtime/plugin'))
}
setup(options, nuxt) {
nuxt.hook('nitro:config', (nitroConfig) => {
nitroConfig.handlers = nitroConfig.handlers || []
nitroConfig.handlers.push({
route: '/api/my-feature',
handler: resolve('./runtime/server/api/my-feature')
})
})
}
setup(options, nuxt) {
nuxt.hook('vite:extendConfig', (viteConfig) => {
viteConfig.plugins = viteConfig.plugins || []
viteConfig.plugins.push(myVitePlugin())
})
}
import { addTypeTemplate } from '@nuxt/kit'
setup(options, nuxt) {
addTypeTemplate({
filename: 'types/my-feature.d.ts',
getContents: () => `
declare module '#app' {
interface NuxtApp {
$myFeature: MyFeatureClient
}
}
export {}
`
})
}
nuxt.options.runtimeConfig to expose module options to runtime:setup(options, nuxt) {
nuxt.options.runtimeConfig.public.myFeature = {
apiUrl: options.apiUrl
}
}
Module vs. plugin:
Modules run at build time inside the Nuxt CLI process. Plugins run at runtime inside the Vite/Nitro bundle. Use modules when you need to modify the build, add files, or configure other build tools. Use plugins for runtime behavior.
@nuxt/kit utilities reference:
| Utility | Purpose |
|---|---|
addComponent | Register a Vue component with auto-import |
addImports | Register a composable or utility with auto-import |
addPlugin | Add a runtime Nuxt plugin |
addServerHandler | Register a Nitro route handler |
addTemplate | Generate a virtual file in .nuxt/ |
addTypeTemplate | Generate a .d.ts declaration file |
createResolver | Resolve file paths relative to the module |
installModule | Install another Nuxt module from within a module |
Module hooks:
Nuxt exposes lifecycle hooks that modules can tap into:
nuxt:ready — all modules have loadednitro:config — before Nitro is builtvite:extendConfig — before Vite is builtcomponents:dirs — extend component scan directoriesimports:dirs — extend auto-import scan directoriespages:extend — add or modify pages programmaticallyPublishing as a package:
Follow the nuxt-module-builder convention for publishable modules. The @nuxt/module-builder CLI scaffolds the correct build config and exports.
Local modules in monorepos:
For workspace-internal modules, use a relative path in modules:
modules: ['../../packages/ui/nuxt.ts'];
When NOT to use:
nuxt.config.ts directlyhttps://nuxt.com/docs/guide/going-further/modules