Uma quantidade decente de material está disponível na gravação da API em node.js. A maioria deles está na forma de tutoriais e demonstrações na documentação. Isso é suficiente para descobrir e escrever rapidamente algo próprio. Mas eles raramente encontram detalhes de por que isso é feito dessa maneira. E alguns pontos são omitidos por simplicidade e brevidade.Este artigo pretende preencher algumas lacunas que possam surgir e, finalmente, melhorar seu serviço no node.js.PS Em nenhum caso me considero um especialista: há espaço para crescer. Mas, ao mesmo tempo, há algo a compartilhar.Estrutura do arquivo do projeto
A estrutura do arquivo é uma coisa básica, mas muito importante. Ao criá-lo, vale a pena considerar a possibilidade de dimensionar o serviço; por esse motivo, não vale a pena colocar arquivos na estrutura plana de um diretório. Precisa de uma hierarquia, precisa de modularidade.Ao nomear diretórios, você deve aderir aos padrões estabelecidos. Isso ajudará os colegas e em alguns meses a descobrir rapidamente onde e o que está localizado.Exemplo de estrutura de arquivosrc/
controllers/
users/
index.js
index.js
db/
mongo/
index.js
index.js
helpers/
middlewares/
auth.js
models/
users.js
routes/
users/
index.js
index.js
index.js
.eslintrc
.gitignore
README.md
...
package.json
Notas:- Todos os arquivos executáveis devem estar localizados em ./src.
Isso permitirá que você separe os arquivos de origem do datilografado ou babel compilado, que estará localizado em ./dist ou ./build.
Isso também facilitará a configuração de linters e outras ferramentas configuráveis, pois os arquivos de destino estão localizados em um diretório separado.
Coloque todas as entidades dos controladores e rotas em diretórios separados, o que permite abrir ./routes ou ./controller para ver apenas um arquivo index.js importando e exportando entidades de subdiretório.
Isso permitirá que você navegue rapidamente pela funcionalidade existente, pois ela descreve apenas a interface de controladores ou roteadores sem se aprofundar na implementação.
Sobre a compilação Javascript
Obviamente, você não pode usar babel ou typescript para converter seu javascript. Como regra, os novos padrões ECMAScript acabam rapidamente no node.js, e você, com exceção do javascript baseado no navegador, pode controlar seu suporte.Mas estou convencido de que vale a pena usar. E é por causa disso:- A versão mais recente do Node.js nem sempre está disponível para produção.
- O Node.js (v. 13) ainda tem problemas com o suporte aos módulos do ECMAScript, embora eles apareçam e deixem o sinalizador, eles ainda são experimentais. Vender cedo.
Considere adicionar babel ao projeto:Instale as dependências:npm install @babel/core @babel/node @babel/preset-env --save-dev
Adicione o arquivo de configuração .babelrc à raiz do projeto{
"presets": [
"@babel/preset-env"
]
}
Exemplo de Execução de Script"start": "nodemon --exec babel-node src/index.js",
Notas:- Ao instalar dependências, não esqueça de colocar a opção --save-dev (-D) apenas durante a fase de desenvolvimento. É necessário pelo menos para semântica.
Sobre a necessidade de linter
Vamos começar com o fato óbvio: linters são necessários. Nós escrevemos código, muito código. Muito disso, eles próprios não são capazes de controlar sua uniformidade. Este item é incrivelmente aprimorado no desenvolvimento da equipe.E a uniformidade é a chave para a legibilidade do código.A questão permanece sobre o rigor do linter. A escolha de qual deve ser baseada no tamanho da equipe, seu nível profissional, um critério importante é o próprio projeto.Adicionando um linter simples ao projetoVamos instalar as dependências:npm install eslint --save-dev
Adicione o arquivo de configuração .eslintrc à raiz do projeto:{
"env": {
"node": true,
"es6": true,
},
"extends": "eslint:recommended"
}
Como regra, essa configuração não é suficiente. Aqui você pode expandir as regras ou dar uma olhada nas opções mais rigorosas preparadas. ,
...
"extends": "eslint:recommended",
"rules": {
"quotes": ["error", "single"]
}
}
Usando um linter mais rígidoExistem várias configurações populares baseadas nos mesmos guias de estilo.- Google
npm install --save-dev eslint-config-google
- Airbnb
npm install --save-dev eslint-config-airbnb-base eslint-plugin-import
- Idiomatic
npm install --save-dev eslint-config-idiomatic
Assim, será necessário corrigir .eslintrc{
"env": {
"node": true,
"es6": true,
},
"extends": "google" | "airbnb-base" | "idiomatic"
}
Também é necessário adicionar o lançamento do linter a um script separado."lint": "eslint ./src --cache && echo \"eslint: no lint errors\"",
"lint:fix": "eslint ./src --fix && echo \"eslint: no lint errors\""
Sobre o lançamento do aplicativo
Qualquer pessoa que tenha acesso ao repositório do projeto deve poder executá-lo. Se ele pode fazer isso e quanto tempo levará para ele fazer isso é um dos critérios de qualidade do seu projeto.É importante documentar antecipadamente como iniciar o serviço passo a passo no arquivo README.md, bem como prescrever comandos para as principais ações."start": "npm run dev",
"dev": "nodemon --exec babel-node ./src/index.js",
"build": "babel ./src --out-dir ./build",
"prod": "NODE_ENV=production node ./build/index.js",
"lint": "eslint ./src --cache && echo \"eslint: no lint errors\"",
Para usar os comandos acima, pode ser necessário instalar os seguintes pacotes:npm install --save-dev @babel/cli nodemon babel-node
Nota:- Se você adicionou os comandos básicos ao package.json, ainda descreva o processo de inicialização no README.md.
Conclusão
Inicialmente, o artigo queria cobrir muito mais recomendações sobre como escrever uma API no node.js, mas quero caber em 3-5 minutos. lendo o artigo. Sujeito a um bom feedback, uma sequência será lançada.