Aprenda Node.js construindo uma estrutura de back -end - Velocy

Você pode acessar a versão atual do livro no diretório dos capítulos ou no formato PDF (os modos claros e escuros estão disponíveis) clicando aqui. Observe que esta versão inclui a versão atual do conteúdo e não é a versão final.
Este livro ainda está em um estágio muito inicial. Ele contém uma parte insignificante do conteúdo total que o livro deve cobrir. Haverá 0 dependências para nossa estrutura de back -end, bem como para a nossa biblioteca de madeira. Tudo será feito usando o Vanilla Node.js, The Hard-Way (a melhor maneira de aprender).
Observação
Se você não estiver familiarizado com o JavaScript, também pode conferir meu outro repositório - aprenda JavaScript - a maneira mais fácil que o leva a uma jornada profunda e divertida para o JavaScript - do básico aos conceitos avançados de que você precisaria, sem mergulhar em muita teoria. Apenas exemplos de código prático.
Para dominar um novo conceito, geralmente é melhor começar do zero. Este não é apenas mais um guia Node.js; É uma experiência abrangente e de código, destinada a construir um produto do mundo real que pode ser usado por milhares de desenvolvedores. O produto que vamos construir será uma estrutura de back -end, que também do zero.
Você não aprenderá como o Node.js funciona, mas também por que ele opera de uma maneira específica. O guia também inclui discussões sobre estruturas de dados relevantes e padrões de design.
O livro também inclui uma ampla gama de exercícios criados especificamente para desafiá -lo, que pode exigir comprometimento e esforço consistente de sua parte. Os primeiros exercícios começam no capítulo 7
Este guia vai além do básico. Estamos focados em fornecer uma estrutura de back-end modular e otimizada que esteja perto de estar pronta para a produção. Tópicos como otimização de desempenho, medidas de segurança e várias abordagens de teste serão abordadas para garantir que a estrutura seja confiável e extensível.
Eu recomendo codificar ativamente ao lado deste guia, em vez de apenas lê -lo, para um entendimento completo do Node.js e seus aspectos mais complexos.
O repo para nossa estrutura de back-end- velocy. (WIP)

