Guia do Autor de Módulo
Aprenda a criar um Módulo Nuxt para integrar, aprimorar ou estender qualquer aplicação Nuxt.
Os sistemas de configuração e hooks do Nuxt tornam possível personalizar todos os aspectos do Nuxt e adicionar qualquer integração que você possa precisar (plugins Vue, CMS, rotas de servidor, componentes, logging, etc.).
Módulos Nuxt são funções que são executadas sequencialmente ao iniciar o Nuxt no modo de desenvolvimento usando nuxt dev
ou ao construir um projeto para produção com nuxt build
. Com módulos, você pode encapsular, testar adequadamente e compartilhar soluções personalizadas como pacotes npm sem adicionar boilerplate desnecessário ao seu projeto ou exigir alterações no próprio Nuxt.
Início Rápido
Recomendamos que você comece com Módulos Nuxt usando nosso template inicial:
npm create nuxt -- -t module my-module
Isso criará um projeto my-module
com todo o boilerplate necessário para desenvolver e publicar seu módulo.
Próximos passos:
- Abra
my-module
no seu IDE de escolha - Instale as dependências usando seu gerenciador de pacotes favorito
- Prepare os arquivos locais para desenvolvimento usando
npm run dev:prepare
- Siga este documento para aprender mais sobre Módulos Nuxt
Usando o Template Inicial
Aprenda a realizar tarefas básicas com o template inicial do módulo.
Assista ao vídeo da Vue School sobre o template inicial do módulo Nuxt.
Como Desenvolver
Enquanto o código-fonte do seu módulo reside dentro do diretório src
, na maioria dos casos, para desenvolver um módulo, você precisa de uma aplicação Nuxt. É para isso que serve o diretório playground
. É uma aplicação Nuxt com a qual você pode mexer e que já está configurada para rodar com seu módulo.
Você pode interagir com o playground como com qualquer aplicação Nuxt.
- Inicie seu servidor de desenvolvimento com
npm run dev
, ele deve recarregar automaticamente conforme você faz alterações no seu módulo no diretóriosrc
- Construa-o com
npm run dev:build
Todos os outros comandos nuxt
podem ser usados contra o diretório playground
(por exemplo, nuxt <COMMAND> playground
). Sinta-se à vontade para declarar scripts adicionais dev:*
dentro do seu package.json
referenciando-os para conveniência.
Como Testar
O template inicial do módulo vem com um conjunto básico de testes:
- Um linter alimentado por ESLint, execute-o com
npm run lint
- Um executor de testes alimentado por Vitest, execute-o com
npm run test
ounpm run test:watch
Sinta-se à vontade para aumentar essa estratégia de teste padrão para melhor atender às suas necessidades.
Como Construir
Os Módulos Nuxt vêm com seu próprio construtor fornecido por @nuxt/module-builder
. Este construtor não requer nenhuma configuração do seu lado, suporta TypeScript e garante que seus ativos sejam devidamente empacotados para serem distribuídos para outras aplicações Nuxt.
Você pode construir seu módulo executando npm run prepack
.
Embora construir seu módulo possa ser útil em alguns casos, na maioria das vezes você não precisará construí-lo por conta própria: o playground
cuida disso durante o desenvolvimento, e o script de lançamento também cobre isso ao publicar.
Como Publicar
Antes de publicar seu módulo no npm, certifique-se de ter uma conta no npmjs.com e de estar autenticado localmente com npm login
.
Embora você possa publicar seu módulo aumentando sua versão e usando o comando npm publish
, o template inicial do módulo vem com um script de lançamento que ajuda a garantir que você publique uma versão funcional do seu módulo no npm e mais.
Para usar o script de lançamento, primeiro, faça commit de todas as suas alterações (recomendamos que você siga Conventional Commits para também aproveitar o aumento automático de versão e atualização do changelog), então execute o script de lançamento com npm run release
.
Ao executar o script de lançamento, o seguinte acontecerá:
- Primeiro, ele executará seu conjunto de testes por:
- Executar o linter (
npm run lint
) - Executar testes unitários, de integração e e2e (
npm run test
) - Construir o módulo (
npm run prepack
)
- Executar o linter (
- Então, se seu conjunto de testes foi bem, ele procederá para publicar seu módulo por:
- Aumentar a versão do seu módulo e gerar um changelog de acordo com seus Conventional Commits
- Publicar o módulo no npm (para esse propósito, o módulo será construído novamente para garantir que seu número de versão atualizado seja levado em conta no artefato publicado)
- Enviar uma tag git representando a nova versão publicada para sua origem remota git
Como com outros scripts, sinta-se à vontade para ajustar o script release
padrão no seu package.json
para melhor atender às suas necessidades.
Desenvolvendo Módulos
Os Módulos Nuxt vêm com uma variedade de APIs e padrões poderosos que permitem alterar uma aplicação Nuxt de praticamente qualquer maneira possível. Esta seção ensina como aproveitar esses recursos.
Anatomia do Módulo
Podemos considerar dois tipos de Módulos Nuxt:
- módulos publicados são distribuídos no npm - você pode ver uma lista de alguns módulos da comunidade no site do Nuxt.
- módulos "locais", eles existem dentro de um projeto Nuxt em si, seja inseridos na configuração do Nuxt ou como parte do diretório
modules
.
Em ambos os casos, sua anatomia é semelhante.
Definição do Módulo
Ao usar o template inicial, a definição do seu módulo está disponível em src/module.ts
.
A definição do módulo é o ponto de entrada do seu módulo. É o que é carregado pelo Nuxt quando seu módulo é referenciado dentro de uma configuração Nuxt.
Em um nível baixo, uma definição de Módulo Nuxt é uma função simples, potencialmente assíncrona, que aceita opções de usuário inline e um objeto nuxt
para interagir com o Nuxt.
export default function (inlineOptions, nuxt) {
// Você pode fazer o que quiser aqui..
console.log(inlineOptions.token) // `123`
console.log(nuxt.options.dev) // `true` ou `false`
nuxt.hook('ready', async nuxt => {
console.log('Nuxt está pronto')
})
}
Você pode obter suporte a dicas de tipo para esta função usando o helper de nível superior defineNuxtModule
fornecido pelo Nuxt Kit.
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule((options, nuxt) => {
nuxt.hook('pages:extend', pages => {
console.log(`Descobertas ${pages.length} páginas`)
})
})
No entanto, não recomendamos usar esta definição de função de baixo nível. Em vez disso, para definir um módulo, recomendamos usar a sintaxe de objeto com a propriedade meta
para identificar seu módulo, especialmente ao publicar no npm.
Este helper torna a escrita de módulos Nuxt mais direta, implementando muitos padrões comuns necessários por módulos, garantindo compatibilidade futura e melhorando a experiência tanto para autores de módulos quanto para usuários.
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
// Geralmente o nome do pacote npm do seu módulo
name: '@nuxtjs/example',
// A chave em `nuxt.config` que contém as opções do seu módulo
configKey: 'sample',
// Restrições de compatibilidade
compatibility: {
// Versão Semver das versões suportadas do nuxt
nuxt: '>=3.0.0'
}
},
// Opções de configuração padrão para seu módulo, também pode ser uma função que retorna essas opções
defaults: {},
// Açúcar sintático para registrar hooks do Nuxt
hooks: {},
// A função que contém a lógica do seu módulo, pode ser assíncrona
setup(moduleOptions, nuxt) {
// ...
}
})
Em última análise, defineNuxtModule
retorna uma função wrapper com a assinatura de módulo de nível inferior (inlineOptions, nuxt)
. Esta função wrapper aplica padrões e outras etapas necessárias antes de chamar sua função setup
:
- Suporte a
defaults
emeta.configKey
para mesclar automaticamente as opções do módulo - Dicas de tipo e inferência de tipo automatizada
- Adicionar shims para compatibilidade básica com Nuxt 2
- Garantir que o módulo seja instalado apenas uma vez usando uma chave única calculada a partir de
meta.name
oumeta.configKey
- Registrar automaticamente hooks do Nuxt
- Verificar automaticamente problemas de compatibilidade com base nos metadados do módulo
- Expor
getOptions
egetMeta
para uso interno do Nuxt - Garantir compatibilidade retroativa e progressiva enquanto o módulo estiver usando
defineNuxtModule
da versão mais recente de@nuxt/kit
- Integração com ferramentas de construção de módulos
Diretório de Runtime
Ao usar o template inicial, o diretório de runtime está disponível em src/runtime
.
Módulos, como tudo em uma configuração Nuxt, não são incluídos no runtime da sua aplicação. No entanto, você pode querer que seu módulo forneça ou injete código de runtime na aplicação em que está instalado. É para isso que o diretório de runtime permite que você faça.
Dentro do diretório de runtime, você pode fornecer qualquer tipo de ativo relacionado ao App Nuxt:
- Componentes Vue
- Composables
- Plugins Nuxt
Para o motor de servidor, Nitro:
- Rotas de API
- Middlewares
- Plugins Nitro
Ou qualquer outro tipo de ativo que você queira injetar nas aplicações Nuxt dos usuários:
- Folhas de estilo
- Modelos 3D
- Imagens
- etc.
Você poderá então injetar todos esses ativos dentro da aplicação a partir da sua definição de módulo.
Saiba mais sobre injeção de ativos na seção de receitas.
Módulos publicados não podem aproveitar as importações automáticas para ativos dentro de seu diretório de runtime. Em vez disso, eles devem importá-los explicitamente de #imports
ou similar.
:br :br
De fato, as importações automáticas não estão habilitadas para arquivos dentro de node_modules
(o local onde um módulo publicado eventualmente residirá) por razões de desempenho.
Ferramentas
Os módulos vêm com um conjunto de ferramentas de primeira linha para ajudá-lo em seu desenvolvimento.
@nuxt/module-builder
Nuxt Module Builder é uma ferramenta de construção sem configuração que cuida de todo o trabalho pesado para construir e enviar seu módulo. Ele garante a compatibilidade adequada do artefato de construção do seu módulo com aplicações Nuxt.
@nuxt/kit
Nuxt Kit fornece utilitários compostos para ajudar seu módulo a interagir com aplicações Nuxt. É recomendado usar os utilitários do Nuxt Kit em vez de alternativas manuais sempre que possível para garantir melhor compatibilidade e legibilidade do código do seu módulo.
Veja também guide > going-further > kit@nuxt/test-utils
Nuxt Test Utils é uma coleção de utilitários para ajudar a configurar e executar aplicações Nuxt dentro dos testes do seu módulo.
Receitas
Encontre aqui padrões comuns usados para criar módulos.
Alterando a Configuração do Nuxt
A configuração do Nuxt pode ser lida e alterada por módulos. Aqui está um exemplo de um módulo que habilita um recurso experimental.
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
// Criamos o objeto `experimental` se ele ainda não existir
nuxt.options.experimental ||= {}
nuxt.options.experimental.componentIslands = true
}
})
Quando você precisar lidar com alterações de configuração mais complexas, deve considerar usar defu.
Assista ao vídeo da Vue School sobre como alterar a configuração do Nuxt.
Expondo Opções para o Runtime
Como os módulos não fazem parte do runtime da aplicação, suas opções também não. No entanto, em muitos casos, você pode precisar acessar algumas dessas opções de módulo dentro do seu código de runtime. Recomendamos expor a configuração necessária usando o runtimeConfig
do Nuxt.
import { defineNuxtModule } from '@nuxt/kit'
import { defu } from 'defu'
export default defineNuxtModule({
setup (options, nuxt) {
nuxt.options.runtimeConfig.public.myModule = defu(nuxt.options.runtimeConfig.public.myModule, {
foo: options.foo
})
}
})
Observe que usamos defu
para estender a configuração de runtime pública fornecida pelo usuário em vez de sobrescrevê-la.
Você pode então acessar suas opções de módulo em um plugin, componente, na aplicação como qualquer outra configuração de runtime:
const options = useRuntimeConfig().public.myModule
Tenha cuidado para não expor nenhuma configuração sensível do módulo na configuração de runtime pública, como chaves de API privadas, pois elas acabarão no pacote público.
Assista ao vídeo da Vue School sobre como passar e expor opções de módulo Nuxt.
Injetando Plugins Com addPlugin
Plugins são uma maneira comum para um módulo adicionar lógica de runtime. Você pode usar o utilitário addPlugin
para registrá-los a partir do seu módulo.
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
// Criar resolver para resolver caminhos relativos
const resolver = createResolver(import.meta.url)
addPlugin(resolver.resolve('./runtime/plugin'))
}
})
Veja também guide > going-further > kit
Injetando Componentes Vue Com addComponent
Se seu módulo deve fornecer componentes Vue, você pode usar o utilitário addComponent
para adicioná-los como importações automáticas para o Nuxt resolver.
import { defineNuxtModule, addComponent } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
// Do diretório de runtime
addComponent({
name: 'MySuperComponent', // nome do componente a ser usado em templates vue
export: 'MySuperComponent', // (opcional) se o componente for uma exportação nomeada (em vez de padrão)
filePath: resolver.resolve('runtime/components/MySuperComponent.vue')
})
// De uma biblioteca
addComponent({
name: 'MyAwesomeComponent', // nome do componente a ser usado em templates vue
export: 'MyAwesomeComponent', // (opcional) se o componente for uma exportação nomeada (em vez de padrão)
filePath: '@vue/awesome-components'
})
}
})
Alternativamente, você pode adicionar um diretório inteiro usando addComponentsDir
.
import { defineNuxtModule, addComponentsDir } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
addComponentsDir({
path: resolver.resolve('runtime/components')
})
}
})
Injetando Composables Com addImports
e addImportsDir
Se seu módulo deve fornecer composables, você pode usar o utilitário addImports
para adicioná-los como importações automáticas para o Nuxt resolver.
import { defineNuxtModule, addImports, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
addImports({
name: 'useComposable', // nome do composable a ser usado
as: 'useComposable',
from: resolver.resolve('runtime/composables/useComposable') // caminho do composable
})
}
})
Alternativamente, você pode adicionar um diretório inteiro usando addImportsDir
.
import { defineNuxtModule, addImportsDir, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
addImportsDir(resolver.resolve('runtime/composables'))
}
})
Injetando Rotas de Servidor Com addServerHandler
import { defineNuxtModule, addServerHandler, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
addServerHandler({
route: '/api/hello',
handler: resolver.resolve('./runtime/server/api/hello/index.get')
})
}
})
Você também pode adicionar uma rota de servidor dinâmica:
import { defineNuxtModule, addServerHandler, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
addServerHandler({
route: '/api/hello/:name',
handler: resolver.resolve('./runtime/server/api/hello/[name].get')
})
}
})
Injetando Outros Ativos
Se seu módulo deve fornecer outros tipos de ativos, eles também podem ser injetados. Aqui está um exemplo simples de módulo injetando uma folha de estilo através do array css
do Nuxt.
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.options.css.push(resolver.resolve('./runtime/style.css'))
}
})
E um mais avançado, expondo uma pasta de ativos através da opção publicAssets
do Nitro:
import { defineNuxtModule, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.hook('nitro:config', async (nitroConfig) => {
nitroConfig.publicAssets ||= []
nitroConfig.publicAssets.push({
dir: resolver.resolve('./runtime/public'),
maxAge: 60 * 60 * 24 * 365 // 1 ano
})
})
}
})
Usando Outros Módulos no Seu Módulo
Se seu módulo depende de outros módulos, você pode adicioná-los usando o utilitário installModule
do Nuxt Kit. Por exemplo, se você quiser usar o Nuxt Tailwind no seu módulo, você poderia adicioná-lo como abaixo:
import { defineNuxtModule, createResolver, installModule } from '@nuxt/kit'
export default defineNuxtModule<ModuleOptions>({
async setup (options, nuxt) {
const resolver = createResolver(import.meta.url)
// Podemos injetar nosso arquivo CSS que inclui as diretivas do Tailwind
nuxt.options.css.push(resolver.resolve('./runtime/assets/styles.css'))
await installModule('@nuxtjs/tailwindcss', {
// configuração do módulo
exposeConfig: true,
config: {
darkMode: 'class',
content: {
files: [
resolver.resolve('./runtime/components/**/*.{vue,mjs,ts}'),
resolver.resolve('./runtime/*.{mjs,js,ts}')
]
}
}
})
}
})
Usando Hooks
Hooks de ciclo de vida permitem que você expanda quase todos os aspectos do Nuxt. Os módulos podem se conectar a eles programaticamente ou através do mapa hooks
em sua definição.
import { defineNuxtModule, addPlugin, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
// Conectar ao hook `app:error` através do mapa `hooks`
hooks: {
'app:error': (err) => {
console.info(`Este erro ocorreu: ${err}`);
}
},
setup (options, nuxt) {
// Conectar programaticamente ao hook `pages:extend`
nuxt.hook('pages:extend', (pages) => {
console.info(`Descobertas ${pages.length} páginas`);
})
}
})
Veja também api > advanced > hooks
Assista ao vídeo da Vue School sobre como usar hooks de ciclo de vida do Nuxt em módulos.
Limpeza do Módulo
:br
:br
Se seu módulo abrir, manipular ou iniciar um observador, você deve fechá-lo quando o ciclo de vida do Nuxt estiver concluído. O hook close
está disponível para isso.
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
nuxt.hook('close', async nuxt => {
// Seu código personalizado aqui
})
}
})
Adicionando Templates/Arquivos Virtuais
Se você precisar adicionar um arquivo virtual que possa ser importado no aplicativo do usuário, você pode usar o utilitário addTemplate
.
import { defineNuxtModule, addTemplate } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
// O arquivo é adicionado ao sistema de arquivos virtual interno do Nuxt e pode ser importado de '#build/my-module-feature.mjs'
addTemplate({
filename: 'my-module-feature.mjs',
getContents: () => 'export const myModuleFeature = () => "hello world !"'
})
}
})
Para o servidor, você deve usar o utilitário addServerTemplate
.
import { defineNuxtModule, addServerTemplate } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
// O arquivo é adicionado ao sistema de arquivos virtual do Nitro e pode ser importado no código do servidor de 'my-server-module.mjs'
addServerTemplate({
filename: 'my-server-module.mjs',
getContents: () => 'export const myServerModule = () => "hello world !"'
})
}
})
Adicionando Declarações de Tipo
Você também pode querer adicionar uma declaração de tipo ao projeto do usuário (por exemplo, para aumentar uma interface Nuxt ou fornecer um tipo global próprio). Para isso, o Nuxt fornece o utilitário addTypeTemplate
que tanto escreve um template no disco quanto adiciona uma referência a ele no arquivo nuxt.d.ts
gerado.
Se seu módulo deve aumentar tipos manipulados pelo Nuxt, você pode usar addTypeTemplate
para realizar essa operação:
import { defineNuxtModule, addTemplate, addTypeTemplate } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
addTypeTemplate({
filename: 'types/my-module.d.ts',
getContents: () => `// Gerado por my-module
interface MyModuleNitroRules {
myModule?: { foo: 'bar' }
}
declare module 'nitropack' {
interface NitroRouteRules extends MyModuleNitroRules {}
interface NitroRouteConfig extends MyModuleNitroRules {}
}
export {}`
})
}
})
Se você precisar de controle mais granular, pode usar o hook prepare:types
para registrar um callback que injetará seus tipos.
const template = addTemplate({ /* opções de template */ })
nuxt.hook('prepare:types', ({ references }) => {
references.push({ path: template.dst })
})
Atualizando Templates
Se você precisar atualizar seus templates/arquivos virtuais, pode aproveitar o utilitário updateTemplates
assim:
nuxt.hook('builder:watch', async (event, path) => {
if (path.includes('my-module-feature.config')) {
// Isso recarregará o template que você registrou
updateTemplates({ filter: t => t.filename === 'my-module-feature.mjs' })
}
})
Testando
Testar ajuda a garantir que seu módulo funcione como esperado em várias configurações. Encontre nesta seção como realizar vários tipos de testes contra seu módulo.
Unitário e de Integração
Ainda estamos discutindo e explorando como facilitar o teste unitário e de integração em Módulos Nuxt. :br :br Confira este RFC para participar da conversa.
End to End
Nuxt Test Utils é a biblioteca ideal para ajudá-lo a testar seu módulo de forma end-to-end. Aqui está o fluxo de trabalho a adotar com ele:
- Crie uma aplicação Nuxt para ser usada como "fixture" dentro de
test/fixtures/*
- Configure o Nuxt com este fixture dentro do seu arquivo de teste
- Interaja com o fixture usando utilitários de
@nuxt/test-utils
(por exemplo, buscando uma página) - Realize verificações relacionadas a este fixture (por exemplo, "HTML contém ...")
- Repita
Na prática, o fixture:
// 1. Crie uma aplicação Nuxt para ser usada como "fixture"
import MyModule from '../../../src/module'
export default defineNuxtConfig({
ssr: true,
modules: [
MyModule
]
})
E seu teste:
import { describe, it, expect } from 'vitest'
import { fileURLToPath } from 'node:url'
import { setup, $fetch } from '@nuxt/test-utils/e2e'
describe('ssr', async () => {
// 2. Configure o Nuxt com este fixture dentro do seu arquivo de teste
await setup({
rootDir: fileURLToPath(new URL('./fixtures/ssr', import.meta.url)),
})
it('renderiza a página de índice', async () => {
// 3. Interaja com o fixture usando utilitários de `@nuxt/test-utils`
const html = await $fetch('/')
// 4. Realize verificações relacionadas a este fixture
expect(html).toContain('<div>ssr</div>')
})
})
// 5. Repita
describe('csr', async () => { /* ... */ })
Um exemplo de tal fluxo de trabalho está disponível no template inicial do módulo.
QA Manual Com Playground e Externamente
Ter uma aplicação playground Nuxt para testar seu módulo ao desenvolvê-lo é realmente útil. O template inicial do módulo integra um para esse propósito.
Você pode testar seu módulo com outras aplicações Nuxt (aplicações que não fazem parte do repositório do seu módulo) localmente. Para fazer isso, você pode usar o comando npm pack
, ou o equivalente do seu gerenciador de pacotes, para criar um tarball do seu módulo. Em seguida, em seu projeto de teste, você pode adicionar seu módulo aos pacotes package.json
como: "my-module": "file:/path/to/tarball.tgz"
.
Depois disso, você deve ser capaz de referenciar my-module
como em qualquer projeto regular.
Melhores Práticas
Com grande poder vem grande responsabilidade. Embora os módulos sejam poderosos, aqui estão algumas melhores práticas a serem lembradas ao criar módulos para manter as aplicações performáticas e a experiência do desenvolvedor excelente.
Módulos Assíncronos
Como vimos, os Módulos Nuxt podem ser assíncronos. Por exemplo, você pode querer desenvolver um módulo que precise buscar alguma API ou chamar uma função assíncrona.
No entanto, tenha cuidado com comportamentos assíncronos, pois o Nuxt aguardará seu módulo configurar antes de passar para o próximo módulo e iniciar o servidor de desenvolvimento, processo de construção, etc. Prefira adiar a lógica demorada para hooks do Nuxt.
Se seu módulo levar mais de 1 segundo para configurar, o Nuxt emitirá um aviso sobre isso.
Sempre Prefixe Interfaces Expostas
Os Módulos Nuxt devem fornecer um prefixo explícito para qualquer configuração exposta, plugin, API, composable ou componente para evitar conflitos com outros módulos e internos.
Idealmente, você deve prefixá-los com o nome do seu módulo (por exemplo, se seu módulo se chama nuxt-foo
, exponha <FooButton>
e useFooBar()
e não <Button>
e useBar()
).
Seja Amigável ao TypeScript
O Nuxt tem integração de primeira classe com TypeScript para a melhor experiência do desenvolvedor.
Expor tipos e usar TypeScript para desenvolver módulos beneficia os usuários mesmo quando não estão usando TypeScript diretamente.
Evite Sintaxe CommonJS
O Nuxt depende de ESM nativo. Por favor, leia Módulos ES Nativos para mais informações.
Documente o Uso do Módulo
Considere documentar o uso do módulo no arquivo readme:
- Por que usar este módulo?
- Como usar este módulo?
- O que este módulo faz?
Linkar para o site de integração e documentação é sempre uma boa ideia.
Forneça uma Demonstração ou Boilerplate no StackBlitz
É uma boa prática fazer uma reprodução mínima com seu módulo e StackBlitz que você adiciona ao seu readme do módulo.
Isso não apenas fornece aos potenciais usuários do seu módulo uma maneira rápida e fácil de experimentar o módulo, mas também uma maneira fácil para eles construírem reproduções mínimas que podem enviar para você quando encontrarem problemas.
Não Anuncie Com uma Versão Específica do Nuxt
O Nuxt, Nuxt Kit e outras novas ferramentas são feitas para ter compatibilidade tanto para frente quanto para trás em mente.
Por favor, use "X para Nuxt" em vez de "X para Nuxt 3" para evitar fragmentação no ecossistema e prefira usar meta.compatibility
para definir restrições de versão do Nuxt.
Mantenha-se Com os Padrões do Template Inicial
O template inicial do módulo vem com um conjunto padrão de ferramentas e configurações (por exemplo, configuração do ESLint). Se você planeja abrir o código do seu módulo, manter esses padrões garante que seu módulo compartilhe um estilo de codificação consistente com outros módulos da comunidade por aí, facilitando para outros contribuírem.
Ecossistema
O ecossistema de Módulos Nuxt representa mais de 15 milhões de downloads mensais no NPM e fornece funcionalidades e integrações estendidas com todos os tipos de ferramentas. Você pode fazer parte deste ecossistema!
Assista ao vídeo da Vue School sobre tipos de módulos Nuxt.
Tipos de Módulos
Módulos oficiais são módulos prefixados (escopados) com @nuxt/
(por exemplo, @nuxt/content
). Eles são feitos e mantidos ativamente pela equipe Nuxt. Assim como com o framework, contribuições da comunidade são mais do que bem-vindas para ajudar a torná-los melhores!
Módulos da comunidade são módulos prefixados (escopados) com @nuxtjs/
(por exemplo, @nuxtjs/tailwindcss
). Eles são módulos comprovados feitos e mantidos por membros da comunidade. Novamente, contribuições são bem-vindas de qualquer pessoa.
Módulos de terceiros e outros módulos da comunidade são módulos (frequentemente) prefixados com nuxt-
. Qualquer pessoa pode fazê-los, usar este prefixo permite que esses módulos sejam descobertos no npm. Este é o melhor ponto de partida para esboçar e tentar uma ideia!
Módulos privados ou pessoais são módulos feitos para seu próprio caso de uso ou empresa. Eles não precisam seguir nenhuma regra de nomenclatura para funcionar com o Nuxt e são frequentemente vistos escopados sob uma organização npm (por exemplo, @my-company/nuxt-auth
)
Listando Seu Módulo da Comunidade
Qualquer módulo da comunidade é bem-vindo para ser listado na lista de módulos. Para ser listado, abra uma issue no repositório nuxt/modules. A equipe Nuxt pode ajudá-lo a aplicar as melhores práticas antes de listar.
Juntando-se a nuxt-modules
e @nuxtjs/
Ao mover seus módulos para nuxt-modules, sempre há alguém para ajudar, e dessa forma, podemos unir forças para fazer uma solução perfeita.
Se você tem um módulo já publicado e funcionando, e deseja transferi-lo para nuxt-modules
, abra uma issue no nuxt/modules.
Ao se juntar a nuxt-modules
, podemos renomear seu módulo da comunidade sob o escopo @nuxtjs/
e fornecer um subdomínio (por exemplo, my-module.nuxtjs.org
) para sua documentação.
※Esta página é uma tradução não oficial da documentação oficial do Nuxt.js.
A página correspondente na documentação oficial está aqui:
https://nuxt.com/docs/3.x/guide/going-further/modules