Índice
- (Opcional) Node.js é muito mais rápido do que você pensa
- Condutores para o teste
- Elysia - Bun
- Axum - ferrugem
- Express - node.js
- Velocy - Node.js
- O benchmark
- Código -fonte
- Elysia - Bun
- Axum - ferrugem
- Express - node.js
- Velocy - Node.js
- Resultados - Benchmark típico
- Resultado: Elysia - Bun/Zig (149.047 REQ/S)
- Resultado: Axum - Rust (208.938 REQ/S)
- Resultado: Express - Node.js (28.923 Req/s)
- Resultado: Velocy - Node.js (83.689)
- Gráficos
- Latência
- Solicitações/Sec
- Memória ociosa
- Memória sob carga constante
- Veredicto - Benchmark típico
- A verdadeira referência
- Atualizando nosso código
- ELYSIA
- Expressar
- Velocy
- Resultados-um caso de uso do mundo real
- Resultado: Express - Nó (50.275 Req/s)
- Resultado: Velocy - Nó (138.956 Req/s)
- Latência
- Latência sem barra
max latency - Solicitações/Sec
- Memória ociosa
- Memória sob carga constante
- Veredicto final
- O que diabos é um servidor da web de alguma maneira?
- Partes de um servidor da web:
- Navegando pelo mundo dos protocolos: uma rápida visão geral
- A relação entre HTTP e TCP: garantindo comunicação da web confiável
- 1. Integridade e ordem dos dados
- 2. Mecanismo de reconhecimento
- 3. Interações complexas
- 4. Transmissão acima
- Pedindo e recebendo: como os servidores da web respondem às suas solicitações
- Seu primeiro programa
node.js- O que exatamente é node ou nodejs?
- Seu primeiro programa Node.js
- Como
console.log() funciona no node.js? - O objeto
process : - A propriedade
stdout do objeto process :
- Trabalhando com arquivos
- O que a biblioteca de madeira fará
- Como você trabalha com arquivos?
- Vamos voltar aos
files - Um pouco mais sobre descritores de arquivos
- Criando nosso primeiro arquivo
- argumento
path - argumento
flag - argumento
mode - Lendo de um arquivo
- Uma pequena cartilha
for..of for await..of - Lendo o arquivo
json - Buffers
- Analisando o arquivo
json
-
logtar nossa própria biblioteca de madeira- Inicializando um novo projeto
- Um pouco sobre
SemVer - Criando uma aula de
LogLevel - A classe
Logger- Encapsulamento com campos
private
- A classe
LogConfig - Padrões de design
- Usando o padrão
builder com a classe LogConfig - Comentários do JSDOC
- A classe
RollingConfig- A classe
RollingSizeOptions - A classe
RollingTimeOptions
- Terminando a classe
RollingConfig - Adicionando métodos mais úteis na classe
LogConfig - Refatorando o código
- A necessidade de refatorar
- Criando arquivos separados
- O arquivo
index.js - O arquivo
lib/logtar.js - O arquivo
lib/logger.js - O arquivo
lib/config/log-config.js - O arquivo
lib/config/rolling-config.js - O arquivo
lib/utils/log-level.js - A classe
lib/utils/rolling-options.js
- Escrevendo logs
- 1. Reutilizando o identificador de arquivo
- 2. Rotação de log
- 3. Loging assíncrono
- 4. Obter informações de chamadas (módulo e número da linha)
- Testando nossa API atual
- Implementando métodos de registro
- Seco (não se repita)
- O método
log - Considerando a variável
log_level MEMBER - Escrevendo em um arquivo
- Outro petcha
- Configuração do diretório LOGS
- O objeto
require - Adicionando um novo ajudante para criar diretório de log
- Atualizando o método
init - Concluindo o método
log
- Captura de metadados
- O que é uma pilha?
- Exemplos de pilhas
- A pilha de chamadas
- Obtendo as informações da pilha
- Obtendo o nome
callee e o número da linha - Uma maneira mais ergonômica
- Usando a função
get_caller_info
- Uma pequena introdução ao
async vs sync- O equilíbrio entre os opostos
- Mistura de código assíncrono e síncrono
- E/S mais rápido
- Código de bloqueio
- Simultaneidade
- Adicionando suporte de arquivo de rolamento
- Recursos de rolamento
- O método
rolling_check() -
file_handle.stat() - Chamando o método
rolling_check - Um grande gotcha!
- Stack traços
await para alguns pontos- Testando a nova criação de arquivos de log
- HTTP Dive Deep
- Um pequeno servidor web
- Iniciando nosso servidor da web
- Testando nosso servidor da web
- Teste com
cURL
- Verbos HTTP, versão e os benefícios do
HTTP/1.1-
GET - Recuperar dados -
POST - Crie algo -
PUT - substitua ou crie -
HEAD - Recuperar metadados -
DELETE - Remova da existência -
PATCH - Atualizações parciais - Uma pequena recapitulação
-
/ caminho -
HTTP/0.9 -
HTTP/1.0 -
HTTP/1.1
- Agentes de usuário
-
User-Agent pode ser estranho
- MIME TIPO E
Content-Type- Compreendendo o cabeçalho
Accept - MIME TIPO
- Anatomia de um mímico do tipo
- Mas por que o curinga
*/* ? - O cabeçalho
Content-Type - O
charset=UTF-8 : codificação de caracteres
- Cabeçalhos
- Nome do cabeçalho
- Cólon (
: - Valor do cabeçalho
- Espaço em branco
- Cabeçalhos baseados em
X- personalizados
- Solicitar cabeçalhos
- Aceitar
- Referente
- Autorização
- Cookie
- Hospedar
- Tipo de conteúdo (solicitação)
- Cabeçalhos de resposta
- Tipo de conteúdo (resposta)
- Controle de cache
- Set-Cookie
- Códigos de resposta e status
-
Connection: close em ação - Códigos de status
-
Velocy - nossa estrutura de back -end- Por que Velocy?
- O que é uma estrutura/biblioteca de back -end?
- Recursos principais da nossa estrutura de back -end
- Roteamento e manuseio de URL:
- Middlewares
- Construindo nosso próprio banco de dados
- Cache
- Limitação da taxa
- Alguns outros recursos que estaremos implementando
- Uma implementação básica
Router- Um roteador de brinquedos
-
Transfer-Encoding: chunked - Pedaços, oh não!
- Especificando
Content-Length - REUSIBILIDADE DE CÓDIGO
- A classe
Router- Usando
Router com um servidor HTTP
-
this não é bom- Contexto lexical
- As funções de seta não são gratuitas
- Por que devemos nos preocupar com a memória?
- Testando o código atualizado
- Melhorando a API
Router - A necessidade de um
Trie- O que é um
Trie , afinal?
- Ex. Implementando um
Trie- Nó raiz
- Fim da palavra
- Desafio 1: Trie básico com método
insert - Desafio 2: Implementar o método
search
- Ex. Implementando nosso
Router baseado em trie- Desafio 1: Implementando o método
addRoute - Desafio 2: Implementando o método
findRoute
- Ex. Adicionando suporte do método
HTTP- Requisitos
- Mais detalhes
- Exemplo
- Dicas
- Solução
- Adicionando métodos HTTP ao roteador
- Atualize a classe
TrieRouter
- Ex. Implementando roteamento dinâmico
- Por que roteamento dinâmico?
- Anatomia de uma rota dinâmica
- Desafio: aprimore a classe
TrieRouter para apoiar o roteamento dinâmico - Visualização da nossa estrutura
TrieRouter - Resumo
- Executando nosso servidor
- Refatorando a classe
TrieRouter - Tipo Aliases
- A função
run
- Construindo nosso primeiro servidor da Web
- Mais refatoração
- Seu primeiro servidor da web
- Ex. Parâmetros de consulta (avançado)
- Anatomia de um URL com parâmetros de consulta
- Desafio 1: Implementando a análise de parâmetros básicos de consulta
- Precisamos enfrentar mais casos de borda
- Desafio 2: Analisando parâmetros de consulta manualmente