Prévia do material em texto
Machine Translated by Google
Índice
Prefácio
O manual do Node.js
Conclusão
1
Machine Translated by Google
Prefácio
Este livro é escrito por Flávio. Eu publico tutoriais de programação no meu blog
flaviocopes.com e O Vale do Código.
O Manual do Node.js segue a regra 80/20: aprenda em 20% do tempo os 80% de um
tópico.
Você pode me encontrar no Twitter @flaviocopes.
Em particular, o objetivo é deixá-lo atualizado rapidamente com o Node.js.
Apreciar!
2
Machine Translated by Google
https://flaviocopes.com/
https://thevalleyofcode.com/
https://twitter.com/flaviocopes
O manual do Node.js
2.0.2. 2010
2.0.11. 2019
2.0.10. 2018
2.0.1. 2009
1. Introdução ao Node.js
1.1. Node.js tem um grande número de
bibliotecas 1.2. Um exemplo de aplicativo
Node.js 1.3. Estruturas e ferramentas do
Node.js 2. Um breve histórico do Node.js
2.0.9. 2017
8. Como sair de um programa Node.js 9.
Como ler variáveis de ambiente de Node.js 10. Onde
hospedar um aplicativo Node.js
2.0.8. 2016
2.0.7. 2015
5. Diferenças entre o Node e o Browser 6. O V8
JavaScript Engine 6.1. Outros motores JS 6.2. A
busca pelo desempenho 6.3. Compilação 7.
Execute scripts Node.js a partir da linha de
comando 7.1. Reinicie o aplicativo
automaticamente
3. Como instalar o Node.js
4. Quanto JavaScript você precisa saber para usar o Node?
2.0.6. 2014
2.0.5. 2013
2.0.14. 2022
2.0.4. 2012
2.0.13. 2021
2.0.12. 2020
2.0.3. 2011
3
Machine Translated by Google
11.1. Use a guia para autocompletar
11.2. Explorando objetos JavaScript
11.3. Explorar objetos globais 11.4. A
variável especial _ 11.5. A tecla de seta para cima 11.6.
Comandos de ponto
10.1. A opção mais simples de sempre:
túnel local 10.2. Implantações de configuração zero
11. Como usar o REPL do Node.js
11.7. Execute REPL a partir do arquivo
JavaScript 12. Node, aceite argumentos da linha de
comando 13. Saída para a linha de comando usando Node
13.1. Saída básica usando o módulo de console
13.2. Limpe o console 13.3. Elementos de
contagem 13.4. Reiniciar a contagem 13,5.
Imprima o rastreamento de pilha 13.6. Calcule o
tempo gasto 13,7. stdout e stderr 13.8. Colorir a
saída 13.9. Crie uma barra de progresso 14.
Aceite a entrada da linha de comando no Nó 15.
Uma introdução ao gerenciador de pacotes npm
10.2.1. Falha
10.2.2. Codepen
10.3. Sem servidor
10.4. PAAS 10.4.1. Zeit
Now 10.4.2.
Nanobox 10.4.3.
Heroku 10.4.4.
Microsoft Azure 10.4.5.
Google Cloud Platform 10.5.
Servidor Privado Virtual 10.6. Metal
puro
4
Machine Translated by Google
18.2.1. nome
18.2.12. privado
18.2.13. roteiros
18.2.14. dependências
18.2.15. devDependencies
18.2.16. motores 18.2.17. lista
de navegadores 18.2.18.
Propriedades específicas do comando 18.3.
Versões do pacote 19. O arquivo package-lock.json
19.1. Um exemplo 20. Encontre a versão instalada de um
pacote npm
18.2. Detalhamento de propriedades
18.2.7. licença
18.2.8. palavras-
chave 18.2.9. descrição
18.2.10. repositório
18.2.11. a Principal
17. Como usar ou executar um pacote instalado usando npm 18. O
guia package.json 18.1. A estrutura do arquivo
18.2.3. contribuintes
18.2.4. erros 18.2.5.
página inicial 18.2.6.
versão
15.1. Introdução ao npm 15.2.
Downloads 15.2.1. Instalando
todas as dependências 15.2.2. Instalando
um único pacote 15.2.3. Atualizando
pacotes 15.3. Versão 15.4. Executando
Tarefas 16. Onde o npm instala os pacotes?
18.2.2. autor
5
Machine Translated by Google
28. O loop de eventos do Node.js
28.1. Introdução
31.1. setTimeout()
32. O emissor de eventos do nó 33.
Trabalhando com descritores de arquivo no nó 34.
Estatísticas do arquivo do nó 35. Caminhos do
arquivo do nó 35.1. Obtendo informações de um
caminho 35.2. Trabalhando com caminhos
27.1. Execute facilmente comandos locais
27.2. Execução de comandos sem instalação 27.3.
Execute algum código usando uma versão diferente do Node.js 27.4.
Execute snippets de código arbitrários diretamente de um URL
31. Descubra temporizadores JavaScript
23. Versão semântica usando npm 24.
Desinstalando pacotes npm com npm uninstall 25. npm global
ou pacotes locais 26. npm dependencies e devDependencies 27.
O npx Node Package Runner
31.3. Conjunto recursivoTempo limite
30. Entendendo setImmediate()
21. Instale uma versão mais antiga de um pacote npm 22.
Atualize todas as dependências do Node para sua versão mais recente 22.1.
Como os pacotes se tornam dependências 22.2. Atualizar todos os
pacotes para a versão mais recente
31.2. setInterval()
28.2. Bloqueando o loop de eventos
28.3. A pilha de chamadas 28.4. Uma
explicação simples do loop de eventos 28.5.
Execução da função de fila 28.6. A fila de
mensagens 28.7. ES6 Job Queue 29. Entendendo
o processo.nextTick()
31.1.1. Atraso zero
6
Machine Translated by Google
40.0.2. path.dirname()
41. O módulo Node os
41.9. os.release()
40.0.10. path.resolve()
40.0.1. path.basename()
41,8. os.platform()
39. O módulo Node fs 40.
O módulo Node path
40.0.9. caminho.relativo()
41,7. os.networkInterfaces()
41.6. os.loadavg()
36. Lendo arquivos com o
Node 37. Gravando arquivos
com o Node 37.1. Anexar
a um arquivo 37.2. Usando
streams 38. Trabalhando com
pastas 38.1. Verifique se existe
uma pasta 38.2. Crie uma nova
pasta 38.3. Ler o conteúdo de um
diretório 38.4. Renomeie uma pasta 38.5.
Remover uma pasta
40.0.8. caminho.parse()
40.0.7. caminho.normalize()
41.5. os.hostname()
41.4. os.homedir()
40.0.6. caminho.join()
40.0.5. path.isAbsolute()
41.3. os.freemem()
41.11. os.totalmem()
40.0.4. caminho.formato()
41.2. os.cpus()
41.1. os.arch()
40.0.3. caminho.extname()
41.10. os.tmpdir()
7
Machine Translated by Google
42.10. emissor.prependListener()
43.2.1. http.createServer()
42. O módulo de eventos do nó
42.9. emissor.uma vez()
41.13. os.uptime()
42,7. emissor.off()
43.1.1. http.MÉTODOS
43.3.3. http.Servidor
42,5. emissor.listenerCount()
43.3.1. http.Agente
42.14. emissor.setMaxListeners()
42.4. emissor.getMaxListeners()
42.13. emissor.removeListener()
43.3. Aulas
42.2. emissor.emitir()
43.2.2. http.request()
43.1.3. http.globalAgent
43.2. Métodos
42.11. emissor.prependOnceListener()
43.3.5. http.IncomingMessage
42,8. emissor.on()
43.1.2. http.STATUS_CODES
43.3.4. http.ServerResponse
41.14. os.userInfo()
41.12. os.type()
43. O módulo Nó http 43.1.
Propriedades
42.6. emissor.ouvintes()
43.3.2. http.ClientRequest
42.3. emissor.eventNames()
42.12. emissor.removeAllListeners()
43.2.3. http.get()
44. Streams Node.js
42.1. emissor.addListener()
8
Machine Translated by Google
O Node.js é um ambiente de tempo de execução JavaScript de código aberto e
multiplataforma. É uma ferramenta popular para quase qualquer tipo de projeto!
44.1. O que são fluxos
44.2. Por que streams
44.3. Um exemplo de um fluxo
44.4. cano()
O Node.js executa o mecanismo JavaScript V8, o núcleo do Google Chrome, fora do
navegador. Isso permite que o Node.js tenha um alto desempenho.
44,5. APIs Node.js baseadas em streams
44.6. Diferentes tipos de fluxos 44.7."^7.1.2",
"babel-core": "^6.22.1", "babel-
eslint": "^8.2.1", "babel-helper-
vue -jsx-merge-props": "^2.0.3", "babel-jest": "^21.0.2",
"babel-loader": "^7.1.1", "babel-plugin-dynamic-import-
node": "^1.2.0", "babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs":
"^6.26.0", "babel -plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0", "babel-preset-env": "^1.3.2", "
babel-preset-stage-2": "^6.22.0", "chalk": "^2.0.1", "copy-webpack-plugin":
"^4.0.1", "css-loader": "^ 0.28.0", "eslint": "^4.15.0", "eslint-config-airbnb-
base": "^11.3.0", "eslint-friendly-formatter": "^3.0.0", "eslint -import-
resolver-webpack": "^0.8.3", "eslint-loader": "^1.7.1", "eslint-plugin-
import": "^2.7.0", "eslint-plugin-vue" : "^4.0.0", "extract-text-webpack-
plugin": "^3.0.0", "file-loader": "^1.1.4", "friendly-errors-webpack-plugin":
"^ 1.6.1", "html-webpack-plugin": "^2.30.1",
{
55
Machine Translated by Google
versão indica a versão atual
}
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss -url": "^7.2.1", "rimraf":
"^2.6.0", "semver": "^5.3.0",
"shelljs": "^0.7.6", "uglifyjs-
webpack-plugin ": "^1.1.1", "url-
loader": "^0.5.8", "vue-jest": "^1.0.2", "vue-
loader": "^13.3.0", "vue -style-loader":
"^3.0.1", "vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0", "webpack-bundle-
analyzer": "^2.9 .0", "webpack-dev-server":
"^2.9.1", "webpack-merge": "^4.1.0" },
"engines": { "node": ">= 6.0.0", "npm": ">=
3.0.0" }, "browserslist": ["> 1%", "últimas 2
versões", "not ie (https://whatever.com)"
{
"name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
{
}
{
"colaboradores": [
}
"author":
{ "name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
{
}
"contributors": ["Joe (https://whatever.com)"]
]
58
Também pode ser usado com este formato:
Exemplo:
Exemplo:
Também pode ser usado com este formato:
Além do autor, o projeto pode ter um ou mais colaboradores. Esta propriedade é um array
que os lista.
Machine Translated by Google
{
}
}
{
"homepage": "https://whatever.com/package"
"versão": "1.0.0"
"bugs": "https://github.com/whatever/package/issues"
Indica a versão atual do pacote.
Exemplo:
O primeiro número é a versão principal, o segundo a versão secundária e o terceiro é
a versão do patch.
Exemplo:
.
Exemplo:
Links para o rastreador de problemas do pacote, provavelmente uma página de problemas do GitHub
Há um significado nesses números: uma versão que corrige apenas bugs é uma
versão de patch, uma versão que introduz alterações compatíveis com versões
anteriores é uma versão menor, uma versão principal pode ter alterações importantes.
Esta propriedade segue a notação de versionamento semântico (semver) para versões,
o que significa que a versão é sempre expressa com 3 números: xxx
Define a página inicial do pacote
59
18.2.5. pagina inicial
18.2.6. versão
18.2.4. insetos
Machine Translated by Google
"description": "Um pacote para trabalhar com strings"
"palavras-chave":
[ "email",
"aprendizado de máquina",
"ai"
"licença": "MIT"
]
Esta propriedade contém uma breve descrição do pacote
Essa propriedade contém uma matriz de palavras-chave que se associam ao que
seu pacote faz.
Isso é especialmente útil se você decidir publicar seu pacote no npm para que as
pessoas possam descobrir do que se trata o pacote.
Isso ajuda as pessoas a encontrar seu pacote ao navegar em pacotes semelhantes
ou ao navegar no https://www.npmjs.com/ local na rede Internet.
Exemplo:
Exemplo:
Indica a licença do pacote.
Exemplo:
60
18.2.7. licença
18.2.10. repositório
18.2.9. Descrição
18.2.8. palavras-chave
Machine Translated by Google
https://www.npmjs.com/
18.2.11. a Principal
"repository": "github:whatever/testing",
"repository":
{ "type": "svn",
"url": "..."
"main": "src/main.js"
}
"repository":
{ "type": "git",
"url": "https://github.com/whatever/testing.git"
"repository": "gitlab:whatever/testing",
}
"repository": "bitbucket:whatever/testing",
61
Define o ponto de entrada para o pacote.
Quando você importa este pacote em um aplicativo, é onde o aplicativo buscará as exportações
do módulo.
Esta propriedade especifica onde este repositório de pacotes está localizado.
Você pode usar diferentes sistemas de controle de versão:
Você pode definir explicitamente o sistema de controle de versão:
Exemplo:
Exemplo:
Observe o prefixo do github . Existem outros serviços populares preparados em:
Machine Translated by Google
}
npm run XXXX ou yarn XXXX
npm install
yarn add
"scripts":
{ "dev": "webpack-dev-server --inline --progress --config build/webpack.de "start": "npm
run dev", "unit": "jest --config test/ unit/jest.conf.js --coverage", "test": "npm run unit",
"lint": "eslint --ext .js,.vue src test/unit", "build": "node build/ build.js"
"privado": verdadeiro
npm executar dev .
Você pode usar qualquer nome que quiser para um comando, e os scripts podem fazer
literalmente o que você quiser.
Define um conjunto de scripts de nós que você pode executar
Esses scripts são aplicativos de linha de comando. Você podeexecutá-los chamando
onde XXXX é o nome do comando. Exemplo:
Exemplo:
Exemplo:
Define uma lista de pacotes npm instalados como dependências.
se definido como true , impede que o aplicativo/pacote seja publicado acidentalmente no npm
,
Quando você instala um pacote usando npm ou yarn:
62
18.2.13. roteiros
18.2.12. privado
18.2.14. dependências
Machine Translated by Google
18.2.15. devDependencies
18.2.16. motores
npm install -D
yarn add --dev
}
"dependencies":
{ "vue": "^2.5.2"
"devDependencies":
{ "autoprefixer": "^7.1.2",
"babel-core": "^6.22.1"
}
63
Define uma lista de pacotes npm instalados como dependências de desenvolvimento.
Define quais versões do Node.js e outros comandos funcionam neste pacote/aplicativo
esse pacote é inserido automaticamente nesta lista.
esse pacote é inserido automaticamente nesta lista.
Eles diferem das dependências porque devem ser instalados apenas em uma máquina de
desenvolvimento, não sendo necessários para executar o código em produção.
sobre
Exemplo:
Exemplo:
Exemplo:
Quando você instala um pacote usando npm ou yarn:
Machine Translated by Google
É usado para informar quais navegadores (e suas versões) você deseja oferecer suporte.
Ele é referenciado pelo Babel, Autoprefixer e outras ferramentas, para adicionar apenas
os polyfills e fallbacks necessários aos navegadores que você segmenta.
Esta configuração significa que você deseja suportar as últimas 2 versões principais de
todos os navegadores com pelo menos 1% de uso (do site CanIUse.com estatísticas),
exceto IE8 e inferior.
Exemplo:
Cada um tem uma propriedade específica, como
eslintConfig são específicos do comando, e você pode encontrar como usá-los na
respectiva documentação do comando/projeto.
O arquivo package.json também pode hospedar configuração específica de comando, por
exemplo, para Babel, ESLint e muito mais.
,
18.2.17. lista de navegadores
18.2.18. Propriedades específicas do comando
18.3. Versões do pacote
64
"lista de navegadores": [
}
babel e outros. Aqueles
"> 1%",
"últimas 2 versões",
"not ie = 6.0.0",
"npm": ">= 3.0.0",
"yarn": "^0.13.0"
(ver mais)
Machine Translated by Google
https://caniuse.com/
https://www.npmjs.com/package/browserslist
19. O arquivo package-lock.json
=1.1.0
, você obterá versões de patch e secundárias: 1.13.1 1.14.0 e
cada pacote que é instalado para que um produto seja 100% reprodutível no
lançamento do patch, você tem essas "Regras".
O objetivo do arquivo package-lock.json é acompanhar a versão exata do
número diferente de zero mais à esquerda: 0.13.1 0.13.2 e assim por diante. Se você escrever
Dado que usando semver (versão semântica) todas as versões têm 3 dígitos, o
O que é isso? Você provavelmente conhece o arquivo package.json , que é muito
ok, mas 0.14.0 não é.
minor), usando a notação semver, por exemplo:
essa é a versão exata que será usada, sempre
package.json, você pode definir para quais versões deseja atualizar (patch ou
,
usar?
Você viu na descrição acima números de versão como estes: ~3.0.0
para usar 1.0.0 ou uma versão de 1.1.0 para cima, mas inferior a 1.2.0.
da mesma forma, mesmo que os pacotes sejam atualizados por seus mantenedores.
assim por diante até 2.0.0 mas não 2.0.0 .
sendo o primeiro o lançamento principal, o segundo o lançamento secundário e o terceiro o lançamento
mais comum e existe há muito mais tempo.
se você escrever ̂ 0.13.0 , você deseja obter atualizações que não alteram o
,
,
dependência.
Machine Translated by Google
https://nodejs.dev/learn/semantic-versioning-using-npm/
Se você especificar versões exatas, como 0.13.0 no exemplo, você não será afetado
por esse problema.
O arquivo package-lock.json precisa ser confirmado no seu repositório Git, para que
possa ser buscado por outras pessoas, se o projeto for público ou se você tiver
colaboradores, ou se você usar o Git como fonte para implantações.
Pode ser você ou outra pessoa tentando inicializar o projeto do outro lado do mundo
executando npm install .
As versões de dependências serão atualizadas no arquivo package-lock.json quando
você executar npm update .
Portanto, seu projeto original e o projeto recém-iniciado são realmente diferentes.
Mesmo que um patch ou uma versão menor não introduza mudanças importantes, todos
nós sabemos que os bugs podem (e assim, eles vão) aparecer.
O package-lock.json define sua versão atualmente instalada de cada pacote em pedra,
e o npm usará essas versões exatas ao executar o npm ci .
Você não se compromete com o Git sua pasta node_modules, que geralmente é enorme,
e quando você tenta replicar o projeto em outra máquina usando o comando npm install ,
se você especificou a sintaxe ~ e uma versão de patch de um pacote foi lançada , esse
vai ser instalado. O mesmo para ̂ e versões menores.
Esta é uma estrutura de exemplo de um arquivo package-lock.json que obtemos quando
executamos npm install cowsay em uma pasta vazia:
Este conceito não é novo, e outros gerenciadores de pacotes de linguagens de
programação (como o Composer em PHP) usam um sistema similar há anos.
19.1. Um exemplo
66
Machine Translated by Google
"requires": true,
"lockfileVersion": 1,
"dependencies": { "ansi-
regex": { "version":
"3.0.0", "resolved":
"https://registry.npmjs.org/ansi -regex/-/ansi-regex-3. 0.0.tgz", "integridade":
"sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "cowsay": { "version": "1.3.1", "resolved":
"https: //registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz"
} },
"get-stdin":
{ "version": "5.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0. 1.tgz ",
"integridade": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" }, "is-fullwidth-code-point":
{ "version": "2.0.0", "resolved": "https://registry.npmjs. org/is-fullwidth-code-
point/-/
,
is-fullwidth-code-point-2.0.0.tgz",
"integridade": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" },
"minimista": {
"integridade": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10 .tgz", "integrity":
"sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8 =" }, "otimista": { "versão": "0.6.1", "resolvido":
"https://registry.npmjs.org/optimist/-/optimist-0.6.1.tg "integridade": "
sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==",
{
"requires":
{ "get-stdin": "^5.0.1",
"optimist": "~0.6.1", "string-
width": "~2.1.1", "strip-eof": "^
1.0.0"
67
Machine Translated by Google
"is-fullwidth-code-point": "^2.0.0", "strip-
ansi": "^4.0.0"
Instalamos o cowsay
"version": "2.1.1",
"resolved":"https://registry.npmjs.org/string-width/-/string-width- "integrity": "sha512-
nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLN "requer": {
} },
"largura da string": {
}
"requires":
{ "minimist": "~0.0.1",
"wordwrap": "~0.0.2"
}
}
largura da corda
tira-eof
},
"strip-eof":
{ "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0. "integridade ": "sha1-
u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "wordwrap": { "version": "0.0.3", "resolved":
"https://registry.npmjs.org/wordwrap/-/wordwrap-0.0. 3.tg "integridade": "sha1-
o9XabNXAvAAI03I0u68b7WMFkQc="
}
otimista
get-stdin
},
"strip-ansi":
{ "version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0. "integrity": "sha1-
qEeQIusaw2iocTibY1JixQXuNo8=", "requer": { "ansi-regex": "^3.0.0"
}
que depende de,
68
Machine Translated by Google
20. Encontre a versão instalada de
um pacote npm
is-fullwidth-code-point
lista npm
do mínimo
ansi-regente
tira-eof
ÿ npm list /
Users/joe/dev/node/cowsay ÿÿÿ
cowsay@1.3.1 ÿÿÿ get-
stdin@5.0.1 ÿÿÿ optimist@0.6.1
ÿ ÿÿÿ minimist@0.0.10 ÿ ÿ ÿÿ
wordwrap@0.0.3 ÿÿÿ string-
width@2.1.1 ÿ ÿÿÿ is-fullwidth-
code-point@2.0.0 ÿ ÿÿÿ strip-
ansi@4.0.0 ÿ ÿÿÿ ansi-regex @3.0.0 ÿÿÿ
strip-eof@1.0.0
quebra de linha
69
requer propriedade que alguns têm:
Por exemplo:
Por sua vez, esses pacotes requerem outros pacotes, como podemos ver na
Eles são adicionados em ordem alfabética no arquivo e cada um tem um
campo de versão , um campo resolvido que aponta para o local do pacote
e uma string de integridade que podemos usar para verificar o pacote.
Para ver a versão de todos os pacotes npm instalados, incluindo suas
dependências:
Machine Translated by Google
21. Instale uma versão mais antiga
de um pacote npm
ÿ npm list minimist /
Users/joe/dev/node/cowsay
ÿÿÿ cowsay@1.3.1 ÿÿÿ
optimist@0.6.1
1.3.1
ÿ npm list --depth=0 /
Users/joe/dev/node/cowsay
ÿÿÿ cowsay@1.3.1
ÿ npm list cowsay /
Users/joe/dev/node/cowsay
ÿÿÿ cowsay@1.3.1
ÿÿÿ minimista@0.0.10
ÿ npm ver versão cowsay
70
npm list -g é o mesmo, mas para pacotes instalados globalmente.
Você pode obter a versão de um pacote específico especificando seu nome:
Para obter apenas seus pacotes de nível superior (basicamente, aqueles que você disse
ao npm para instalar e listou no package.json ), execute npm list --depth=0 :
Você também pode simplesmente abrir o arquivo package-lock.json , mas isso envolve
alguma verificação visual.
Isso também funciona para dependências de pacotes que você instalou:
Se você quiser ver qual é a versão mais recente disponível do pacote no repositório
npm, execute npm view [package_name] version :
Machine Translated by Google
Você também pode estar interessado em listar todas as versões anteriores de um pacote.
Você pode fazer isso com npm view version :
instala a versão 1.3.1 (no momento da escrita).
Exemplo:
Você pode instalar uma versão antiga de um pacote npm usando a sintaxe @ :
O mesmo pode ser feito com pacotes globais:
Instale a versão 1.2.0 com:
npm install @
npm instalar cowsay
npm instala cowsay@1.2.0
npm install -g webpack@4.16.4
71
Machine Translated by Google
72
22.1. Como os pacotes se tornam dependências
22. Atualize todas as
dependências do Node para sua versão mais recente
Quando você executa o npm, instale o arquivo
cowsay:
,
uma ferramenta de linha de comando bacana que permite fazer um
O npm determina as dependências e também instala suas versões mais recentes.
,
,
Quando você instala um pacote usando npm install
a versão é baixada para a pasta node_modules . Uma entrada correspondente
é adicionada a package.json e package-lock.json na pasta atual.
o mais recente
ÿ npm ver versões de cowsay
esta entrada é adicionada ao package.json
[ '1.0.0',
'1.0.1',
'1.0.2',
'1.0.3',
'1.1.0',
'1.1.1',
'1.1.2',
'1.1.3', '
1.1.4',
'1.1.5',
'1.1.6',
'1.1.7',
'1.1.8',
'1.1.9',
'1.2.0',
'1.2.1',
'1.3. 0',
'1.3.1' ]
Digamos que você instale
cowsay vaca dizer coisas.
Machine Translated by Google
https://www.npmjs.com/package/cowsay
{
{
"cowsay": "^1.3.1"
"dependências": {
}
}
"requires": true,
"lockfileVersion": 1,
"dependencies":
{ "cowsay": { "version":
"1.3.1", "resolved":
"https://registry.npmjs.org/cowsay/- /cowsay-1.3.1.tgz", "integridade":
"sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkMAj "requires": { "get-
stdin": "^5.0.1", "optimist": "~0.6. 1", "string-width": "~2.1.1", "strip-eof": "^1.0.0"
}
}
}
}
Agora, esses 2 arquivos nos dizem que instalamos a versão 1.3.1 do cowsay e nossa
regra de versão do npm para atualizações é ̂ 1.3.1 . Isso significa que o npm pode
atualizar para patches e versões secundárias: 1.3.21.4.0 e assim por diante.
pacote.json .
a
Desde a versão 5.0.0 do npm, o npm update atualiza o package.json com versões
secundárias ou de patch mais recentes. Use npm update --no-save para evitar modificações
Para descobrir novos lançamentos de pacotes, use npm disabled .
,
Este é um extrato de package-lock.json (dependências aninhadas foram removidas
para maior clareza):
Se houver uma nova versão secundária ou de patch e digitarmos npm
update , a versão instalada será atualizada e o arquivo package-lock.json
preenchido diligentemente com a nova versão.
,
73
Machine Translated by Google
https://docs.npmjs.com/about-semantic-versioning
22.2. Atualizar todos os pacotes para a versão mais recente
ncu -u
pacote.json
npm install -g npm-check-updates
74
para atualizar todas as dicas de versão em 1. Agora execute npm-check-updates , permitindo a instalação das novas versões
principais: package.json
Aqui está a lista de alguns pacotes desatualizados em um repositório:
Aproveitando npm-check-updates, você pode atualizar todas as
dependências para a versão mais recente.
1. Instale o pacote npm-check-updates globalmente:
Algumas dessas atualizações são lançamentos importantes . Executar a atualização do
npm não ajudará aqui. Os principais lançamentos nunca são atualizados dessa maneira
porque eles (por definição) introduzem alterações importantes e o npm quer evitar problemas.
Machine Translated by Google
https://www.npmjs.com/package/npm-check-updates
23. Versão semântica usando npm
~
^
npm instalar
75
o primeiro dígito é a versão principal o
segundo dígito é a versão secundária o
terceiro dígito é a versão do patch
A convenção é adotada em todas as linguagens de programação, e é muito importante que
cada pacote npm adere a ela, porque todo o sistema depende disso.
Por que isso é tão importante?
Se há uma grande coisa nos pacotes Node.js, é que todos eles concordaram em usar o Controle
de Versão Semântica para a numeração de suas versões.
Como o npm define algumas regras que podemos usar no arquivo package.json para escolher
para quais versões ele pode atualizar nossos pacotes, quando executamos o npm update .
Quando você faz um novo lançamento, você não apenas aumenta um número como quiser,
mas tem regras:
O conceito de Versionamento Semântico é simples: todas as versões possuem 3 dígitos:
As regras usamestes símbolos:
você atualiza a versão principal quando faz alterações de API incompatíveis você
atualiza a versão secundária quando adiciona funcionalidade de maneira compatível com
versões anteriores você atualiza a versão de patch quando faz correções de bugs
compatíveis com versões anteriores
xyz .
1. Por fim, execute uma instalação padrão:
Machine Translated by Google
76
24. Desinstalando pacotes npm com
,não na versão principal. Se você escrever ̂ 13.1.0 ,
ele pode atualizar para 13.2.0 e não para 14.0.0
ou superior.
Vamos ver essas regras em detalhes:
lançamentos de patches: 0.13.1 está ok, mas 0.14.0 não.
: Ele só fará atualizações que não alteram o valor diferente de zero mais à esquerda
,
,
Existem outras regras também:
,
número, ou seja, pode haver alterações na versão secundária ou versão de patch, mas
sem símbolo: você aceita apenas a versão específica que você especificar ( 1.2.1 )
npm desinstalar
=
~ : se você escrever ~0.13.0 ao executar o npm update , ele pode atualizar para
Você pode combinar algumas dessas notações, por exemplo, use 1.0.0 || >=1.1.0
>
|| : você combina conjuntos. Exemplo: 2,6
- : você aceita várias versões. Exemplo: 2.1.0 - 2.6.2
13.3.0 até 13.3.1
= : você aceita essa versão exata
||
13.3.2 e assim por diante, mas
= : você aceita qualquer versão igual ou superior à que você especificar
> : você aceita qualquer versão superior à especificada
Machine Translated by Google
25. pacotes globais ou locais npm
dependências
npm desinstalar -g webpack
npm desinstalar
devDependencies
Dependências opcionais
npm uninstall -g
instale
-g
77
onde depende da sua configuração), independentemente de onde você executa o npm install
da pasta raiz do projeto (a pasta que contém o node_modules
Use a opção --no-save se não quiser atualizar o package.json e
arquivos package-lock.json .
e você pode executar este comando de qualquer lugar que desejar em seu sistema
pacotes globais são todos colocados em um único lugar em seu sistema (exatamente
install ), execute
arquivos package-lock.json .
sob este diretório
Para desinstalar um pacote que você instalou anteriormente localmente (usando npm
por exemplo:
e peerDependencies em package.json e
,
,
,
e eles são colocados na pasta node_modules
,
os pacotes locais são instalados no diretório em que você executa o npm
bandeira:
A principal diferença entre pacotes locais e globais é esta:
pasta). Isso irá atualizar
Se o pacote estiver instalado globalmente, você precisa adicionar o -g / --global
porque, para pacotes globais, o diretório atual não importa.
Machine Translated by Google
A atualização de um pacote global faria com que todos os seus projetos usassem a
nova versão e, como você pode imaginar, isso pode causar pesadelos em termos de
manutenção, pois alguns pacotes podem quebrar a compatibilidade com outras
dependências e assim por diante.
então quando você deve instalar de uma forma ou de outra?
Todos os projetos têm sua própria versão local de um pacote, mesmo que isso possa
parecer um desperdício de recursos, é mínimo em comparação com as possíveis
consequências negativas.
Um pacote deve ser instalado globalmente quando fornece um comando executável
que você executa a partir do shell (CLI) e é reutilizado nos projetos.
Em geral, todos os pacotes devem ser instalados localmente.
Você também pode instalar comandos executáveis localmente e executá-los usando
npx, mas alguns pacotes são apenas melhor instalados globalmente.
Isso garante que você possa ter dezenas de aplicativos em seu computador, todos
executando uma versão diferente de cada pacote, se necessário.
No seu código, você só pode exigir pacotes locais:
Grandes exemplos de pacotes globais populares que você pode conhecer são
react-native-cli
npm
mocha
nómon
para todo sempre
grunt-cli
view-cli
gatsby-cli
require('nome do pacote')
78
Machine Translated by Google
27. O npx Node Package Runner
26. dependências do npm e
devDependencies
npm lista -g --profundidade 0
79
Quando você instala um pacote npm usando npm install está
instalando-o como uma dependência.
Quando você entra em produção, se você digitar npm install e a pasta contiver um
arquivo package.json , eles serão instalados, pois o npm assume que esta é uma
implantação de desenvolvimento.
Você provavelmente já tem alguns pacotes instalados globalmente em seu sistema.
As dependências de desenvolvimento destinam-se a pacotes somente de
desenvolvimento, que são desnecessários na produção. Por exemplo, pacotes de teste,
webpack ou Babel.
versão 5.2, lançada em julho de 2017.
npx é um comando muito poderoso que está disponível no npm começando
Ao adicionar o sinalizador -D ou --save-dev , você o está instalando como uma
dependência de desenvolvimento, que o adiciona à lista devDependencies .
na sua linha de comando.
Você precisa definir o sinalizador --production ( npm install --production ) para evitar a
instalação dessas dependências de desenvolvimento.
O pacote é listado automaticamente no arquivo package.json, na lista de dependências
(a partir do npm 5. anteriormente, você tinha que especificar manualmente -- save ).
, você
Você pode vê-los executando
Machine Translated by Google
A execução de npx commandname encontra automaticamente a referência correta
do comando dentro da pasta node_modules de um projeto, sem precisar saber o
caminho exato e sem exigir que o pacote seja instalado globalmente e no caminho
do usuário.
Isso é bastante útil, principalmente porque:
Se você não quiser instalar o npm, poderá instalar o npx como um pacote
autônomo
,
Isso foi uma dor porque você não poderia realmente instalar versões diferentes do
mesmo comando.
Uma demonstração típica do uso do npx é através do comando cowsay . cowsay
imprimirá uma vaca dizendo o que você escreveu no comando. Por exemplo:
cowsay "Olá" será impresso
que está permitindo executar comandos
Os desenvolvedores do Node.js costumavam publicar a maioria dos comandos
executáveis como pacotes globais, para que eles estivessem no caminho e fossem
executáveis imediatamente.
1. você não precisa instalar nada 2.
você pode executar diferentes versões do mesmo comando, usando a sintaxe
Há outro ótimo recurso do npx sem
primeiro instalá-los.
@versão
O npx permite executar código criado com Node.js e publicado por meio do
registro npm.
27.1. Execute facilmente comandos locais
27.2. Execução de comandos sem instalação
80
Machine Translated by Google
https://www.npmjs.com/package/npx
https://www.npmjs.com/package/npx
27.3. Execute algum código usando uma versãodiferente do Node.js
Agora, este é um comando inútil engraçado. Outros cenários incluem:
e muitos mais.
Isso só funciona se você tiver o comando cowsay instalado globalmente do
npm anteriormente. Caso contrário, você receberá um erro ao tentar executar
o comando.
vai fazer o trabalho.
81
npx permite que você execute esse comando npm sem instalá-lo primeiro. Se o comando não
for encontrado, o npx o instalará em um cache central:
@vue/cli cria meu-vue-app
executando a ferramenta vue CLI para criar novos aplicativos e executá-los: npx
_______
Use o @ para especificar a versão e combine isso com o pacote node npm :
npx node@10 -v #v10.18.1 npx
node@12 -v #v12.14.1
\ ̂ __^ \
(oo)\_______ (__)\ )
\/\ ||----w | || ||
criando um novo aplicativo React usando create-react-app : npx create-react-app
meu-reagir-aplicativo
npx cowsay "Olá"
-------
Machine Translated by Google
https://www.npmjs.com/package/node
https://www.npmjs.com/package/node
https://www.npmjs.com/package/node
https://www.npmjs.com/package/node
https://www.npmjs.com/package/node
82
28.1. Introdução
27.4. Execute snippets de código arbitrários
diretamente de um URL
npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32
28. O loop de eventos do Node.js
Claro, você precisa ter cuidado ao executar o código que você não controla, pois com grandes
poderes vêm grandes responsabilidades.
Por que isso é tão importante? Porque explica como o Node.js pode ser assíncrono e ter E/S
sem bloqueio, e explica basicamente o "recurso matador" do Node.js, o que o tornou tão bem-
sucedido.
Isso ajuda a evitar ferramentas como nvm ou outras ferramentas de gerenciamento de versão
do Node.js.
O Event Loop é um dos aspectos mais importantes a serem entendidos sobre o Node.js.
Você pode executar o código que fica em um gist do GitHub, por exemplo:
Esta é uma limitação que é realmente muito útil, pois simplifica muito como você programa sem
se preocupar com problemas de simultaneidade.
Você só precisa prestar atenção em como escreve seu código e evitar qualquer coisa que possa
bloquear o encadeamento, como chamadas de rede síncronas ou loops infinitos.
npx não limita você aos pacotes publicados no registro npm.
O código JavaScript do Node.js é executado em um único encadeamento. Há apenas uma coisa
acontecendo de cada vez.
Machine Translated by Google
Quase todas as primitivas de E/S em JavaScript não são bloqueantes. Solicitações de rede,
operações do sistema de arquivos e assim por diante. O bloqueio é a exceção, e é por isso que
o JavaScript é baseado tanto em retornos de chamada e, mais recentemente, em promessas e
async/await.
cada um em ordem.
Em geral, na maioria dos navegadores existe um event loop para cada guia do navegador, para
tornar cada processo isolado e evitar uma página web com loops infinitos ou processamento
pesado para bloquear todo o seu navegador.
Ao fazer isso, ele adiciona qualquer chamada de função que encontrar na pilha de chamadas e executa
Qualquer código JavaScript que demore muito para retornar o controle ao loop de eventos
bloqueará a execução de qualquer código JavaScript na página, até mesmo bloqueará o thread
da interface do usuário, e o usuário não poderá clicar, rolar a página e assim por diante.
O loop de eventos verifica continuamente a pilha de chamadas para ver se há alguma função
que precisa ser executada.
Você conhece o rastreamento de pilha de erros com o qual pode estar familiarizado, no depurador
ou no console do navegador? O navegador procura os nomes das funções na pilha de chamadas
para informar qual função origina a chamada atual:
A pilha de chamadas é uma pilha LIFO (Last In, First Out).
Você precisa se preocupar principalmente que seu código será executado em um único loop de
evento e escrever código com isso em mente para evitar bloqueá-lo.
O ambiente gerencia vários loops de eventos simultâneos, para lidar com chamadas de API, por
exemplo. Os Web Workers também são executados em seu próprio loop de eventos.
28.2. Bloqueando o loop de eventos
28.3. A pilha de chamadas
83
Machine Translated by Google
28.4. Uma explicação simples do loop de eventos
Vamos escolher um exemplo:
84
Machine Translated by Google
bar()
}
bar
foo()
const bar = () => console.log('bar')
const foo = () => {
base
const baz = () => console.log('baz')
console.log('foo') bar()
baz()
foo
Quando este código é executado, primeiro foo() é chamado. Dentro de foo() nós primeiro chamamos
Neste ponto, a pilha de chamadas se parece com isso:
, então chamamos baz() .
como esperado.
Este código imprime
85
Machine Translated by Google
O loop de eventos em cada iteração verifica se há algo na pilha de
chamadas e o executa:
86
Machine Translated by Google
O exemplo acima parece normal, não há nada de especial nele: JavaScript encontra coisas para executar,
executa-as em ordem.
até que a pilha de chamadas esteja vazia.
28,5. Execução da função de fila
87
Machine Translated by Google
Tome este exemplo:
Vamos ver como adiar uma função até que a pilha esteja limpa.
Este código imprime, talvez surpreendentemente:
Quando este código é executado, primeiro foo() é chamado. Dentro de foo(), primeiro chamamos
setTimeout, passando bar como argumento, e o instruímos a executar imediatamente o mais
rápido possível, passando 0 como o cronômetro. Então chamamos baz().
O caso de uso de setTimeout(() => {}, 0) é chamar uma função, mas executá-la assim que todas
as outras funções no código forem executadas.
Neste ponto, a pilha de chamadas se parece com isso:
foo()
const bar = () => console.log('bar')
base
}
console.log('foo')
setTimeout(bar, 0) baz()
bar
foo
const foo = () => {
const baz = () => console.log('baz')
88
Machine Translated by Google
Aqui está a ordem de execução para todas as funções em nosso programa:
89
Machine Translated by Google
Por que isso está acontecendo?
28.6. A fila de mensagens
90
Machine Translated by Google
Semelhante a um passeio de montanha-russa em um parque de diversões: a fila de
mensagens coloca você no final da fila, atrás de todas as outras pessoas, onde você terá
que esperar sua vez, enquanto a fila de trabalhos é o ticket fastpass que permite que
você pegue outro passeio logo após terminar o anterior.
O loop dá prioridade à pilha de chamadas e primeiro processa tudo o que encontra na
pilha de chamadas e, uma vez que não há nada lá, ele pega coisas na fila de mensagens.
A fila de mensagens também é onde os eventos iniciados pelo usuário, como eventos de
clique ou teclado, ou busca de respostas, são enfileirados antes que seu código tenha a
oportunidade de reagir a eles. Ou também eventos DOM como onload .
Exemplo:
Não precisamos esperar por funções como setTimeout
ECMAScript 2015 introduziu o conceito de Job Queue, que é usado por Promises
(também introduzido no ES6/ES2015). É uma maneira de executar o resultado de uma
função assíncrona o mais rápido possível, em vez de sercolocado no final da pilha de
chamadas.
fetch ou outras coisas para
fazer seu próprio trabalho, porque eles são fornecidos pelo navegador e vivem em seus
próprios threads. Por exemplo, se você definir o tempo limite setTimeout para 2 segundos,
não precisará esperar 2 segundos - a espera acontece em outro lugar.
Promessas que são resolvidas antes do término da função atual serão executadas logo
após a função atual.
,
Quando setTimeout() é chamado, o Browser ou Node.js inicia o cronômetro. Uma vez
que o temporizador expira, neste caso imediatamente quando colocamos 0 como o
tempo limite, a função de retorno de chamada é colocada na Fila de Mensagens.
28.7. Fila de Trabalho ES6
91
Machine Translated by Google
}
const foo = () => {
const baz = () => console.log('baz')
foo
base
console.log('foo')
setTimeout(bar, 0) new
Promise((resolver, rejeitar) =>
deve ser logo depois do baz, antes do bar bar
foo()
resolve('deveria estar logo depois do baz, antes do bar')
).then((resolver) => console.log(resolver)) baz()
const bar = () => console.log('bar')
Isso imprime
Finalmente, aqui está a aparência da pilha de chamadas para o exemplo acima:
Essa é uma grande diferença entre Promises (e Async/await, que é construído em
promessas) e funções assíncronas simples por meio de setTimeout() ou outras APIs
de plataforma.
92
Machine Translated by Google
Machine Translated by Google
,
process.nextTick() .
Ao tentar entender o loop de eventos do Node.js, uma parte importante dele é
Chamar setTimeout(() => {}, 0) executará a função no final do próximo tick, muito mais
tarde do que ao usar nextTick() , que prioriza a chamada e a executa logo antes do
início do próximo tick.
Toda vez que o loop de eventos faz uma viagem completa, chamamos de tick.
Use nextTick() quando quiser ter certeza de que na próxima iteração do loop de eventos
esse código já foi executado.
O loop de eventos está ocupado processando o código de função atual.
Quando passamos uma função para process.nextTick() , instruímos o mecanismo a
invocar essa função no final da operação atual, antes que o próximo ciclo de evento
comece:
Quando você deseja executar algum código de forma assíncrona, mas o mais rápido
possível, uma opção é usar a função setImmediate() fornecida pelo Node.js:
Quando essa operação termina, o mecanismo JS executa todas as funções passadas
para as chamadas nextTick durante essa operação.
É a maneira como podemos dizer ao mecanismo JS para processar uma função de
forma assíncrona (após a função atual), mas o mais rápido possível, não a enfileirar.
process.nextTick(() => { //
faça algo })
29. Entendendo o
processo.nextTick()
30. Entendendo setImmediate()
94
Machine Translated by Google
process.nextTick() e Promise.then() :
})
// executa algo
promete fila de microtarefas
setTimeout O retorno de chamada setImmediate é adicionado à fila de macrotarefas .
O retorno de chamada Promise.then() é adicionado à fila de microtarefas de promessas .
Aqui está um exemplo para mostrar a ordem entre setImmediate()
setImediato(() => {
e, em seguida, executa a fila de macrotarefas .
Qualquer função passada como o argumento setImmediate() é um callback que é
A ordem de execução dependerá de vários fatores, mas ambos serão executados
na próxima iteração do loop de eventos.
Um retorno de chamada setTimeout() com um atraso de 0ms é muito semelhante a setImmediate() .
significa que ele sempre será executado antes de setTimeout e setImmediate .
O loop de eventos executa as tarefas na fila process.nextTick primeiro e depois executa
,
iteração atual do loop de eventos, após o término da operação atual. este
UMA
,
Uma função passada para process.nextTick() será executada no
0ms tempo limite), e de process.nextTick() e Promise.then() ?
UMA
Como setImmediate() é diferente de setTimeout(() => {}, 0) (passando um
executado na próxima iteração do loop de eventos.
Um retorno de chamada process.nextTick é adicionado à fila process.nextTick .
,
95
Machine Translated by Google
Ao escrever código JavaScript, você pode querer atrasar a execução de um
,
,
Este é o trabalho de setTimeout . Você especifica uma função de retorno de chamada para executar
mais tarde e um valor que expressa quanto tempo depois você deseja que ela seja executada, em milissegundos:
função.
então chame foo() em process.nextTick
que imprime
bar e adiciona zoo() na fila process.nextTick ao mesmo tempo. Em
seguida, ele chamará zoo() que acabou de ser adicionado. No final, o
baz() na fila de macrotarefas é chamado.
31. Descubra temporizadores JavaScript
96
const baz = () => console.log('baz') const
foo = () => console.log('foo') const zoo =
() => console.log('zoo') const start = () =>
{
} começar()
Este código irá primeiro chamar start()
console.log('start')
setImmediate(baz) new
Promise((resolver, rejeitar) =>
{ resolve('bar') }).then((resolver) =>
{ console.log(resolve)
process.nextTick( zoo) })
process.nextTick(foo)
// inicia foo bar zoo baz
fila . Depois disso, ele lidará com a fila de microtarefas de promessas
31.1. setTimeout()
Machine Translated by Google
Se você especificar o atraso de tempo
limite para 0 o mais rápido possível, mas após a execução da função atual:
,
Essa sintaxe define uma nova função. Você pode chamar qualquer outra função que
desejar, ou pode passar um nome de função existente e um conjunto de parâmetros:
a função de retorno de chamada será executada
31.1.1. Atraso zero
// executa após 2 segundos
setTimeout(() => { //
executa após 2 segundos },
2000)
const id = setTimeout(() => {
}
setTimeout retorna o ID do temporizador. Isso geralmente não é usado, mas você pode armazenar esse
id e limpá-lo se quiser excluir esta execução de função agendada:
// deve ser executado após 2
segundos }, 2000)
const myFunction = (firstParam, secondParam) => { // faça algo
setTimeout(myFunction, 2000, firstParam, secondParam)
// Mudei de ideia
clearTimeout(id)
setTimeout(() => { //
executa após 50 milissegundos
}, 50)
97
Machine Translated by Google
Alguns navegadores (IE e Edge) implementam um método setImmediate() que faz
exatamente a mesma funcionalidade, mas não é padrão e não está disponível em
outros navegadores. Mas é uma função padrão no Node.js.
com uma diferença: em vez
Isso é especialmente útil para evitar o bloqueio da CPU em tarefas intensivas e permitir
que outras funções sejam executadas durante a execução de um cálculo pesado,
enfileirando funções no escalonador.
, passando o ID do intervalo que setInterval retornou:
A função acima é executada a cada 2 segundos, a menos que você diga para parar, usando
de executar a função de retorno de chamada uma vez, ela a executará para sempre, no intervalo
de tempo específico que você especificar (em milissegundos):
,
Este código será impresso
31.2. setInterval()
setTimeout(() =>
{ console.log('depois ') }, 0)
depois
setInterval é uma função semelhante a setTimeout
console.log(' antes ')
antes da
setInterval(()=> { // executa
a cada 2 segundos }, 2000)
clearInterval
98
Machine Translated by Google
https://caniuse.com/#feat=setimmediate
https://caniuse.com/#feat=setimmediate
É comum chamar clearInterval dentro da função de retorno de chamada setInterval, para
permitir que ela determine automaticamente se deve ser executada novamente ou parar.
Por exemplo, este código executa algo, a menos que App.somethingIWait tenha o valor chegado :
consideração sobre quando uma função terminou sua execução.
Talvez a função leve tempos de execução diferentes, dependendo das condições da rede,
por exemplo:
Se uma função sempre leva a mesma quantidade de tempo, está tudo bem:
E talvez uma longa execução se sobreponha à próxima:
inicia uma função a cada n milissegundos, sem nenhum
31.3. Conjunto recursivoTempo limite
const id = setInterval(() => { // executa
a cada 2 segundos }, 2000)
if (App.somethingIWait === 'chegou')
{ clearInterval(interval)
setInterval
clearInterval(id)
const intervalo = setInterval(() => {
} // caso contrário faça as
coisas }, 100)
99
Machine Translated by Google
setTimeout(minhaFunção, 1000)
setTimeout(minhaFunção, 1000)
const minhaFunção = () => { //
faça algo
}
No backend, o Node.js nos oferece a opção de construir um sistema semelhante usando o
módulo de eventos .
32. O emissor do evento do nó
, usado principalmente para trabalhar com o loop de eventos do Node.js. setTimeout(() => {}, 0)
para alcançar este cenário:
que é equivalente a usar
Para evitar isso, você pode agendar um setTimeout recursivo para ser chamado quando a
função de retorno de chamada terminar:
Se você trabalhou com JavaScript no navegador, sabe quanto da interação do
usuário é tratada por meio de eventos: cliques do mouse, pressionamentos de
botões do teclado, reação aos movimentos do mouse e assim por diante.
Node.js também fornece setImmediate()
módulo.
,
setTimeout e setInterval estão disponíveis no Node.js, por meio dos Timers
100
Machine Translated by Google
https://nodejs.org/api/events.html
https://nodejs.org/api/events.html
https://nodejs.org/api/timers.html
https://nodejs.org/api/timers.html
https://nodejs.org/api/timers.html
https://nodejs.org/api/timers.html
https://nodejs.org/api/timers.html
Você inicializa isso usando
emitéusado para acionar um evento
on é usado para adicionar uma função de retorno de chamada que será executada
quando o evento for acionado
a função do manipulador de eventos é acionada e obtemos o log do console.
Este módulo, em particular, oferece a classe EventEmitter , que usaremos para lidar
com nossos eventos.
Este objeto expõe, entre muitos outros, os métodos on e emit .
Quando nós corremos
argumentos para emitir() :
Você pode passar argumentos para o manipulador de eventos passando-os como adicionais
Por exemplo, vamos criar um evento start e, para fornecer uma amostra, reagimos a
isso apenas logando no console:
Vários argumentos:
const eventEmitter = new EventEmitter()
eventEmitter.emit('start', 23)
const EventEmitter = require('eventos')
eventEmitter.emit('start')
eventEmitter.on('start', () =>
{ console.log('started') })
eventEmitter.on('start', (number) =>
{ console.log(`started ${number}`) })
101
Machine Translated by Google
O objeto EventEmitter também expõe vários outros métodos para interagir com eventos, como
Antes de poder interagir com um arquivo que está em seu sistema de arquivos, você deve obter
um descritor de arquivo.
Outros sinalizadores que você costuma usar são:
Observe o r que usamos como o segundo parâmetro para a chamada fs.open() .
Um descritor de arquivo é uma referência a um arquivo aberto, um número (fd) retornado pela
abertura do arquivo usando o método open() oferecido pelo módulo fs . Este número ( fd ) identifica
exclusivamente um arquivo aberto no sistema operacional:
Esse sinalizador significa que abrimos o arquivo para leitura.
33. Trabalhando com descritores de arquivo
no Node
console.log(`começou de ${start} a ${end}`) })
const fs = require('fs')
removeListener() / off() : remove um ouvinte de evento de um evento
removeAllListeners() : remove todos os ouvintes de um evento
eventEmitter.on('start', (start, end) => {
once() : adiciona um ouvinte único
// fd é nosso descritor de arquivo })
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
eventEmitter.emit('start', 1, 100)
Você pode ler todos os detalhes na página do módulo de eventos em https://nodejs.org/api/
events.html
102
Machine Translated by Google
https://nodejs.org/api/events.html
w+ abre o arquivo para leitura e escrita, posicionando o stream na
a abra o arquivo para escrita, posicionando o stream no final do arquivo.
const fs = require('fs')
}
r+ abre o arquivo para leitura e escrita, se o arquivo não existir ele não será criado.
try
{ const fd = fs.openSync('/Users/joe/test.txt', 'r') } catch (err)
{ console.error(err)
Você também pode abrir o arquivo usando o método fsPromises.open baseado em
promessa oferecido pelo módulo fs/promises .
métodos.
O arquivo é criado se não existir.
a+ abre o arquivo para leitura e escrita, posicionando o stream no final do
arquivo. O arquivo é criado se não existir.
início do arquivo. O arquivo é criado se não existir.
Depois de obter o descritor de arquivo, da maneira que você escolher, você pode
executar todas as operações que o requerem, como chamar fs.close() e muitas
outras operações que interagem com o sistema de arquivos.
O módulo fs/promises está disponível apenas a partir do Node.js v14. Antes da v14,
depois da v10, você pode usar require('fs').promises . Antes da v10, após a v8, você
pode usar util.promisify para converter métodos fs em métodos baseados em promessa
Você também pode abrir o arquivo usando o método fs.openSync , que retorna o
descritor do arquivo, em vez de fornecê-lo em um retorno de chamada:
103
Machine Translated by Google
API.
Cada arquivo vem com um conjunto de detalhes que podemos inspecionar usando o Node.js.
Você o chama passando um caminho de arquivo e, assim que o Node.js obtiver os detalhes do arquivo,
ele chamará a função de retorno de chamada que você passar, com 2 parâmetros: uma mensagem de
erro e as estatísticas do arquivo:
Em particular, usando o método stat() fornecido pelo módulo fs .
Aqui está um exemplo de util.promisify :
34. Estatísticas do arquivo do nó
} exemplo()
exemplo de função assíncrona ()
{ const open = util.promisify(fs.open) const
fd = await open('/Users/joe/test.txt', 'r')
} exemplo()
const fs = require('fs/promessas')
Para ver mais detalhes sobre o módulo fs/promises , verifique fs/promises
const fs = require('fs') const
util = require('util')
try
{ filehandle = await fs.open('/Users/joe/test.txt', 'r')
console.log(filehandle.fd) console.log(await
filehandle.readFile({ encoding: 'utf8' })) } finalmente { await filehandle.close()
// Ou const fs = require('fs').promises antes da v14. exemplo de
função assíncrona () { let filehandle
}
104
Machine Translated by Google
https://nodejs.org/docs/latest-v17.x/api/fs.html#promises-api
https://nodejs.org/docs/latest-v17.x/api/fs.html#promises-apihttps://nodejs.org/docs/latest-v17.x/api/fs.html#promises-api
https://nodejs.org/docs/latest-v17.x/api/fs.html#promises-api
})
try
{ const stats = fs.statSync('/Users/joe/test.txt') } catch (err)
{ console.error(err)
stats.isDirectory()
}
const fs = require('fs')
const fs = require('fs')
console.error(err)
fs.stat('/Users/joe/test.txt', (err, stats) => { if (err) {
} // temos acesso ao arquivo stats em ̀stats`
As informações do arquivo são incluídas na variável stats. Que tipo de
Muito, incluindo:
Existem outros métodos avançados, mas a maior parte do que você usará em sua programação
do dia-a-dia é isso.
informações que podemos extrair usando as estatísticas?
se o arquivo for um diretório ou um arquivo, usando stats.isFile() e
O Node.js também fornece um método de sincronização, que bloqueia o encadeamento até que as estatísticas
do arquivo estejam prontas:
se o arquivo for um link simbólico usando stats.isSymbolicLink() o
tamanho do arquivo em bytes usando stats.size .
105
Machine Translated by Google
Você também pode usar o método fsPromises.stat() baseado em promessa oferecido pelo
Cada arquivo no sistema tem um caminho.
No Linux e no macOS, um caminho pode ter a seguinte aparência:
35. Caminhos de arquivos de nós
console.log(err)
Retorna
} pegar (errar) {
console.error(err)
fs.stat('/Users/joe/test.txt', (err, stats) => { if (err) {
async function example() { try
{ const stats = await fs.stat('/
Users/joe/test.txt') stats.isFile() // true stats.isDirectory() // false
stats.isSymbolicLink() // false stats.size // 1024000 //= 1 MB
/users/joe/arquivo.txt
const fs = require('fs')
const fs = require('fs/promessas')
fs/promises se você quiser:
})
stats.isFile() // true
stats.isDirectory() // false
stats.isSymbolicLink() // false stats.size //
1024000 //= 1 MB
} exemplo()
}
}
106
Machine Translated by Google
path.basename(notes, path.extname(notes)) // notas
const notas = '/users/joe/notes.txt'
path.dirname(notes) // /users/joe
path.basename(notes) // notes.txt
path.extname(notes) // .txt
const caminho = require('caminho')
C:\users\joe\arquivo.txt
35.1. Obtendo informações de um caminho
35.2. Trabalhando com caminhos
argumento para basename :
Exemplo:
Você precisa prestar atenção ao usar caminhos em seus aplicativos, pois isso
e você pode começar a usar seus métodos.
diferença deve ser levada em consideração.
Dado um caminho, você pode extrair informações dele usando esses métodos:
Você pode unir duas ou mais partes de um caminho usando path.join() :
Você pode obter o nome do arquivo sem a extensão especificando um segundo
Você inclui este módulo em seus arquivos usando
enquanto os computadores Windows são diferentes e possuem uma estrutura como:
dirname : obtém a pasta pai de um arquivo
basename : obtém a parte do nome do arquivo
extname : obtém a extensão do arquivo
107
Machine Translated by Google
A maneira mais simples de ler um arquivo em Node.js é usar o método
fs.readFile() , passando o caminho do arquivo, a codificação e uma função de
callback que será chamada com os dados do arquivo (e o erro):
Você pode obter o cálculo do caminho absoluto de um caminho relativo usando
,
Nesse caso, o Node.js simplesmente anexará /joe.txt ao diretório de trabalho
atual. Se você especificar uma segunda pasta de parâmetros, o resolve usará a
primeira como base para a segunda:
Se o primeiro parâmetro começar com uma barra, isso significa que é um caminho absoluto:
caminho real, quando contém especificadores relativos como .
ou .. barras:
Nem resolver nem normalizar verificarão se o caminho existe. Eles apenas
calculam um caminho com base nas informações que obtiveram.
36. Lendo arquivos com o Node
path.resolve('/etc', 'joe.txt') // '/etc/joe.txt'
const name = 'joe'
path.join('/', 'users', name, 'notes.txt') // '/users/joe/notes.txt'
path.resolve('joe.txt') // '/Users/joe/joe.txt' se executado da minha pasta pessoal
path.resolve('tmp', 'joe.txt') // '/Users/joe/tmp/joe.txt' se executado a partir do meu
path.normalize() é outra função útil, que tentará calcular o ou double
path.normalize('/users/joe/..//test.txt') // '/users/test.txt'
path.resolve() :
108
Machine Translated by Google
console.error(err)
função assíncrona example() { try
{ const data = await fs.readFile('/
Users/joe/test.txt', { encoding: 'utf console.log(data) } catch (err) {
const fs = require('fs/promessas')
se (erro) {
fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => {
fs.readFileSync() e fsPromises.readFile()
const fs = require('fs')
}
try
{ const data = fs.readFileSync('/Users/joe/test.txt', 'utf8') console.log(data) }
catch (err) { console.error(err)
Todos os três de fs.readFile()
const fs = require('fs')
} exemplo()
} console.log(dados) })
}
console.log(err)
Retorna
Como alternativa, você pode usar a versão síncrona fs.readFileSync() :
leia todo o conteúdo do arquivo na memória antes de retornar os dados.
Você também pode usar o método fsPromises.readFile() baseado em promessa
oferecido pelo módulo fs/promises :
,
109
Machine Translated by Google
37. Gravando arquivos com Node
const content = 'Algum conteúdo!'
fs.writeFile('/Users/joe/test.txt', content, (err) => {
const fs = require('fs')
const content = 'Algum conteúdo!'
}
const fs = require('fs')
} catch (err)
{ console.error(err)
} // arquivo escrito com sucesso })
try
{ fs.writeFileSync('/Users/joe/test.txt', content) // arquivo escrito com
sucesso
if (err)
{ console.error(err)
Isso significa que arquivos grandes terão um grande impacto no consumo de
memória e na velocidade de execução do programa.
Exemplo:
Nesse caso, a melhor opção é ler o conteúdo do arquivo usando fluxos.
A maneira mais fácil de gravar em arquivos no Node.js é usar a API fs.writeFile() .
Como alternativa, você pode usar a versão síncrona fs.writeFileSync() :
Você também pode usar o método fsPromises.writeFile() baseado em promessa
oferecido pelo módulo fs/promises :
110
Machine Translated by Google
no
Um método útil para anexar conteúdo ao final de um arquivo é fs.appendFile() (e sua contraparte
fs.appendFileSync() ):
bandeiras
Os sinalizadores que você provavelmente usará são
O arquivo é criado se não existir
maisachar
Você pode modificar o padrão especificando um sinalizador:
início do arquivo. O arquivo é criado se não existir
posso
Por padrão, esta API substituirá o conteúdo do arquivo se ele já existir.
final do arquivo. O arquivo é criado se não existir
37.1. Anexar a um arquivo
console.log(err)
a abra o arquivo para escrita, posicionando o stream no final do arquivo.
(você
https://nodejs.org/api/fs.html#fs_file_system_flags)
await fs.writeFile('/Users/joe/test.txt', content) } catch (err) {
async function example() { try
{ const content = 'Algum
conteúdo!'
r+ abre o arquivo para leitura e escrita w+ abre
o arquivo para leitura e escrita, posicionando o stream na
} exemplo()
a+ abre o arquivo para leitura e escrita, posicionando o stream na
const fs = require('fs/promessas')
}
fs.writeFile('/Users/joe/test.txt', content, { flag: 'a+' }, (err) => {})
111
Machine Translated by Google
https://nodejs.org/api/fs.html#fs_file_system_flagsO módulo principal do Node.js fs fornece muitos métodos úteis que você pode usar para
Nesse caso, uma opção melhor é gravar o conteúdo do arquivo usando fluxos.
Aqui está um exemplo de fsPromises.appendFile() :
trabalhar com pastas.
Todos esses métodos gravam o conteúdo completo no arquivo antes de retornar o
controle de volta ao seu programa (na versão assíncrona, isso significa executar o
retorno de chamada)
37.2. Como usar fluxos
38.1. Verifique se existe uma pasta
112
}
} exemplo()
const fs = require('fs/promessas')
}
console.error(err)
fs.appendFile('file.log', content, (err) => { if (err) {
console.log(err)
})
const content = 'Algum conteúdo!'
await fs.appendFile('/Users/joe/test.txt', content) } catch (err) {
// feito!
async function example() { try
{ const content = 'Algum
conteúdo!'
38. Trabalhando com pastas
Machine Translated by Google
}
tente
{ if (!fs.existsSync(folderName))
{ fs.mkdirSync(folderName)
fs.readdirSync(folderPath)
const folderName = '/Users/joe/test'
const folderPath = '/Users/joe'
}
const fs = require('fs')
const fs = require('fs')
} catch (err)
{ console.error(err)
38.2. Criar uma nova pasta
38.3. Ler o conteúdo de um diretório
Use fs.access() (e seu equivalente baseado em promessa fsPromises.access() )
para verificar se a pasta existe e o Node.js pode acessá-la com suas permissões.
pasta.
Use fs.readdir() ou fs.readdirSync() ou fsPromises.readdir() para ler o conteúdo
de um diretório.
Este pedaço de código lê o conteúdo de uma pasta, tanto arquivos quanto
subpastas, e retorna seu caminho relativo:
Você pode obter o caminho completo:
Use fs.mkdir() ou fs.mkdirSync() ou fsPromises.mkdir() para criar um novo
113
Machine Translated by Google
Você também pode filtrar os resultados para retornar apenas os arquivos e excluir as pastas:
pasta. O primeiro parâmetro é o caminho atual, o segundo o novo caminho:
Use fs.rename() ou fs.renameSync() ou fsPromises.rename() para renomear
38.4. Renomear uma pasta
return fs.lstatSync(fileName).isFile()
if (err)
{ console.error(err)
fs.rename('/Users/joe', '/Users/roger', (err) => {
const isFile = (fileName) => {
const fs = require('fs')
}
} catch (err)
{ console.error(err)
fs.readdirSync(folderPath).map((fileName) => { return
path.join(folderPath, fileName) })
tente
{ fs.renameSync('/Users/joe', '/Users/roger')
const fs = require('fs')
return path.join(folderPath, fileName) }) .filter(isFile)
fs.renameSync() é a versão síncrona:
fs.readdirSync(folderPath) .map((fileName) => {
})
} // feito
}
114
Machine Translated by Google
Use fs.rmdir() ou fs.rmdirSync() ou fsPromises.rmdir() para remover uma pasta.
Você pode passar a opção { recursive: true } para remover recursivamente o
NOTA: No Node v16.x , a opção recursiva está obsoleta para fs.rmdir da API
de retorno de chamada, em vez disso, use fs.rm para excluir pastas que tenham
conteúdo neles:
Remover uma pasta com conteúdo pode ser mais complicado do que você precisa.
conteúdo.
38,5. Remover uma pasta
}
jogar errar
fsPromises.rename() é a versão baseada em promessa:
}
console.log(err)
fs.rmdir(dir, { recursive: true }, (err) => { if (err) {
console.log(`${dir} foi deletado!̀ ) })
} pegar (errar) {
const fs = require('fs')
} exemplo()
exemplo de função assíncrona ()
{ try { await fs.rename('/Users/
joe', '/Users/roger')
const fs = require('fs/promessas')
115
Machine Translated by Google
jogar errar
pasta const = '/Usuários/joe'
const fs = require('fs-extra')
se (erro) {
fs.rm(dir, { recursive: true, force: true }, (err) => {
})
const fs = require('fs')
npm instalar fs-extra
console.error(err)
//
feito }) .catch((err) => {
fs.remove(pasta) .then(()
=> {
Ou você pode instalar e usar o fs-extra módulo, que é muito popular e bem conservado. É uma substituição
imediata do módulo fs , que fornece mais recursos em cima dele.
console.log(`${dir} foi deletado!̀ ) })
fs.remove(pasta, (err) =>
{ console.error(err) })
}
Nesse caso, o método remove() é o que você deseja.
e use assim:
Instale-o usando
Também pode ser usado com promessas:
116
Machine Translated by Google
https://www.npmjs.com/package/fs-extra
// feito
const fs = require('fs')
}
fs.fchmod()
try
{ await fs.remove(pasta)
}
função assíncrona removeFolder(pasta) {
fs.lcown()
console.error(err)
} pegar (errar) {
pasta const = '/Usuários/joe'
removeFolder(pasta)
39. O módulo Node fs
,
fs.appendFile() : anexa dados a um arquivo. Se o arquivo não existir, é
Não há necessidade de instalá-lo. Sendo parte do núcleo do Node.js, ele pode ser
usado simplesmente exigindo:
permissões
,
O módulo fs fornece muitas funcionalidades muito úteis para acessar e interagir com
o sistema de arquivos.
passado. Relacionado: fs.lchmod()
fs.access() : verifica se o arquivo existe e o Node.js pode acessá-lo com seu
fs.chmod() : altera as permissões de um arquivo especificado pelo nome do arquivo
ou com assíncrono/aguardar:
Depois de fazer isso, você tem acesso a todos os seus métodos, que incluem:
fs.chown() : altera o proprietário e o grupo de um arquivo especificado pelo
nome do arquivo passado. Relacionado: fs.fchown() fs.close() : fecha um descritor
de arquivo fs.copyFile() : copia um arquivo
criada
117
Machine Translated by Google
fs.mkdir() : cria uma nova pasta
fs.lstat()
fs.renameSync()
passado. Relacionado: fs.fstat()
fs.symlink() : cria um novo link simbólico para um arquivo
fs.truncate() : trunca para o tamanho especificado o arquivo identificado pelo nome do
arquivo passado. Relacionado: fs.ftruncate() fs.unlink() : remover um arquivo ou um link
simbólico fs.unwatchFile() : parar de observar alterações em um arquivo fs.utimes() : alterar
o carimbo de data/hora do arquivo identificado pelo nome do arquivo passado . Relacionado:
fs.futimes()
fs.link() : cria um novo link físico para um arquivo
fs.rename()
fs.createWriteStream() : cria um fluxo de arquivo gravável
fs.stat() : retorna o status do arquivo identificado pelo nome do arquivo
Sincronizar .
fs.createReadStream() : cria um fluxo de arquivo legível
fs.rmdir() : remove uma pasta
fs.writeFile() : grava dados em um arquivo. Relacionado: fs.write()
.. ) ao máximo
fs.readlink() : lê o valor de um link simbólico fs.realpath() :
resolve ponteiros de caminho de arquivo relativo ( . path
fs.rename() : renomeia um arquivo ou pasta
fs.watch()
manipulação
fs.readdir() : lê o conteúdo de um diretório fs.readFile() :
lê o conteúdo de um arquivo. Relacionado: fs.read()
fs.watchFile() : comece a observar as alterações em um arquivo. Relacionado:
fs.write()
fs.mkdtemp() : cria um diretório temporário fs.open() :
abre o arquivo e retorna um descritor de arquivo para permitir o arquivo
Uma coisa peculiar sobre o módulo fs é que todos os métodos são
assíncronos por padrão, mas também podem funcionar de forma síncrona anexando
,
,
Por exemplo:
118
Machine Translated by Google
}
// feito })
try
{ fs.renameSync('before.json', 'after.json') // feito }
catch (err) { console.error(err)
}
const fs = require('fs')
fs.rename('before.json', 'after.json', (err) => { if (err) { return
console.error(err)
fs.writeSync()const fs = require('fs')
Por exemplo, vamos examinar o método fs.rename() . A API assíncrona é usada
com um retorno de chamada:
Isso faz uma enorme diferença no fluxo do seu aplicativo.
Uma API síncrona pode ser usada assim, com um bloco try/catch para manipular
Node.js 10 inclui suporte experimental para uma API baseada em promessa
erros:
A principal diferença aqui é que a execução do seu script será bloqueada no
segundo exemplo, até que a operação do arquivo seja bem-sucedida.
Você pode usar a API baseada em promessa fornecida pelo módulo fs/promises para evitar o uso da
API baseada em retorno de chamada, o que pode causar um inferno de retorno de chamada. Aqui está um exemplo:
119
Machine Translated by Google
https://nodejs.org/api/fs.html#fs_fs_promises_api
http://callbackhell.com/
} console.log(data)
const content = 'Algum conteúdo!'
if (err3) {
}) }) })
Retorna
} console.log('Escreveu algum conteúdo!')
fs.readFile(fileName, 'utf8', (err3, data3) => {
const fileName = '/Users/joe/test.txt'
fs.readFile(fileName, 'utf8', (err, data) => { if (err)
{ console.log(err)
} console.log(data3)
Retorna
// Exemplo: Ler um arquivo e alterar seu conteúdo e lê-lo // novamente
usando a API baseada em retorno de chamada. const fs = require('fs')
Retorna
fs.writeFile(fileName, content, (err2) => { if (err2)
{ console.log(err2)
console.log(err3)
A API baseada em retorno de chamada pode aumentar o inferno de retorno de chamada quando há muitos
retornos de chamada aninhados. Podemos simplesmente usar a API baseada em promessas para evitá-la:
120
Machine Translated by Google
121
40. O módulo do caminho do nó
Não há necessidade de instalá-lo. Sendo parte do núcleo do Node.js, ele pode ser
usado simplesmente exigindo:
Este módulo fornece path.sep que fornece o separador de segmento de caminho ( \
no Windows e / no Linux / macOS) e path.delimiter que fornece o delimitador de
caminho ( ; no Windows e : no Linux / macOS).
Estes são os métodos de caminho :
O módulo path fornece muitas funcionalidades muito úteis para acessar e interagir
com o sistema de arquivos.
await fs.writeFile(fileName, content)
console.log('Escreveu algum conteúdo!')
const newData = await fs.readFile(fileName, 'utf8')
console.log(newData) } catch (err) {
const fileName = '/Users/joe/test.txt' try { const
data = await fs.readFile(fileName, 'utf8')
console.log(data) const content = 'Algum conteúdo!'
} exemplo()
exemplo de função assíncrona () {
const caminho = require('caminho')
}
// Exemplo: Ler um arquivo e alterar seu conteúdo e // lê-lo novamente
usando a API baseada em promessa. const fs = require('fs/promessas')
console.log(err)
40.0.1. path.basename()
Machine Translated by Google
''
require('path').basename('/test/something') // algo
require('path').basename('/test/something.txt') // algo.txt
require('path').basename ('/test/something.txt', '.txt') // algo
require('path').extname('/test/something') //
require('path').extname('/test/something/file.txt') // '.txt'
require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something
40.0.3. caminho.extname()
40.0.2. path.dirname()
40.0.4. caminho.formato()
122
dir : o caminho da pasta a partir da base raiz : o nome
do arquivo + extensão
Retorne a parte do diretório de um caminho:
raiz : a raiz
Retorna a parte de extensão de um caminho
a raiz é ignorada se o dir for fornecido ext
e o nome será ignorado se a base existir
Retorna uma string de caminho de um objeto. Este é o oposto de path.parse path.format
aceita um objeto como argumento com as seguintes chaves:
ext : a extensão do arquivo
Retorna a última parte de um caminho. Um segundo parâmetro pode filtrar a extensão do arquivo:
nome : o nome do arquivo
Machine Translated by Google
40.0.7. caminho.normalize()
40.0.8. caminho.parse()
40.0.5. path.isAbsolute()
40.0.6. caminho.join()
123
ou ..
raiz : a raiz
// WINDOWS
require('path').format({ dir: 'C:\\Users\\joe', base: 'test.txt' }) // 'C
require('path').format({ root: '/Users/joe', name: 'test', ext: '.txt' })
Tenta calcular o caminho real quando contém especificadores relativos como .
require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false
require('path').normalize('/users/joe/..//test.txt') // '/users/test.txt'
// POSIX
require('path').format({ dir: '/Users/joe', base: 'test.txt' }) // '/User
dir : o caminho da pasta a partir da raiz
const name = 'joe'
require('path').join('/', 'users', name, 'notes.txt') // '/users/joe/notes
Retorna true se for um caminho absoluto
Une duas ou mais partes de um caminho:
,
Analisa um caminho para um objeto com os segmentos que o compõem:
ou barras duplas:
Machine Translated by Google
Exemplo:
Você pode obter o cálculo do caminho absoluto de um caminho relativo usando
resulta em
Exemplo:
Aceita 2 caminhos como argumentos. Retorna o caminho relativo do primeiro
caminho para o segundo, com base no diretório de trabalho atual.
40.0.10. path.resolve()
40.0.9. caminho.relativo()
124
require('path').relative('/Users/joe', '/Users/joe/test.txt') // 'test.txt require('path').relative('/
Users/joe', ' /Users/joe/something/test.txt') //
path.resolve() :
root: '/', dir:
'/users', base:
'test.txt', ext: '.txt',
require('path').resolve('joe.txt') // '/Users/joe/joe.txt' se executado a partir do meu
ext : a extensão do arquivo
{
nome : o nome do arquivo
base : o nome do arquivo + extensão
}
require('path').parse('/users/test.txt')
nome: 'teste'
Machine Translated by Google
require('path').resolve('/etc', 'joe.txt') // '/etc/joe.txt'
require('path').resolve('tmp', 'joe.txt') // '/Users/joe/tmp/joe.txt' if r
os.constants.errno
const os = require('os')
41. O módulo Node os
125
Se o primeiro parâmetro começar com uma barra, isso significa que é um caminho absoluto:
os.EOL fornece a sequência do delimitador de linha. É \n no Linux e macOS, e
Vejamos agora os principais métodos que o sistema operacional disponibiliza:
manipulação de arquivos:
https://nodejs.org/api/os.html#os_signal_constants.
segundo:
Existem algumas propriedades úteis que nos dizem algumas coisas importantes relacionadas a
Você ler
Ao especificar um segundo parâmetro, o resolve usará o primeiro como base para o
sobre
EADDRINUSE, EOVERFLOW e muito mais.
programa é executado e interage com ele.
define as constantes para relatórios de erros, como
informações do sistema operacional subjacente e do computador que
posso
Este módulo fornece muitas funções que você pode usar para recuperar
sinais, como SIGHUP, SIGKILL e assim por diante.
tudoeles
os.constants.signals nos informa todas as constantes relacionadas ao processo de manipulação
\r\n no Windows.
41.1. os.arch()
Machine Translated by Google
https://nodejs.org/api/os.html#os_signal_constants
/*
modelo: 'Intel(R) Core(TM)2 Duo velocidade
da CPU: 2400, vezes: { user: 282348700,
nice: 0, sys: 161800480, idle: 703509470,
irq: 0, }, },
modelo: 'Intel(R) Core(TM)2 Duo velocidade
da CPU: 2400, vezes: { user: 281685380,
nice: 0, sys: 187986530, idle: 685833750,
irq: 0, }, }, {
*/
]
x64
{
P8600 @ 2,40Como criar um fluxo legível 44.8. Como
criar um fluxo gravável 44.9. Como obter
dados de um fluxo legível 44.10. Como enviar dados
para um fluxo gravável 44.11. Sinalizando um fluxo
gravável que você terminou de escrever 44.12. Como criar um
stream de transformação 45. Node, a diferença entre
desenvolvimento e produção 46. Tratamento de erros no Node.js 46.1.
Criando exceções 46.2. Objetos de erro 46.3. Tratamento de exceções
46.4. Capturando exceções não capturadas 46.5. Exceções com
promessas 46.6. Tratamento de erros com async/await
47. Construir um servidor
HTTP 48. Fazendo solicitações HTTP com
Node.js 48.1. Executar uma solicitação
GET 48.2. Execute uma solicitação POST
48.3. PUT e DELETE 49. Obtenha dados
do corpo da solicitação HTTP
1. Introdução ao Node.js
9
Machine Translated by Google
Quando o Node.js executa uma operação de E/S, como ler da rede, acessar um
banco de dados ou sistema de arquivos, em vez de bloquear a thread e desperdiçar
ciclos de CPU esperando, o Node.js retomará as operações quando a resposta
voltar.
O Node.js tem uma vantagem única porque milhões de desenvolvedores front-end
que escrevem JavaScript para o navegador agora podem escrever o código do
lado do servidor, além do código do lado do cliente, sem a necessidade de aprender
uma linguagem completamente diferente.
No Node.js, os novos padrões ECMAScript podem ser usados sem problemas,
pois você não precisa esperar que todos os seus usuários atualizem seus
navegadores - você é responsável por decidir qual versão do ECMAScript usar
alterando a versão do Node.js, e você também pode ativar recursos experimentais
específicos executando o Node.js com sinalizadores.
Isso permite que o Node.js lide com milhares de conexões simultâneas com um
único servidor sem introduzir o fardo de gerenciar a simultaneidade de threads, o
que pode ser uma fonte significativa de bugs.
Um aplicativo Node.js é executado em um único processo, sem criar um novo
thread para cada solicitação. O Node.js fornece um conjunto de primitivas de E/S
assíncronas em sua biblioteca padrão que impedem o bloqueio do código
JavaScript e, geralmente, as bibliotecas no Node.js são escritas usando paradigmas
sem bloqueio, tornando o comportamento de bloqueio a exceção e não a norma.
npm com sua estrutura simples ajudou o ecossistema de node.js a proliferar e
agora o registro npm hospeda quase 500.000 pacotes de código aberto que você
pode usar livremente.
O exemplo mais comum Hello World of Node.js é um servidor web:
1.1. Node.js tem um grande número de bibliotecas
1.2. Um exemplo de aplicativo Node.js
10
Machine Translated by Google
https://flaviocopes.com/npm/
porta const = 3000
server.listen(porta, hostname, () => {
const http = require('http')
const nome do host = '127.0.0.1'
const server = http.createServer((req, res) => { res.statusCode
= 200
Esse código inclui primeiro o módulo http Node.js.
console.log(`Servidor rodando em http://${hostname}:${port}/`) })
res.setHeader('Content-Type', 'text/plain') res.end('Hello
World\n')
})
Sempre que uma nova solicitação é recebida, o evento de solicitação é chamado, fornecendo
dois objetos: um pedido (um http.IncomingMessage objeto) e uma resposta (um
http.ServerResponse objeto).
Esses 2 objetos são essenciais para lidar com a chamada HTTP.
O Node.js tem uma biblioteca padrão incrível, incluindo um suporte de primeira classe
para redes.
devolve.
O primeiro fornece os detalhes da solicitação. Neste exemplo simples, isso não é usado,
mas você pode acessar os cabeçalhos da solicitação e os dados da solicitação.
O método createServer() de http cria um novo servidor HTTP e
O servidor está configurado para escutar na porta e no nome do host especificados.
Quando o servidor está pronto, a função callback é chamada, neste caso nos informando
que o servidor está rodando.
Para executar esse trecho, salve-o como um arquivo server.js e execute o node server.js
em seu terminal.
O segundo é usado para retornar dados ao chamador.
11
Machine Translated by Google
https://nodejs.org/api/http.html
https://nodejs.org/api/http.html
https://nodejs.org/api/http.html#http_event_request
https://nodejs.org/api/http.html#http_event_request
https://nodejs.org/api/http.html#http_class_http_incomingmessage
https://nodejs.org/api/http.html#http_class_http_serverresponse
https://nodejs.org/api/
1.3. Estruturas e ferramentas do Node.js
res.setHeader('Content-Type', 'text/plain')
res.statusCode = 200
res.end('Hello World\n')
12
definimos a propriedade statusCode como 200, para indicar uma resposta bem-sucedida.
Muitos daqueles estabelecidos ao longo do tempo como opções populares. Aqui está
uma lista não abrangente dos que considero muito relevantes e que valem a pena aprender:
Neste caso com
Expressar, uma das maneiras mais simples e poderosas de criar um servidor web.
Sua abordagem minimalista, sem opinião, focada nos principais recursos de um
servidor, é a chave para seu sucesso.
Definimos o cabeçalho Content-Type:
forneceu tudo, agora integra com libs frontend React, Vue e Angular. Pode ser usado
para criar aplicativos móveis também. koa, construído pela mesma equipe por trás
do Express, pretende ser ainda mais simples e menor, com base em anos de
conhecimento. O novo projeto nasceu da necessidade de criar mudanças
incompatíveis sem atrapalhar a comunidade existente.
Meteoro, uma estrutura de pilha completa incrivelmente poderosa, fornecendo uma
abordagem isomórfica para criar aplicativos com JavaScript, compartilhando código
no cliente e no servidor. Uma vez uma ferramenta de prateleira que
Next.js, um framework para renderizar React renderizado no lado do servidor formulários.
Node.js é uma plataforma de baixo nível e, para tornar as coisas mais fáceis e
interessantes para os desenvolvedores, milhares de bibliotecas foram construídas sobre o Node.js.
e encerramos a resposta, adicionando o conteúdo como argumento para end() :
Machine Translated by Google
https://expressjs.com/
https://flaviocopes.com/vue-introduction/
http://koajs.com/
https://flaviocopes.com/meteor/
https://flaviocopes.com/nextjs/
https://flaviocopes.com/react/
SvelteKit: O Sapper é um framework para construir aplicações web de todos os
tamanhos, com uma bela experiência de desenvolvimento e roteamento flexível
baseado em sistema de arquivos. Oferece SSR e muito mais!
Acredite ou não, o Node.js tem apenas 13 anos.
Micro, um servidor muito leve para criar microsserviços HTTP assíncronos.
Socket.io, um mecanismo de comunicação em tempo real para criar aplicativos de
rede.
Remixar: O Remix é um framework web fullstack para construir excelentes
experiências de usuário para a web. Ele vem pronto para uso com tudo o que você
precisa para criar aplicativos da Web modernos (tanto front-end quanto back-end) e
implantá-los em qualquer ambiente de tempo de execução baseado em JavaScript
(incluindo Node.js).
Neste post, desenhamos o panorama geral do Node.js em sua história, para colocar as
coisas em perspectiva.GHz',
[
P8600 @ 2,40 GHz',
41.4. os.homedir()
41.2. os.cpus()
41.3. os.freemem()
braço64 .
,
Retorne informações sobre as CPUs disponíveis em seu sistema.
Exemplo:
Retorna o número de bytes que representam a memória livre no sistema.
,Retorna a string que identifica a arquitetura subjacente, como arm
126
Machine Translated by Google
'/Usuários/joe'
//[3.68798828125, 4.00244140625, 11.1181640625]
41.5. os.hostname()
41.6. os.loadavg()
41,7. os.networkInterfaces()
Exemplo:
Exemplo:
Retorna os detalhes das interfaces de rede disponíveis em seu sistema.
Ele retorna apenas um valor significativo no Linux e no macOS.
Retorna o cálculo feito pelo sistema operacional na média de carga.
Exemplo:
Retorne o caminho para o diretório inicial do usuário atual.
Retorne o nome do host.
127
Machine Translated by Google
41,8. os.platform()
Retorne a plataforma para a qual o Node.js foi compilado:
[ { endereço: 'fe80::2513:72bc:f405:61d0', máscara
de rede: 'ffff:ffff:ffff:ffff::', família: 'IPv6', mac:
'fe:80:00:20:00: 00', scopeid: 8, internal:
false } ] }
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', family: 'IPv6', mac:
'fe:82:00:00:00:00', scopeid: 0, internal: true } , { endereço:
'fe80::1', máscara de rede: 'ffff:ffff:ffff:ffff::', família: 'IPv6', mac:
'fe:82:00:00:00:00', scopeid: 1 , interno: verdadeiro } ],
darwin
utun0:
máscara de rede: '255.255.255.0',
família: 'IPv4', mac:
'06:00:00:02:0e:00', interno:
false } ],
{ Endereço 1',
[ { endereço: '127.0.0.1',
máscara de rede:
'255.0.0.0', família: 'IPv4',
mac: 'fe:82:00:00:00:00',
interno: true },
[ { endereço: 'fe82::9b:8282:d7e6:496e', máscara
de rede: 'ffff:ffff:ffff:ffff::', família: 'IPv6',
mac: '06:00:00:02:0e: 00', scopeid: 5,
internal: false }, { address: '192.168.1.38',
{ lo0:
en1:
128
Machine Translated by Google
...mais
Retorna uma string que identifica o número da versão do sistema operacional
Identifica o sistema operacional:
Retorna o caminho para a pasta temporária atribuída.
Retorna o número de bytes que representam a memória total disponível no sistema.
Retorna o número de segundos que o computador está em execução desde a última
reinicialização.
41.11. os.totalmem()
41.10. os.tmpdir()
41.9. os.release()
41.12. os.type()
41.13. os.uptime()
41.14. os.userInfo()
Linux
freebsd
win32
Darwin no macOS
Windows_NT no Windows
linux
openbsd
129
Machine Translated by Google
const porta = new EventEmitter()
Conchafluido
const EventEmitter = require('eventos')
door.emit('slam') // emitindo o evento "slam"
gid
42. O módulo de eventos do nó
130
foram registrados.
trabalhando com eventos em Node.js.
Emite um evento. Ele chama de forma síncrona todos os ouvintes de eventos na ordem em que eles
O módulo de eventos nos fornece a classe EventEmitter, que é a chave para
,
Alias para emissor.on() .
Retorna um objeto que contém o nome de usuário atual e o
homedir
,,
Aqui está uma descrição detalhada dos métodos mais úteis:
,
Objeto EventEmitter :
removeListener quando um ouvinte é removido
Retorna um array de strings que representam os eventos registrados no atual
newListener quando um ouvinte é adicionado
O ouvinte de eventos tem estes eventos integrados:
42.2. emissor.emitir()
42.3. emissor.eventNames()
42.1. emissor.addListener()
Machine Translated by Google
42.4. emissor.getMaxListeners()
42,7. emissor.off()
42,5. emissor.listenerCount()
42.6. emissor.ouvintes()
42,8. emissor.on()
Alias para emissor.removeListener() adicionado no Node.js 10
Adiciona uma função de retorno de chamada que é chamada quando um evento é emitido.
Obtém um array de listeners do evento passado como parâmetro:
objeto, cujo padrão é 10, mas pode ser aumentado ou diminuído usando
Uso:
Obtenha a contagem de listeners do evento passado como parâmetro:
door.listenerCount('open')
setMaxListeners()
Obtenha a quantidade máxima de ouvintes que se pode adicionar a um EventEmitter
door.eventNames()
door.listeners('open')
door.getMaxListeners()
131
Machine Translated by Google
42.12. emissor.removeAllListeners()
42.9. emissor.uma vez()
42.11. emissor.prependOnceListener()
42.10. emissor.prependListener()
Quando você adiciona um ouvinte usando a fila de ouvintes
on ou addListener e é chamado por último. Usando prependListener , ele é adicionado e
chamado antes de outros ouvintes.
é adicionado por último na fila de ouvintes,
Remove todos os ouvintes de um objeto EventEmitter ouvindo um evento específico:
Adiciona uma função de retorno de chamada que é chamada quando um evento é emitido pela primeira vez
Quando você adiciona um ouvinte usando
uma vez e chamado por último. Usando prependOnceListener , ele é adicionado e chamado
antes de outros ouvintes.
é adicionado por último no,
tempo depois de registrar isso. Este retorno de chamada só será chamado uma vez,
nunca mais.
,
door.removeAllListeners('open')
})
const EventEmitter = require('eventos')
ee.once('meu-evento', () => {
door.on('abrir', () =>
{ console.log('A porta foi aberta') })
// chama a função callback uma vez
const ee = new EventEmitter()
132
Machine Translated by Google
133
Remova um ouvinte específico. Você pode fazer isso salvando a função de retorno de chamada
em uma variável, quando adicionada, para poder referenciá-la posteriormente:
O módulo principal HTTP é um módulo chave para a rede Node.js.
Define a quantidade máxima de ouvintes que se pode adicionar a um EventEmitter
Esta propriedade lista todos os métodos HTTP suportados:
Pode ser incluído usando
O módulo fornece algumas propriedades e métodos, e algumas classes.
objeto, cujo padrão é 10, mas pode ser aumentado ou diminuído.
door.setMaxListeners(50)
const doSomething = () => {}
door.on('open', doSomething)
door.removeListener('open', doSomething)
const http = require('http')
43.1. Propriedades
43.1.1. http.MÉTODOS
42.14. emissor.setMaxListeners()
42.13. emissor.removeListener()
43. O módulo Nó http
Machine Translated by Google
43.1.2. http.STATUS_CODES
134
> require('http').METHODS
[ 'ACL', 'BIND', 'CHECKOUT',
'CONNECT', 'COPY',
'DELETE', 'GET', 'HEAD',
'LINK', 'LOCK', 'M-SEARCH',
'MERGE', 'MKACTIVITY',
'MKCALENDAR', 'MKCOL',
'MOVE', 'NOTIFY', 'OPTIONS',
'PATCH', 'POST', 'PROPFIND',
'PROPPATCH', 'PURGE',
'PUT', 'REBIND', 'REPORT',
'SEARCH', 'SUBSCRIBE',
'TRACE', 'UNBIND',
'UNLINK', 'UNLOCK',
'UNSUBSCRIBE']
Esta propriedade lista todos os códigos de status HTTP e sua descrição:
Machine Translated by Google
> require('http').STATUS_CODES
{ '100': 'Continuar', '101': 'Protocolos
de comutação', '102':
'Processando', '200': 'OK', '201':
'Criado' , '202': 'Aceito', '203':
'Informações não autorizadas',
'204': 'Sem conteúdo', '205':
'Redefinir conteúdo', '206': 'Conteúdo parcial',
'207' : 'Multi-Status', '208': 'Já reportado',
'226': 'IM usado', '300': 'Várias opções', '301':
'Movido permanentemente', '302':
'Encontrado' , '303': 'Ver outro', '304': 'Não
modificado', '305': 'Usar proxy', '307':
'Redirecionamento temporário', '308':
'Redirecionamento permanente', '400':
'Solicitação inválida', '401': 'Não autorizado',
'402': 'Pagamento obrigatório', '403':
'Proibido', '404':'Não encontrado', '405':
'Método não permitido', ' 406': 'Não aceitável',
'407': 'Autenticação de proxy necessária',
'408': 'Tempo limite da solicitação', '409':
'Conflito', '410': 'Desaparecido', '411':
'Comprimento necessário ', '412': 'Falha na
pré-condição', '413': 'Payload muito grande',
'414': 'URI muito longo', '415': 'Tipo de mídia
não suportado', '416': 'Intervalo não
satisfatório' , '417': 'Falha na expectativa',
'418': 'Eu \'ma teapot', '421': 'Solicitação mal
direcionada', '422': 'Entidade não processável',
'423': 'Bloqueado', '424': 'Falha na
dependência',
135
Machine Translated by Google
43.1.3. http.globalAgent
43.2.1. http.createServer()
43.2. Métodos
136
'506': 'Variante também negocia',
'429': 'Muitas solicitações',
'505': 'Versão HTTP não suportada',
'428': 'Pré-condição necessária',
http.Classe de agente .
// trata cada requisição com este callback })
'426': 'Atualização necessária',
'504': 'Tempo limite do gateway',
const server = http.createServer((req, res) => {
'425': 'Coleção não ordenada',
'503 serviço indisponível',
'502 Bad Gateway',
'511': 'Autenticação de rede necessária' }
'510': 'Não estendido',
'501': 'Não implementado',
'500': 'Erro do servidor interno',
'509': 'Limite de largura de banda excedido',
'451': 'Indisponível por motivos legais',
'508': 'Loop detectado',
'507': 'Armazenamento insuficiente',
'431': 'Campos de cabeçalho de solicitação muito grandes',
Retorna uma nova instância da classe http.Server .
Aponta para a instância global do objeto Agent, que é uma instância do
Mais informações na descrição da classe http.Agent posteriormente.
Ele é usado para gerenciar a persistência e a reutilização de conexões para
clientes HTTP e é um componente chave da rede HTTP Node.js.
Uso:
Machine Translated by Google
Um objeto http.ClientRequest é criado quando http.request() ou
Esse objeto garante que todas as solicitações feitas a um servidor sejam enfileiradas e
um único soquete seja reutilizado.
Faz uma solicitação HTTP para um servidor, criando uma instância da classe
http.ClientRequest .
Semelhante a http.request()
e chama req.end() automaticamente.
Ele também mantém um pool de soquetes. Isso é fundamental por razões de desempenho.
O módulo HTTP fornece 5 classes:
http.get() é chamado.
mas define automaticamente o método HTTP para GET,,
O Node.js cria uma instância global da classe http.Agent para gerenciar a persistência
e a reutilização de conexões para clientes HTTP, um componente chave da rede HTTP
Node.js.
137
43.3. Aulas
43.2.3. http.get()
43.3.1. http.Agente
43.3.2. http.ClientRequest
43.2.2. http.request()
http.Agente
http.Servidor
http.IncomingMessage
http.ClientRequest
http.ServerResponse
Machine Translated by Google
const server = http.createServer((req, res) => { // res é
um objeto http.ServerResponse })
43.3.3. http.Servidor
43.3.4. http.ServerResponse
138
O método que você sempre chamará no manipulador é a resposta
end() , a mensagem está completa e o servidor pode enviá-la ao cliente. Deve ser chamado
em cada resposta.
você pode chamar o método response.read() no
manipulador de eventos de resposta . Você pode configurar um ouvinte de eventos para
o evento de dados , para que possa ouvir os dados transmitidos.
Os dados retornados de uma resposta podem ser lidos de 2 maneiras:
Comumente conhecido e usado no código como res :
Quando uma resposta é recebida, o evento de resposta é chamado com a resposta, com uma
instância http.IncomingMessage como argumento.
evento de solicitação que ele é acionado.
Criado por um http.Server e passado como segundo parâmetro para o
definir
getHeaderNames() obtém a lista dos nomes dos cabeçalhos HTTP já
close() impede o servidor de aceitar novas conexões listen() inicia o
servidor HTTP e escuta as conexões
Estes métodos são usados para interagir com cabeçalhos HTTP:
Depois de ter um objeto de servidor, você tem acesso aos seus métodos:
, que fecha o
Essa classe geralmente é instanciada e retornada ao criar um novo servidor usando
http.createServer() .
Machine Translated by Google
Se os cabeçalhos ainda não foram enviados usando os
cabeçalhos response.writeHead() primeiro, com o código de status e a mensagem
definidos na solicitação, que você pode editar definindo os valores das propriedades
statusCode e statusMessage :
Método HTTP usando seu método de método
Para enviar dados ao cliente no corpo da resposta, use write() . Ele enviará dados
em buffer para o fluxo de resposta HTTP.
,
URL usando o método url
Ele pode ser usado para acessar a resposta:
a mensagem de status opcional e o objeto headers.
ele vai enviar o
Um objeto http.IncomingMessage é criado por:
,
Versão HTTP usando o método httpVersion
Depois de processar os cabeçalhos você pode enviá-los para o cliente chamando
que aceita o statusCode como o primeiro parâmetro,
43.3.5. http.IncomingMessage
139
response.statusCode = 500
response.statusMessage = 'Erro interno do servidor'
getHeaders() obtém uma cópia dos cabeçalhos HTTP já definidos
setHeader('headername', value) define um valor de cabeçalho HTTP
getHeader('headername') obtém um cabeçalho HTTP já definido
removeHeader('headername') remove um cabeçalho HTTP já definido
hasHeader ('headername') retorna true se a resposta tiver esse cabeçalho definido
headersSent() retorna true se os cabeçalhos já foram enviados ao cliente
resposta.writeHead()
http.Server ao ouvir o evento de solicitação
http.ClientRequest ao ouvir o evento de resposta
status usando seus métodos statusCode e statusMessage
cabeçalhos usando seu método headers ou rawHeaders
Machine Translated by Google
44. Streams Node.js
140
Streams não são um conceito exclusivo do Node.js. Eles foram introduzidos no sistema
operacional Unix décadas atrás, e os programas podem interagir uns com os outros
passando fluxos através do operador pipe ( | ).
socket subjacente usando o método socket
O módulo de fluxo Node.js fornece a base sobre a qual todas as APIs de streaming são
construídas. Todos os fluxos são instâncias de EventEmitter
Eles são uma maneira de lidar com a leitura/gravação de arquivos, comunicações de
rede ou qualquer tipo de troca de informações de ponta a ponta de maneira eficiente.
Usando streams você lê peça por peça, processando seu conteúdo sem manter tudo na
memória.
Eficiência de tempo: leva muito menos tempo para iniciar o processamento de
dados, pois você pode começar a processá-los assim que os tiver, em vez de esperar até
Os fluxos são um dos conceitos fundamentais que alimentam os aplicativos Node.js.
Por exemplo, da maneira tradicional, quando você diz ao programa para ler um arquivo,
o arquivo é lido na memória, do início ao fim, e então você o processa.
Streams basicamente fornecem duas vantagens principais sobre o uso de outros
métodos de manipulação de dados:
Eficiência de memória: você não precisa carregar grandes quantidades de dados
na memória antes de poder processá-los
Os dados são acessados usando streams, pois http.IncomingMessage implementa a
interfaceReadable Stream.
44.2. Por que streams
44.1. O que são fluxos
Machine Translated by Google
https://nodejs.org/api/stream.html
https://nodejs.org/api/stream.html
https://nodejs.org/api/events.html#events_class_eventemitter
44.3. Um exemplo de fluxo
const http = require('http') const fs
= require('fs')
}) })
server.listen(3000)
const server = http.createServer(function (req, res) { fs.readFile(`$
{__dirname}/data.txt`, (err, data) => {
const http = require('http') const fs
= require('fs')
const server = http.createServer((req, res) => {
const stream = fs.createReadStream(`${__dirname}/data.txt`) stream.pipe(res) })
server.listen(3000)
res.end(dados)
funcionar quando terminar.
toda a carga útil de dados está disponível
readFile() lê o conteúdo completo do arquivo e invoca o retorno de chamada
cliente.
Usando o módulo Node.js fs , você pode ler um arquivo e servi-lo por HTTP quando
uma nova conexão for estabelecida com seu servidor HTTP:
Se o arquivo for grande, a operação levará um pouco de tempo. Aqui está a mesma
coisa escrita usando streams:
Em vez de esperar até que o arquivo seja totalmente lido, começamos a transmiti-lo
para o cliente HTTP assim que temos um bloco de dados pronto para ser enviado.
res.end(data) no retorno de chamada retornará o conteúdo do arquivo para o HTTP
Um exemplo típico é a leitura de arquivos de um disco.
141
Machine Translated by Google
Esta construção é o mesmo que fazer
Devido às suas vantagens, muitos módulos principais do Node.js fornecem recursos
nativos de manipulação de fluxo, principalmente:
process.stdin retorna um fluxo conectado a stdin
process.stdout retorna um fluxo conectado a stdout
process.stderr retorna um fluxo conectado a stderr
fs.createReadStream() cria um fluxo legível para um arquivo
zlib.createGzip() compactar dados usando gzip (um algoritmo de compactação)
em um fluxo
http.request() retorna uma instância da classe http.ClientRequest, que é um
fluxo gravável
O valor de retorno do método pipe() é o fluxo de destino, que é uma coisa muito
conveniente que nos permite encadear várias chamadas pipe() , assim:
fs.createWriteStream() cria um fluxo gravável para um arquivo
Você o chama no fluxo de origem, portanto, nesse caso, o fluxo de arquivo é
canalizado para a resposta HTTP.
net.connect() inicia uma conexão baseada em fluxo
zlib.createGunzip() descompacta um fluxo gzip.
O exemplo acima usa a linha stream.pipe(res) : o método pipe() é chamado no fluxo
do arquivo.
O que faz este código? Ele pega a fonte e a canaliza para um destino.
src.pipe(dest1)
dest1.pipe(dest2)
src.pipe(destino1).pipe(destino2)
44.4. cano()
44,5. APIs Node.js baseadas em streams
142
Machine Translated by Google
combinação de um fluxo legível e gravável
Você também pode implementar _read usando a opção read :
algoritmo) em um fluxo
zlib.createInflate() descompactar um fluxo deflate
então implemente _read :
Existem quatro classes de fluxos:
Primeiro crie um objeto de fluxo:
44.6. Diferentes tipos de fluxos
44,7. Como criar um fluxo legível
Duplex : um fluxo no qual você pode canalizar e canalizar, basicamente um
zlib.createDeflate() compacta dados usando deflate (uma compactação
readableStream._read = () => {}
Writable : um fluxo no qual você pode canalizar, mas não canalizar (você pode
enviar dados, mas não receber dele)
Transform : um fluxo Transform é semelhante a um Duplex, mas a saída é uma
transformação de sua entrada
const readableStream = new Stream.Readable()
Legível : um fluxo do qual você pode canalizar, mas não canalizar (você pode
receber dados, mas não enviar dados para ele). Quando você envia dados para um
fluxo legível, ele é armazenado em buffer até que um consumidor comece a ler os dados.
const Stream = require('stream')
Obtemos o fluxo legível do módulo de fluxo , e nós o inicializamos e implementamos o
método readable._read() .
143
Machine Translated by Google
https://nodejs.org/api/stream.html
https://nodejs.org/api/stream.html
Para criar um fluxo gravável, estendemos o objeto Writable básico e implementamos
seu método _write().
Primeiro crie um objeto de fluxo:
Agora que o stream foi inicializado, podemos enviar dados para ele:
Agora você pode canalizar um fluxo legível em:
Como lemos dados de um fluxo legível? Usando um fluxo gravável:
então implemente _write :
44,8. Como criar um fluxo gravável
44.9. Como obter dados de um fluxo legível
process.stdin.pipe(writableStream)
const writableStream = new Stream.Writable()
const readableStream = new Stream.Readable({
const Stream = require('stream')
}
readableStream.push('oi!')
readableStream.push('ho!')
writableStream._write = (pedaço, codificação, próximo) => {
console.log(chunk.toString()) next()
leia() {},
})
144
Machine Translated by Google
Você também pode consumir um fluxo legível diretamente, usando o evento legível :
Usando o método stream write() :
Use o método end() :
44.11. Sinalizando um fluxo gravável que você
terminou de escrever
44.10. Como enviar dados para um fluxo gravável
}
const Stream = require('stream')
readableStream.on('readable', () =>
{ console.log(readableStream.read()) })
console.log(chunk.toString()) next()
readableStream.push('oi!')
readableStream.push('ho!')
writableStream.write('Ei!\n')
writableStream._write = (pedaço, codificação, próximo) => {
readableStream.pipe(writableStream)
})
const writableStream = new Stream.Writable()
const readableStream = new Stream.Readable({
leia() {},
145
Machine Translated by Google
No exemplo acima, end() é chamado dentro de um ouvinte para o evento close no
fluxo legível para garantir que não seja chamado antes que todos os eventos de gravação tenham
passou pelo pipe, pois isso faria com que um evento de erro fosse emitido. Chamar
destroy() no stream legível faz com que o evento close seja emitido. O ouvinte do
evento close no fluxo gravável
Primeiro, crie um objeto de stream de transformação:
demonstra a conclusão do processo como é emitido após a chamada para
44.12. Como criar um fluxo de transformação
}
const Stream = require('stream')
readableStream.on('close', () => writableStream.end())
writableStream.on('close', () => console.log('terminado'))
console.log(chunk.toString()) next()
readableStream.push('oi!')
readableStream.push('ho!')
readableStream.destroy()
fim() .
writableStream._write = (pedaço, codificação, próximo) => {
readableStream.pipe(writableStream)
})
const writableStream = new Stream.Writable()
Obtemos o stream Transform do módulo stream , e nós o inicializamos e implementamos o método
transform._transform() .
const readableStream = new Stream.Readable({
leia() {},
146
Machine Translated by Google
https://nodejs.org/api/stream.html
https://nodejs.org/api/stream.html
O Node.js assume que está sempre sendo executado em um ambiente de
desenvolvimento. Você pode sinalizar ao Node.js que está executando em
produção configurando a variável de ambiente NODE_ENV=production .
Fluxo legível do tubo:
Você pode ter configurações diferentes para ambientes de produção e
desenvolvimento.
Você também pode aplicar a variável de ambiente anexando-aao comando de
inicialização do aplicativo:
persistir em caso de reinicialização do sistema.
no shell, mas é melhor colocá-lo em seu arquivo de configuração do shell (por
exemplo, .bash_profile com o shell Bash) porque, caso contrário, a configuração não
Isso geralmente é feito executando o comando
então implemente _transform :
45. Nó, a diferença entre
desenvolvimento e produção
}
const { Transform } = require('stream')
transformStream._transform = (chunk, encoding, callback) =>
{ transformStream.push(chunk.toString().toUpperCase()) callback()
process.stdin.pipe(transformStream).pipe(process.stdout)
export NODE_ENV=produção
const transformStream = new Transform()
147
Machine Translated by Google
}
NODE_ENV=nó de produção app.js
// ...
}
if (process.env.NODE_ENV === 'desenvolvimento') {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }))
// ...
// ...
} if (['production', 'staging'].indexOf(process.env.NODE_ENV) >= 0) {
if (process.env.NODE_ENV === 'desenvolvimento') {
}
} if (process.env.NODE_ENV === 'produção') {
if (process.env.NODE_ENV === 'produção')
{ app.use(express.errorHandler())
Definir o ambiente para produção geralmente garante que
Por exemplo, em um aplicativo Express, você pode usar isso para definir diferentes
manipuladores de erros por ambiente:
Há muitos mais exemplos.
Por exemplo, Pug, a biblioteca de modelos usada pelo Express, compila no modo de
depuração se NODE_ENV não estiver definido como production . As visualizações expressas
são compiladas em cada solicitação no modo de desenvolvimento, enquanto na produção são armazenadas em cache.
ambientes:
o registro é mantido em um nível mínimo, essencial,
mais níveis de armazenamento em cache ocorrem para otimizar o desempenho
Essa variável de ambiente é uma convenção amplamente usada também em bibliotecas
externas.
Você pode usar instruções condicionais para executar código em diferentes
148
Machine Translated by Google
ou
No Node.js, não lançamos strings, apenas lançamos objetos Error.
Assim que o JavaScript executa essa linha, o fluxo normal do programa é interrompido e
o controle é retido para o manipulador de exceção mais próximo.
Uma exceção é criada usando a palavra-chave throw :
Erros no Node.js são tratados por meio de exceções.
Um manipulador de exceção é uma instrução try / catch .
Normalmente, o valor do código do lado do cliente pode ser qualquer valor JavaScript,
incluindo uma string, um número ou um objeto.
46.2. Objetos de erro
46.3. Tratamento de exceções
46.1. Criando exceções
149
46. Tratamento de erros no Node.js
Um objeto de erro é um objeto que é uma instância do objeto Error
ou estende a classe Error, fornecida no módulo principal Error:
// ...
} throw new NotEnoughCoffeeError()
class NotEnoughCoffeeError estende Erro {
throw new Error(' O café acabou')
valor de lançamento
Machine Translated by Google
https://nodejs.org/api/errors.html
process.on('uncaughtException', (err) => {
doSomething1() .then(doSomething2) .then(doSomething3) .catch((err) => console.error(err))
console.error('Houve um erro não detectado', err)
process.exit(1) // obrigatório (conforme a documentação do
Node.js) })
try
{ // linhas de
código } catch (e) {}
46,5. Exceções com promessas
46,4. Capturando exceções não capturadas
Qualquer exceção levantada nas linhas de código incluídas no bloco try é tratada no bloco
catch correspondente :
e neste exemplo é o valor de exceção.
Se uma exceção não capturada for lançada durante a execução do seu programa, seu
programa irá travar.
Você pode adicionar vários manipuladores, que podem detectar diferentes tipos de erros.
Você não precisa importar o módulo principal do processo para isso, pois ele é injetado
automaticamente.
Usando promessas, você pode encadear diferentes operações e lidar com erros no final:
Para resolver isso, você escuta o evento uncaughtException no objeto de processo :
150
Machine Translated by Google
// ...
} pegar (errar) {
return doSomething2().catch((err) => { // trata o erro
}
// ... lidar com isso localmente
throw new Error(err.message)
throw err // quebra a corrente!
}) }) .then(() => {
}
const fazerAlgo1 = () => {
fazerAlgumacoisa1()
return doSomething3().catch((err) => { // trata o erro
throw err // quebra a cadeia! })
}) .catch((err) => console.error(err))
// ...
tente
{ // ...
.then(() => {
46.6. Tratamento de erros com async/await
Como saber onde ocorreu o erro? Você realmente não sabe, mas pode lidar
com erros em cada uma das funções que você chama ( doSomethingX ), e
dentro do manipulador de erros lança um novo erro, que chamará o exterior
Para poder lidar com erros localmente sem manipulá-los na função que
chamamos, podemos quebrar a cadeia. Você pode criar uma função em cada
then() e processar a exceção:
Usando async/await, você ainda precisa capturar erros e faz assim:
manipulador de captura :
151
Machine Translated by Google
47. Construa um servidor HTTP
Usamos o módulo para criar um servidor HTTP.
Aqui está um exemplo de servidor web HTTP Hello World:
O servidor está configurado para escutar na porta especificada, 3000 . Quando o servidor
estiver pronto, a função de retorno de chamada de escuta é chamada.
const porta = process.env.PORT || 3000
const server = http.createServer((req, res) => { res.statusCode
= 200
A função de retorno de chamada que passamos é aquela que será executada a cada solicitação
recebida. Sempre que uma nova solicitação é recebida, o evento é chamado, fornecendo dois
objetos: uma solicitação (uma solicitação http.IncomingMessage objeto) e
uma resposta (um http.ServerResponse objeto).
função assíncrona someFunction()
{ try { await someOtherFunction()
res.setHeader('Content-Type', 'text/html')
res.end('Olá, Mundo!') })
const http = require('http')
}
} catch (err)
{ console.error(err.message)
server.listen(porta, () =>
{ console.log(`Servidor rodando na porta ${port}`) })
solicitar
}
Vamos analisá-lo brevemente. Incluímos o módulo http .
152
Machine Translated by Google
https://nodejs.org/api/http.html#http_class_http_incomingmessage
https://nodejs.org/api/http.html#http_class_http_serverresponse
https://nodejs.org/api/http.html#http_event_request
https://nodejs.org/api/http.html
https://nodejs.org/api/http.html
Também definimos o cabeçalho Content-Type:
e encerramos a resposta, adicionando o conteúdo como argumento para end() :
cabeçalhos e dados de solicitação.
Neste caso com
definimos a propriedade statusCode como 200, para indicar uma resposta bem-sucedida.
Há muitas maneiras de realizar uma solicitação HTTP GET no Node.js, dependendo do nível de
abstração que você deseja usar.
48. Fazendo solicitações HTTP
com Node.js
153
response é usado para preencher os dados que vamos retornar ao cliente.
request fornece os detalhes da solicitação. Através dele, acessamos a solicitação
res.setHeader('Content-Type', 'text/html')
res.end('Olá, Mundo!')
A maneira mais simples de realizar uma solicitação HTTP usando Node.js é usar a biblioteca
Axios:
res.statusCode = 200
48.1. Executar uma solicitação GET
Machine Translated byGoogle
https://github.com/axios/axios
No entanto, o Axios requer o uso de uma biblioteca de terceiros.
Uma solicitação GET é possível apenas usando os módulos padrão do Node.js,
embora seja mais detalhado do que a opção acima:
48.2. Executar uma solicitação POST
const https = require('https')
.get('https://example.com/todos') .then((res)
=> { console.log(`statusCode: ${res.status}
`) console.log(res) }) .catch( (erro) => {
axios
const req = https.request(options, (res) =>
{ console.log(`statusCode: ${res.statusCode}`)
res.on('dados', (d) => {
console.error(erro) })
process.stdout.write(d) })
const options =
{ hostname: 'example.com',
porta: 443, caminho: '/todos',
método: 'GET',
})
req.on('erro', (erro) =>
{ console.error(erro)
req.end()
}
})
eixos const = require('eixos')
154
Machine Translated by Google
Semelhante a fazer uma solicitação HTTP GET, você pode usar a biblioteca Axios para
executar uma solicitação POST:
Ou, alternativamente, use os módulos padrão do Node.js:
axios
todo: 'Compre o
leite', }) .then((res) =>
{ console.log(`statusCode: $
{res.status}`) console.log(res) }) .catch((error) => {
})
eixos const = require('eixos')
.post('https://whatever.com/todos', {
console.error(erro)
155
Machine Translated by Google
https://github.com/axios/axios
48.3. COLOCAR E APAGAR
As solicitações PUT e DELETE usam o mesmo formato de solicitação
POST - você só precisa alterar o valor options.method para o método apropriado.
156
const options =
{ hostname: 'whatever.com',
port: 443, path: '/todos', method:
'POST', headers: { 'Content-
Type': 'application/json',
'Content-Length': data.length, },
process.stdout.write(d) })
const https = require('https')
const data = JSON.stringify({ todo:
'Compre o leite', })
}
})
})
req.write(data)
req.end()
const req = https.request(options, (res) =>
{ console.log(`statusCode: ${res.statusCode}`)
req.on('erro', (erro) =>
{ console.error(erro)
res.on('dados', (d) => {
49. Obtenha dados do corpo da solicitação HTTP
Machine Translated by Google
Se você não estiver usando o Express e quiser fazer isso no Node.js vanilla, você precisa
trabalhar um pouco mais, é claro, pois o Express abstrai muito disso para
Se você estiver usando o Express, é bem simples: use o middleware express.json() que está
disponível no Express v4.16.0 em diante.
Por exemplo, para obter o corpo desta solicitação:
Este é o código do lado do servidor correspondente:
vocês.
cabeçalhos, mas não o corpo da solicitação.
A principal coisa a entender é que quando você inicializa o servidor HTTP usando o retorno
de chamada é chamado quando o servidor obtém todo o HTTP,
Veja como você pode extrair os dados que foram enviados como JSON no corpo da solicitação.
app.use( express.urlencoded({
estendido:
verdadeiro, })
eixos const = require('eixos')
app.use(express.json())
const express = require('express')
)
app.post('/todos', (req, res) =>
{ console.log(req.body.todo) })
axios.post('https://whatever.com/todos', {
const app = express()
http.createServer()
todo: 'Compre o leite', })
157
Machine Translated by Google
Portanto, para acessar os dados, supondo que esperamos receber uma string,
devemos concatenar os pedaços em uma string ao ouvir os dados do fluxo e
quando o fluxo terminar
O objeto de solicitação passado no retorno de chamada de conexão é um fluxo.
,
A partir do Node.js v10, uma sintaxe para await .. está disponível para uso.
Simplifica o exemplo acima e faz com que pareça mais linear:
analisamos a string para JSON:
,
Primeiro, obtemos os dados ouvindo os eventos de dados de fluxo e, quando os
dados terminam, o evento final de fluxo é chamado, uma vez:
Portanto, devemos ouvir o conteúdo do corpo a ser processado, e ele é
processado em partes.
const server = http.createServer((req, res) => { let data =
})
''
const server = http.createServer((req, res) => { // podemos
acessar os cabeçalhos HTTP req.on('data', (chunk) =>
{ console.log(`Data chunk available: ${chunk}` ) })
req.on('fim', () => { // fim dos dados })
dados += pedaço
req.on('dados', (pedaço) => {
})
req.on('end', () =>
{ console.log(JSON.parse(data).todo) // 'Compre o leite' res.end()
})
})
158
Machine Translated by Google
for await ( pedaço constante de req)
{ buffers.push(chunk)
const server = http.createServer(async (req, res) => {
console.log(JSON.parse(data).todo) // 'Compre o leite' res.end()
}
buffers const = []
})
const data = Buffer.concat(buffers).toString()
159
Machine Translated by Google
Conclusão
Para mais, vá até The Valley Of Code.
Muito obrigado por ler este livro.
Envie qualquer feedback, errata ou opiniões em hello@thevalleyofcode.com
160
Machine Translated by Google
https://thevalleyofcode.com/
mailto:hello@thevalleyofcode.comEm comparação, o JavaScript tem 26 anos e a Web tem 33 anos.
Um pouco de história JavaScript é uma linguagem de programação que foi criada na
Netscape como uma ferramenta de script para manipular páginas da web dentro de seu
navegador, o Netscape Navigator.
Parte do modelo de negócios da Netscape era vender servidores Web, que incluíam um
ambiente chamado Netscape LiveWire que podia criar páginas dinâmicas usando
JavaScript do lado do servidor. Infelizmente, o Netscape LiveWire não foi
Fixar um framework web rápido e eficiente altamente focado em fornecer a melhor
experiência de desenvolvedor com o mínimo de sobrecarga e uma poderosa
arquitetura de plugins, inspirada no Hapi e Express.
13 anos não é muito tempo em tecnologia, mas o Node.js parece ter existido desde
sempre.
2. Uma breve história do Node.js
13
Machine Translated by Google
https://kit.svelte.dev/
https://github.com/zeit/micro
https://socket.io/
https://remix.run/
https://www.fastify.io/
Nasce o Node.js
A primeira versão do npm
Um fator chave que levou ao surgimento do Node.js foi o tempo. Apenas alguns anos
antes, o JavaScript começou a ser considerado uma linguagem mais séria, graças aos
aplicativos "Web 2.0" (como Flickr, Gmail, etc.) que mostraram ao mundo como poderia
ser uma experiência moderna na web.
Os mecanismos JavaScript também se tornaram consideravelmente melhores, pois
muitos navegadores competiam para oferecer aos usuários o melhor desempenho. As
equipes de desenvolvimento por trás dos principais navegadores trabalharam duro para
oferecer melhor suporte ao JavaScript e encontrar maneiras de fazer o JavaScript rodar
mais rápido. O mecanismo que o Node.js usa sob o capô, V8 (também conhecido como
Chrome V8 por ser o mecanismo JavaScript de código aberto do The Chromium Project),
melhorou significativamente devido a essa competição.
npm chega à versão
1.0 Grandes empresas começam a adotar Node: LinkedIn, Uber, etc
Expressar nasce
Socket.io nasce
JavaScript muito bem-sucedido e do lado do servidor não foi popularizado até
recentemente, pela introdução do Node.js.
O Node.js foi construído no lugar certo e na hora certa, mas a sorte não é a única razão
pela qual é popular hoje. Ele apresenta muitos pensamentos e abordagens inovadoras
para o desenvolvimento do lado do servidor JavaScript que já ajudaram muitos
desenvolvedores.
2.0.1. 2009
2.0.2. 2010
2.0.3. 2011
14
Machine Translated by Google
https://flaviocopes.com/npm/
https://flaviocopes.com/express/
https://socket.io/
2.0.6. 2014
2.0.9. 2017
2.0.5. 2013
Koa nasce
2.0.7. 2015
2.0.4. 2012
2.0.8. 2016
A adoção continua muito rapidamente
O incidente da esquerda
npm se concentra mais na segurança
A Fundação Node.js nasce o io.js é
mesclado de volta ao Node.js Node
4 (nenhuma versão 1, 2, 3 foi lançada anteriormente)
V8 introduz o Node em seu conjunto de testes, tornando o Node oficialmente um
alvo para o mecanismo JS, além de downloads de 3 bilhões de npm do Chrome
toda semana
Primeira grande plataforma de blogs usando Node: Ghost
Nó 6
HTTP/2
Fio nasce
O Big Fork: io.js é um grande fork do Node.js, com o objetivo de introduzir o
suporte ao ES6 e avançar mais rápido
Nó 8 - 9
15
Machine Translated by Google
https://koajs.com/
https://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
https://foundation.nodejs.org/
https://flaviocopes.com/v8/
https://flaviocopes.com/yarn/
https://iojs.org/
3. Como instalar o Node.js
Nó 10 - 11
Deixe-me como você os mais comuns e convenientes.
Node.js 16
Node.js 17
O Node.js pode ser instalado de diferentes maneiras.
Nó 12 - 13
Lá você pode optar por baixar uma versão LTS (LTS significa Long Term
Support) ou a versão mais recente disponível. Como de costume, a versão
mais recente contém as novidades mais recentes.
GitHubGenericName (propriedade da Microsoft) adquiriu a NPM
Node.js 18
Nó 14 - 15
Pacotes oficiais para todas as principais plataformas estão disponíveis em
https://nodejs.org/en/download/.
16
2.0.12. 2020
2.0.13. 2021
Módulos ES suporte experimental .mjs
2.0.14. 2022
2.0.10. 2018
2.0.11. 2019
Machine Translated by Google
https://flaviocopes.com/github/
https://flaviocopes.com/npm/
https://nodejs.org/en/download/
https://flaviocopes.com/es-modules/
4. Quanto JavaScript você
precisa saber para usar o Node?
brew nó de instalação
17
Uma maneira muito conveniente de instalar o Node.js é por meio de um gerenciador
de pacotes. Nesse caso, cada sistema operacional tem o seu.
nvm é uma maneira popular de executar o Node. Ele permite que você alterne
facilmente a versão do Node e instale novas versões para tentar reverter facilmente se
algo quebrar, por exemplo.
No site eles têm pacotes para Windows, Linux, macOS.
De qualquer forma, quando o Node estiver instalado, você terá acesso ao programa
executável do nó na linha de comando.
Outros gerenciadores de pacotes para Linux e Windows estão listados em https://
nodejs.org/en/download/package-manager/
Minha sugestão é usar o instalador oficial se você está apenas começando e ainda
não usa o Homebrew, caso contrário, o Homebrew é minha solução favorita porque
posso atualizar facilmente o node executando brew upgrade node .
Ao aprender a codificar, você também pode ficar confuso sobre onde termina o
JavaScript e onde começa o Node.js e vice-versa.
Veja https://github.com/nvm-sh/nvm para obter mais informações sobre esta opção.
Como iniciante, é difícil chegar a um ponto em que você esteja confiante o suficiente
em suas habilidades de programação.
No macOS, Homebrew é o padrão de fato e - uma vez instalado - permite instalar o
Node.js com muita facilidade, executando este comando na CLI:
Também é muito útil testar seu código com versões antigas do Node.
Machine Translated by Google
https://nodejs.org/en/download/package-manager/
https://github.com/nvm-sh/nvm
https://flaviocopes.com/homebrew/
Fechamentos
18
Promessas
5. Diferenças entre o Node e o Browser
O ciclo de eventos
Tipos
Ponto e vírgula
Literais Modelo
Assíncrono e Aguardo
Expressões
Estrutura Lexical
Matrizes
Eu recomendo que você tenha uma boa compreensão dos principais conceitos de JavaScript
antes de mergulhar no Node.js:
Loops e Escopo
Temporizadores
rotações
Os conceitos a seguir também são fundamentais para entender a programação assíncrona, que
é uma parte fundamental do Node.js:
Programação assíncrona e retornos de chamada
Funções de seta
isto
Com esses conceitos em mente, você está no caminho certo para se tornar um desenvolvedor
JavaScript proficiente, tanto no navegador quanto no Node.js.
Tanto o navegador quanto o Node.js usam JavaScript como linguagem de programação.
Funções
ECMAScript 6, 2016, 2017
Variáveis
modo estrito
Machine Translated by Google
https://flaviocopes.com/javascript-closures/
https://flaviocopes.com/javascript-promises/
https://flaviocopes.com/javascript-event-loop/
https://flaviocopes.com/javascript-async-await/
https://flaviocopes.com/javascript-timers/
https://flaviocopes.com/javascript-callbacks/
Apesar do fato de ser sempre JavaScript, existem algumas diferençasimportantes que
tornam a experiência radicalmente diferente.
No navegador, na maioria das vezes o que você está fazendo é interagir com o DOM, ou
outras APIs da Plataforma Web como Biscoitos. Isso não existe no Node, é claro. Você não
tem a janela do documento e todos os outros objetos
Comparado com o ambiente do navegador, onde você não tem o luxo de escolher qual
navegador seus visitantes usarão, isso é muito conveniente.
Construir aplicativos executados no navegador é uma coisa completamente diferente de
construir um aplicativo Node.js.
Outra grande diferença é que no Node.js você controla o ambiente. A menos que você esteja
criando um aplicativo de código aberto que qualquer pessoa possa implantar em qualquer
lugar, você sabe em qual versão do Node.js executará o aplicativo.
O que muda é o ecossistema.
E no navegador, não temos todas as boas APIs que o Node.js fornece por meio de seus
módulos, como a funcionalidade de acesso ao sistema de arquivos.
Você tem uma grande oportunidade porque sabemos como é difícil aprender uma linguagem
de programação de forma completa e profunda, e usando a mesma linguagem para realizar
todo o seu trabalho na web - tanto no cliente quanto no servidor, você está em um posição
única de vantagem.
Como o JavaScript se move tão rápido, mas os navegadores podem ser um pouco lentos e
os usuários um pouco lentos para atualizar, às vezes na web, você fica preso a usar versões
mais antigas de JavaScript / ECMAScript.
que são fornecidos pelo navegador.
Isso significa que você pode escrever todos os modernos ES6-7-8-9 JavaScript compatível
com sua versão do Node.
Do ponto de vista de um desenvolvedor front-end que usa amplamente JavaScript, os
aplicativos Node.js trazem consigo uma enorme vantagem: o conforto de programar tudo -
o frontend e o backend - em uma única linguagem.
,
19
Machine Translated by Google
https://flaviocopes.com/dom/
https://flaviocopes.com/web-platform/
https://flaviocopes.com/ecmascript/
20
6. O mecanismo JavaScript V8
6.1. Outros motores JS
Outra diferença é que o Node originalmente usava o sistema de módulos CommonJS ,
enquanto no navegador usamos Módulos ES, um padrão que também foi lançado
recentemente no Node.js (https://nodejs.org/api/esm.html)
V8 é o nome do mecanismo JavaScript que alimenta o Google Chrome. É o que pega
nosso JavaScript e o executa enquanto navega com o Chrome.
Outros navegadores têm seu próprio mecanismo JavaScript:
Você pode usar o Babel para transformar seu código para ser compatível com ES5
antes de enviá-lo para o navegador, mas no Node, você não precisará disso.
O ecossistema Node.js é enorme e, graças a ele, o V8 também alimenta aplicativos de
desktop, com projetos como o Electron.
sintaxe.
O Edge foi originalmente baseado no Chakra, mas mais recentemente foi
reconstruído usando o Chromium e o motor V8.
O legal é que o mecanismo JavaScript é independente do navegador em que está
hospedado. Esse recurso-chave permitiu o surgimento do Node.js. O V8 foi escolhido
para ser o mecanismo que alimentava o Node.js em 2009 e, à medida que a popularidade
do Node.js explodiu, o V8 se tornou o mecanismo que agora alimenta uma quantidade
incrível de código do lado do servidor escrito em JavaScript.
Firefox tem Macaco -Aranha
Safari tem JavaScriptCore (também chamado Nitro)
No futuro, os módulos ES ( import ) são a maneira de carregar módulos em todo o
JavaScript, front-end ou back-end, mas o Node.js ainda suporta o require
A V8 fornece o ambiente de tempo de execução no qual o JavaScript é executado. O
DOM, e as outras APIs da Plataforma Web são fornecidos pelo navegador.
Machine Translated by Google
https://flaviocopes.com/commonjs/
https://flaviocopes.com/commonjs/
https://flaviocopes.com/es-modules/
https://nodejs.org/api/esm.html
https://flaviocopes.com/nodejs/
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey
https://flaviocopes.com/dom/
https://flaviocopes.com/web-platform/
Todos esses motores implementam o padrão ECMA ES-262, também chamado de
ECMAScript, o padrão usado pelo JavaScript.
O V8 está sempre evoluindo, assim como os outros mecanismos JavaScript
existentes, para acelerar a Web e o ecossistema Node.js.
O JavaScript é compilado internamente pela V8 com compilação just-in-time (JIT)
para acelerar a execução.
e muitos outros também existem.
Isso vem acontecendo desde 2009, quando o compilador JavaScript SpiderMonkey
foi adicionado ao Firefox 3.5, e todos seguiram essa ideia.
Nesta introdução ao V8, vamos ignorar os detalhes de implementação do V8: eles
podem ser encontrados em sites mais confiáveis (por exemplo, o site oficial do V8),
e eles mudam com o tempo, muitas vezes radicalmente.
O JavaScript é geralmente considerado uma linguagem interpretada, mas os
mecanismos JavaScript modernos não apenas interpretam o JavaScript, eles o compilam.
O V8 é escrito em C++ e é continuamente aprimorado. É portátil e roda em Mac,
Windows, Linux e vários outros sistemas.
Isso pode parecer contra-intuitivo, mas desde a introdução do Google Maps em 2004,
o JavaScript evoluiu de uma linguagem que geralmente executava algumas dezenas
de linhas de código para aplicativos completos com milhares a centenas de milhares
de linhas em execução no navegador.
Na web, há uma corrida por desempenho que vem acontecendo há anos, e nós (como
usuários e desenvolvedores) nos beneficiamos muito dessa competição porque
temos máquinas mais rápidas e otimizadas ano após ano.
6.2. A busca pelo desempenho
6.3. Compilação
21
Machine Translated by Google
https://flaviocopes.com/ecmascript/
#!/usr/bin/env nó
#!/usr/bin/node
nó app.js
// seu código
7. Execute scripts Node.js na
linha de comando
22
Nesse novo mundo, compilar JavaScript faz todo o sentido porque, embora possa demorar um
pouco mais para ter o JavaScript pronto, uma vez feito, ele terá muito mais desempenho do que o
código puramente interpretado.
A maneira usual de executar um programa Node.js é executar o comando node disponível
globalmente (depois de instalar o Node.js) e passar o nome do arquivo que você deseja
executar.
Acima, estamos dando explicitamente o caminho absoluto do intérprete. Nem todos os sistemas
operacionais têm node na pasta bin, mas todos devem ter env . Você pode dizer ao sistema
operacional para executar env com node como parâmetro:
Nossos aplicativos agora podem ser executados por horas dentro de um navegador, em vez de
serem apenas algumas regras de validação de formulário ou scripts simples.
Acima, você está dizendo explicitamente ao shell para executar seu script com node . Você também
pode incorporar essas informações em seu arquivo JavaScript com uma linha "shebang". O
"shebang" é a primeira linha do arquivo e informa ao sistema operacional qual interpretador usar
para executar o script. Abaixo está a primeira linha do JavaScript:
Se o arquivo principal do aplicativo Node.js for app.js , você poderá chamá-lo digitando:
Machine Translatedby Google
23
7.1. Reinicie o aplicativo automaticamente
chmod u+x app.js
nodemon app.js
npm i -D nodemon
npm i -g nodemon
8. Como sair de um programa
Node.js
Você também pode instalar o nodemon como uma dependência de desenvolvimento
Execute o aplicativo usando nodemon seguido pelo nome do arquivo do aplicativo.
Instale o módulo nodemon globalmente no caminho do sistema
Ao executar o comando, verifique se você está no mesmo diretório que contém o
arquivo app.js.
Essa instalação local do nodemon pode ser executada chamando-a de dentro do script
npm, como npm start ou usando npx nodemon.
alteração no aplicativo, para reiniciar o aplicativo automaticamente, o módulo nodemon
é usado.
Existem várias maneiras de encerrar um aplicativo Node.js.
Para usar um shebang, seu arquivo deve ter permissão executável. Você pode conceder
ao app.js a permissão executável executando:
O comando node deve ser reexecutado no bash sempre que houver um
Machine Translated by Google
Você também pode definir a propriedade process.exitCode :
isto.
sistema o código de saída:
Ao executar um programa no console, você pode fechá-lo com ctrl-C , o que queremos
discutir aqui é sair programaticamente.
vai ser desgraciosamente encerrado imediatamente.
saída
Isso significa que qualquer retorno de chamada pendente, qualquer solicitação de rede ainda sendo
mais
,
Quando o Node.js executa esta linha, o processo é imediatamente forçado a terminar.
o que significa sucesso. Diferentes códigos de saída têm
posso
saia programaticamente de um programa Node.js: process.exit() .
Por padrão, o código de saída tem
0 significado diferente, que você pode querer usar em seu próprio sistema para ter
códigos
https://nodejs.org/api/process.html#process_exit_codes
Um programa será encerrado normalmente quando todo o processamento estiver concluído.
Se isso for bom para você, você pode passar um número inteiro que sinaliza o funcionamento
Você
e quando o programa terminar, o Node.js retornará esse código de saída.
Vamos começar com o mais drástico e ver por que é melhor não usar
mas
enviado, qualquer acesso ao sistema de arquivos ou processos gravando em stdout ou stderr - tudo é
ler sobre
,
o programa se comunica com outros programas.
no
Muitas vezes com o Node.js iniciamos servidores, como este servidor HTTP:
O módulo do núcleo do processo fornece um método prático que permite
process.exitCode = 1
processo.saída(1)
24
Machine Translated by Google
https://nodejs.org/api/process.html#process_exit_codes
})
app.get('/', (req, res) => {
res.send('Olá!')
process.on('SIGTERM', () =>
{ server.close(() =>
{ console.log('Processo encerrado') }) })
app.get('/', (req, res) => { res.send('Olá!')
const app = express()
const app = express()
const server = app.listen(3000, () => console.log('Servidor pronto'))
const express = require('express')
const express = require('express')
app.listen(3000, () => console.log('Servidor pronto'))
})
Nota: o processo não requer um "require", está disponível automaticamente.
Este programa nunca vai acabar. Se você chamar process.exit() , qualquer solicitação
pendente ou em execução será abortada. Isso não é legal.
É melhor permitir que a solicitação em execução seja concluída antes de encerrar.
Nesse caso, você precisa enviar ao comando um sinal SIGTERM e lidar com isso
com o manipulador de sinal de processo:
Express é uma estrutura que usa o módulo http sob o capô, app.listen() retorna
uma instância de http. Você usaria https.createServer se precisasse servir seu
aplicativo usando HTTPS, pois app.listen usa apenas o módulo http.
25
Machine Translated by Google
9. Como ler variáveis de
ambiente do Node.js
USER_ID=239482 USER_KEY=nó foobar app.js
process.kill(process.pid, 'SIGTERM')
26
O módulo central do processo do Node.js fornece a propriedade env que hospeda
todas as variáveis de ambiente que foram definidas no momento em que o processo
foi iniciado.
SIGTERM é o sinal que diz a um processo para terminar normalmente. É o sinal
que é enviado por gerentes de processo, como novato ou supervisor e muitos
outros.
Isso passará o usuário USER_ID como 239482 e o USER_KEY como foobar.
Isso é adequado para teste, mas para produção, você provavelmente estará
configurando alguns scripts bash para exportar variáveis.
Ou de outro programa em execução Node.js ou qualquer outro aplicativo em
execução em seu sistema que conheça o PID do processo que você deseja encerrar.
idealmente agiria como process.exit() .
SIGKILL é o sinal que diz a um processo para terminar imediatamente e
O que são sinais? Os sinais são um sistema de intercomunicação POSIX: uma
notificação enviada a um processo para notificá-lo de um evento ocorrido.
O código abaixo executa app.js e define USER_ID e USER_KEY .
Você pode enviar este sinal de dentro do programa, em outra função:
Nota: o processo não requer um "require", está disponível automaticamente.
Machine Translated by Google
10. Onde hospedar um aplicativo Node.js
USER_KEY="foobar"
NODE_ENV="desenvolvimento"
USER_ID="239482"
require('dotenv').config()
process.env.USER_ID // "239482"
process.env.USER_KEY // "foobar"
process.env.USER_ID // "239482"
process.env.USER_KEY // "foobar"
process.env.NODE_ENV // "desenvolvimento"
# arquivo .env
27
Da mesma forma, você pode acessar qualquer variável de ambiente personalizada que definir.
Aqui está um exemplo que acessa as variáveis de ambiente USER_ID e USER_KEY , que
definimos no código acima.
Você também pode executar seu arquivo js com o comando node -r dotenv/config
index.js se não quiser importar o pacote em seu código.
Se você tiver várias variáveis de ambiente em seu projeto de nó, também poderá criar um
arquivo .env no diretório raiz de seu projeto e, em seguida, usar o dotenv pacote para carregá-
los durante o tempo de execução.
Aqui está uma lista não exaustiva das opções que você pode explorar quando quiser implantar
seu aplicativo e torná-lo acessível ao público.
No seu arquivo js
Vou listar as opções das mais simples e restritas às mais complexas e poderosas.
Machine Translated by Google
https://www.npmjs.com/package/dotenv
Uma ferramenta muito bacana para isso, disponível em todas as plataformas, é o ngrok.
10.2. Implantações de configuração zero
10.1. A opção mais simples de sempre: túnel local
10.2.1. Falha
10.2.2. Codepen
Eu uso muito para fins de demonstração.
Outro serviço que você pode usar é https://github.com/localtunnel/localtunnel
Mesmo se você tiver um IP dinâmico ou estiver sob um NAT, poderá implantar seu aplicativo e atender
às solicitações diretamente do seu computador usando um túnel local.
Fornecido pela empresa por trás do FogBugz e do Trello (e co-criadores do Stack Overflow).
Usando-o, você pode simplesmente digitar ngrok PORT e o PORT desejado é exposto à internet. Você
obterá um domínio ngrok.io, mas com uma assinatura paga poderá obter um URL personalizado, além
de mais opções de segurança (lembre-se de que você está abrindo sua máquina para a Internet
pública).
Falha é umplayground e uma maneira de criar seus aplicativos mais rápido do que nunca e vê-los ao
vivo em seu próprio subdomínio glitch.com. No momento, você não pode ter um domínio personalizado
e há algumas restrições no lugar, mas é muito bom prototipar. Parece divertido (e isso é uma
vantagem), e não é um ambiente estúpido - você obtém todo o poder do Node.js, um CDN,
armazenamento seguro para credenciais, importação/exportação do GitHub e muito mais.
Codepen é uma plataforma e uma comunidade incríveis. Você pode criar um projeto com vários
arquivos e implantá-lo com um domínio personalizado.
Esta opção é adequada para alguns testes rápidos, demonstração de um produto ou compartilhamento
de um aplicativo com um grupo muito pequeno de pessoas.
28
Machine Translated by Google
https://ngrok.com/
https://github.com/localtunnel/localtunnel
https://glitch.com/
https://glitch.com/faq#restrictions
https://flaviocopes.com/cdn/
https://codepen.io/
10.4.1. hora agora
10.4. PAAS
10.4.3. Heroku
10.3. Sem servidor
10.4.2. Nanobox
Uma maneira de publicar seus aplicativos e não ter nenhum servidor para gerenciar é
sem servidor. Serverless é um paradigma em que você publica seus aplicativos como
funções e eles respondem em um endpoint de rede (também chamado de FAAS -
Functions As A Service).
Ambos fornecem uma camada de abstração para publicação no AWS Lambda e outras
soluções FAAS baseadas no Azure ou na oferta do Google Cloud.
Zeit é uma opção interessante. Você acabou de digitar agora no seu terminal e ele
cuida da implantação do seu aplicativo. Existe uma versão gratuita com limitações e
a versão paga é mais poderosa. Você esquece que existe um servidor, você apenas
implanta o aplicativo.
Zeit agora se chama Vercel
Heroku é uma plataforma incrível.
Biblioteca padrão
Estrutura sem servidor
Nanobox
PAAS significa Platform As A Service. Essas plataformas eliminam muitas coisas com
as quais você deveria se preocupar ao implantar seu aplicativo.
Para soluções muito populares são
29
Machine Translated by Google
https://flaviocopes.com/serverless/
https://vercel.com/
https://stdlib.com/
https://serverless.com/framework/
https://nanobox.io/
Linode
O Google Cloud é uma estrutura incrível para seus aplicativos.
Este é um ótimo artigo sobre como começar a usar o Node.js no Heroku.
Oceano Digital
Há muito mais opções na categoria VPS, essas são apenas as que usei e recomendo.
Nesta seção você encontra os suspeitos usuais, ordenados do mais amigável ao menos
amigável:
Confira como criar um aplicativo Web Node.js no Azure.
Como eles fornecem uma máquina Linux vazia na qual você pode trabalhar, não há um
tutorial específico para eles.
Vultr Bare Metal serviço)
Amazon Web Services, em particular, menciono o Amazon Elastic Beanstalk, pois
abstrai um pouco a complexidade da AWS.
O Azure é a oferta do Microsoft Cloud.
Eles têm uma boa seção de documentação do Node.js
Outra solução é obter um servidor bare metal, instalar uma distribuição Linux, conectá-
lo à internet (ou alugar um mensalmente, como você pode fazer usando o
10.4.4. Microsoft Azure
10.4.5. Google Cloud Platform
10.5. Servidor Privado Virtual
10.6. Metal puro
30
Machine Translated by Google
https://www.linode.com/
https://devcenter.heroku.com/articles/getting-started-with-nodejs
https://www.digitalocean.com/
https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-nodejs
https://www.vultr.com/pricing/baremetal/
https://aws.amazon.com/
https://cloud.google.com/node/
nó
nó script.js
ÿ nó
>
> console.log('teste') teste
Indefinido
>
O comando node é aquele que usamos para executar nossos scripts Node.js:
Dica: se você não tiver certeza de como abrir seu terminal, pesquise no Google
"Como abrir o terminal no seu sistema operacional".
Observação: REPL significa Read Evaluate Print Loop e é um ambiente de
linguagem de programação (basicamente uma janela de console) que recebe uma
expressão única como entrada do usuário e retorna o resultado de volta ao
console após a execução. A sessão REPL fornece uma maneira conveniente de
testar rapidamente o código JavaScript simples.
O comando fica no modo ocioso e espera que insiramos algo.
Se executarmos o comando node sem nenhum script para executar ou sem argumentos,
iniciaremos uma sessão REPL:
Comece simples e entre
O REPL está esperando que insiramos algum código JavaScript, para ser mais preciso.
Se você tentar agora no seu terminal, é isso que acontece:
31
11. Como usar o REPL do Node.js
Machine Translated by Google
é a saída que dissemos ao console para imprimir, então
obtemos undefined , que é o valor de retorno da execução de console.log() . O
Node leu essa linha de código, avaliou, imprimiu o resultado e voltou a esperar
por mais linhas de código. O Node percorrerá essas três etapas para cada
pedaço de código que executarmos no REPL até sairmos da sessão. Foi aí que
o REPL recebeu seu nome.
O primeiro valor, teste
,
Em alguns casos, o código que você deseja testar pode precisar de várias linhas.
Por exemplo, digamos que você queira definir uma função que gere um número
aleatório, na sessão REPL digite na linha a seguir e pressione enter:
O Node imprime automaticamente o resultado de qualquer linha de código
JavaScript sem a necessidade de instruí-lo a fazê-lo. Por exemplo, digite a
seguinte linha e pressione enter:
O Node REPL é inteligente o suficiente para determinar que você ainda não
terminou de escrever seu código e entrará em um modo de várias linhas para
você digitar mais código. Agora termine sua definição de função e pressione enter:
Observe a diferença nas saídas das duas linhas acima. O Node REPL imprimiu
undefined após a execução de console.log() enquanto, por outro lado, apenas imprimiu o resultado de 5
=== '5' . Você precisa ter em mente que o primeiro é apenas uma declaração em
JavaScript e o último é uma expressão.
,
> 5 === '5'
>
função gerarAleatório() {
function generateRandom()
{ ...return Math.random() }
falso
Indefinido
...
32
Machine Translated by Google
editor em destaque dentro do REPL. Discutimos isso abaixo em comandos Dot.
O REPL imprimirá todas as propriedades e métodos que você pode acessar nessa
classe:
O nó sairá do modo de várias linhas e imprimirá indefinido , pois não há valor
retornado. Este modo de várias linhas é limitado. Node oferece mais
guia .
Conforme você escreve seu código, se você pressionar a tecla tab , o REPL tentará
completar automaticamente o que você escreveu para corresponder a uma
variável já definida ou predefinida.
,
O legal do REPL é que ele é interativo.
adicione um ponto e pressioneTente inserir o nome de uma classe JavaScript, como Number
11.1. Use a guia para completar automaticamente
11.2. Explorando objetos JavaScript
11.3. Explorar objetos globais
33
Machine Translated by Google
Se você pressionar a tecla de seta para cima , terá acesso ao histórico das
linhas de código anteriores executadas nas sessões REPL atuais e até
anteriores.
Se depoisde algum código você digitar _ , isso vai imprimir o resultado da
última operação.
Você pode inspecionar os globais aos quais tem acesso digitando global. e
pressionando tab :
11.5. A tecla de seta para cima
11.4. A variável especial _
34
Machine Translated by Google
[1, 2, 3].forEach(num => {
... console.log(num) ... })
.help : mostra os comandos de ponto
help .editor : ativa o modo de editor, para escrever código JavaScript multilinha com
.exit : sai do repl (o mesmo que pressionar ctrl-C duas vezes)
O REPL sabe quando você está digitando uma instrução de várias linhas sem a necessidade de
invocar .editor .
. Eles sãoO REPL possui alguns comandos especiais, todos começando com um ponto .
nome do arquivo)
,
.load : carrega um arquivo JavaScript, relativo ao diretório de trabalho atual .save :
salva tudo o que você digitou na sessão REPL em um arquivo (especifique o
Se você digitar .break no final de uma linha, o modo multilinha será interrompido e a instrução
não será executada.
expressão de várias linhas que está sendo inserida no momento.
e você pressiona enter
indicando que agora pode continuar a trabalhar nesse bloco.
.clear : redefine o contexto REPL para um objeto vazio e limpa qualquer
comando irá abortar mais entradas. O mesmo que pressionar ctrl-C.
o REPL irá para uma nova linha que começa com 3 pontos,
.break : ao inserir uma expressão de várias linhas, inserir o .break
facilidade. Quando estiver nesse modo, digite ctrl-D para executar o código que você escreveu.
Por exemplo, se você começar a digitar uma iteração como esta:
Podemos importar o REPL em um arquivo JavaScript usando repl .
35
11.6. Comandos de ponto
11.7. Execute o REPL do arquivo JavaScript
Machine Translated by Google
12. Nó, aceite argumentos da linha
de comando
Você pode passar uma string que mostra quando o REPL é iniciado. O padrão é '>
' (com um espaço à direita), mas podemos definir um prompt personalizado.
Usando a variável repl podemos realizar várias operações. Para iniciar o prompt de
comando REPL, digite a seguinte linha
Você pode exibir uma mensagem ao sair do REPL
Execute o arquivo na linha de comando.
Você pode passar qualquer número de argumentos ao invocar um aplicativo Node.js
usando
36
const rep = require('repl')
repl.start()
> const n = 10
// um prompt de estilo Unix
const local = repl.start('$ ')
local.on('saída', () => {
console.log('exiting repl')
process.exit() })
nó repl.js
Machine Translated by Google
nó app.js
process.argv.forEach((val, index) =>
{ console.log(`${index}: ${val}`) })
nó app.js nome=joe
nó app.js joe
const args = process.argv.slice(2)
A maneira como você o recupera é usando o objeto de processo integrado ao Node.js.
ou
Todos os argumentos adicionais estão presentes a partir da terceira posição daqui para frente.
Você pode iterar sobre todos os argumentos (incluindo o caminho do nó e o caminho do arquivo)
usando um loop:
Os argumentos podem ser autônomos ou ter uma chave e um valor.
Por exemplo:
Isso altera como você recuperará esse valor no código Node.js.
O segundo elemento é o caminho completo do arquivo que está sendo executado.
O primeiro elemento é o caminho completo do comando node .
Você pode obter apenas os argumentos adicionais criando uma nova matriz que exclui os 2
primeiros parâmetros:
Ele expõe uma propriedade argv , que é uma matriz que contém todos os argumentos de invocação
da linha de comando.
37
Machine Translated by Google
38
13. Saída para a linha de comando
usando o Node
const args = require('minimist')(process.argv.slice(2))
nó app.js --name=joe
nó app.js nome=joe
const args = process.argv.slice(2) args[0]
nó app.js joe
args.name // joe
npm install minimist
13.1. Saída básica usando o módulo do console
e você precisa analisá-lo. A melhor maneira de fazer isso é por
Instale o pacote minimist necessário usando o npm (a lição sobre o gerenciador de
pacotes vem mais tarde sobre).
Nesse caso:
você pode acessá-lo usando
args[0] é name=joe
usando o minimist library, que ajuda a lidar com argumentos:
Se você tiver um argumento sem um nome de índice, assim:
,
Desta vez, você precisa usar traços duplos antes de cada nome de argumento:
Machine Translated by Google
https://nodejs.dev/learn/an-introduction-to-the-npm-package-manager
https://www.npmjs.com/package/minimist
13.2. Limpe o console
const x = 'x'
console.log('%o', Número)
console.log('Meu %s tem %d orelhas', 'gato', 2)
const y = 'y'
console.log(x, y)
39
que imprime o
e o Node.js imprimirá ambos.
Também podemos formatar frases bonitas passando variáveis e um especificador de
formato.
console.clear() limpa o console (o comportamento pode depender do
O método mais básico e mais usado é console.log() string que
você passa para ele no console.
É basicamente o mesmo que o objeto de console que você encontra no navegador.
Node.js fornece um módulo de console que fornece toneladas de maneiras muito úteis
de interagir com a linha de comando.
,
%i formata uma variável apenas como parte
inteira %o formata uma variável como um objeto
Exemplo:
por exemplo:Você pode passar várias variáveis para console.log
%s formata uma variável como uma
string %d formata uma variável como um número
Se você passar um objeto, ele irá renderizá-lo como uma string.
,
Por exemplo:
console usado)
Machine Translated by Google
https://nodejs.org/api/console.html
https://nodejs.org/api/console.html
Pegue este código:
O que acontece é que console.count() contará o número de vezes que um
Você pode apenas contar maçãs e laranjas:
Usaremos o exemplo das maçãs e laranjas para demonstrar isso.
string é impressa e imprime a contagem ao lado dela:
O método console.countReset() redefine o contador usado com console.count().
'
console.count(
const x = 1
)
console.count() é um método útil.
e foi verificado... quantas vezes?'
)
})
'
)
e foi verificado... quantas vezes?'
maçãs.forEach((fruta) => {
'O valor de x é
'
+ e +
})
const z = 3
laranjas.forEach((fruta) => {
const laranjas = ['laranja', 'laranja']
'O valor de x é
'
'O valor de y é
+ x +
console.count(
'
+ x +
console.count(fruta)
console.count(
'
e foi verificado... quantas vezes?'
const maçãs = ['apenas uma maçã']
console.count(fruta)
const y = 2
40
13.4. Redefinir contagem
13.3. Elementos de contagem
Machine Translated by Google
13.5. Imprima o rastreamento de pilha
Você pode fazer isso usando console.trace() :
Isso imprimirá o rastreamento de pilha. Isto é o que é impresso se tentarmos isso no Node.js
REPL:
Observe como a chamada para console.countReset('orange') redefine o contador de valores
Pode haver casos em que seja útil imprimir o rastreamento da pilha de chamadas de uma função,
talvez para responder à pergunta como você alcançou essa parte do código?
para zero.
41
})
const laranjas = ['laranja', 'laranja'] const
maçãs = ['apenas uma maçã']
laranjas.forEach((fruta) => { console.count(fruta)
console.countReset('laranja')
})
maçãs.forEach((fruta) =>
{ console.count(fruta)
const function2= () => console.trace() const
function1 = () => function2() function1()
oranges.forEach((fruta) =>
{ console.count(fruta) })
Machine Translated by Google
Ele não aparecerá no console, mas aparecerá no log de erros.
Como vimos console.log é ótimo para imprimir mensagens no Console. Isso é o
que chamamos de saída padrão, ou stdout .
Você pode calcular facilmente quanto tempo uma função leva para ser executada, usando
Você pode colorir a saída do seu texto no console usando sequências de escape .
Uma sequência de escape é um conjunto de caracteres que identifica uma cor.
13.7. stdout e stderr
13.8. Colorir a saída
13.6. Calcule o tempo gasto
42
Vestígio
} medidaFazendoAlgo()
const doSomething = () => console.log('test') const
measureDoingSomething = () =>
{ console.time('doSomething()') // faça algo e
meça o tempo que leva doSomething() console.timeEnd
('faça alguma coisa()')
console.error imprime no fluxo stderr .
em function2 (repl:1:33) em
function1 (repl:1:25) em
repl:1:1 em
ContextifyScript.Script.runInThisContext (vm.js:44:33) em
REPLServer.defaultEval (repl.js:239: 29) no limite (domain.js:301:14)
em REPLServer.runBound [as eval] (domain.js:314:12) em
REPLServer.onLine (repl.js:440:10) em emitOne (events.js: 120:20)
em REPLServer.emit (events.js:210:7)
time() e timeEnd()
Machine Translated by Google
https://gist.github.com/iamnewton/8754917
https://gist.github.com/iamnewton/8754917
13.9. Crie uma barra de progresso
const giz = require('giz')
console.log('\x1b[33m%s\x1b[0m', 'oi!')
console.log(chalk.yellow('oi!'))
43
Exemplo:
Você pode tentar isso no REPL do Node.js, e ele imprimirá oi! em amarelo.
,
Usar chalk.yellow é muito mais conveniente do que tentar lembrar os códigos de escape,
e o código é muito mais legível.
No entanto, esta é a maneira de baixo nível de fazer isso. A maneira mais simples de
colorir a saída do console é usando uma biblioteca. Giz é uma biblioteca desse tipo e,
além de colorir, também ajuda com outros recursos de estilo, como tornar o texto em
negrito, itálico ou sublinhado.
Verifique o link do projeto postado acima para mais exemplos de uso.
Progresso é um pacote incrível para criar uma barra de progresso no console.
Instale-o usando o progresso de instalação do npm
Você instala com npm install Chalk@4 então você pode usá-lo:
Este snippet cria uma barra de progresso de 10 etapas e a cada 100ms uma etapa é
concluída. Quando a barra termina, limpamos o intervalo:
Machine Translated by Google
https://github.com/chalk/chalk
https://www.npmjs.com/package/progress
Quando você atribui um objeto ou uma função como uma nova propriedade de exportação , isso é o
que está sendo exposto e, como tal, pode ser importado em outras partes do seu aplicativo ou em
outros aplicativos também.
Quando você quer importar algo que você usa
Um arquivo Node.js pode importar funcionalidades expostas por outros arquivos Node.js.
Qualquer outro objeto ou variável definido no arquivo por padrão é privado e não exposto ao mundo
exterior.
O Node.js tem um sistema de módulos integrado.
para importar a funcionalidade exposta no arquivo library.js que reside na pasta de arquivo atual.
Nesse arquivo, a funcionalidade deve ser exposta antes de poder ser importada por outros arquivos.
Você pode fazê-lo de 2 maneiras.
14. Aceite a entrada da linha de
comando no Node
44
const ProgressBar = require('progresso')
bar.tick() if
(bar.completo) {
const bar = new ProgressBar(':bar', { total: 10 }) const timer =
setInterval(() => {
clearInterval(temporizador)
biblioteca const = require('./library')
}
}, 100)
Isto é o que a API module.exports oferece pelo sistema de módulos nos permite fazer.
Machine Translated by Google
https://nodejs.org/api/modules.html
https://nodejs.org/api/modules.html
A segunda maneira é adicionar o objeto exportado como propriedade de export .
Dessa forma, você pode exportar vários objetos, funções ou dados:
A primeira é atribuir um objeto a module.exports que é um objeto fornecido de
fábrica pelo sistema de módulos, e isso fará com que seu arquivo exporte apenas
esse objeto:
ou diretamente
E no outro arquivo, você o usará referenciando uma propriedade de sua importação:
,
marca: 'Ford',
modelo: 'Fiesta',
// index.js
const car = require('./car')
// carro.js
const carro = {
}
marca: 'Ford',
modelo: 'Fiesta',
const itens = require('./car')
export.car = carro
export.car =
{ marca: 'Ford',
modelo: 'Fiesta',
}
const carro = {
const { carro } = itens
module.exports = carro
}
45
Machine Translated by Google
46
15. Uma introdução ao
gerenciador de pacotes npm
}
marca: 'Ford',
modelo: 'Fiesta',
const { carro } = require('./car')
// app.js
const tesla = require('./car') const
ford = require('./car').car
}
console.log(tesla, ford)
module.exports =
{ marca: 'Tesla',
modelo: 'Modelo S',
// car.js
export.car = {
15.1. Introdução ao npm
require sempre retornará o objeto para o qual module.exports aponta.
ou você pode usar uma atribuição de desestruturação:
O primeiro expõe o objeto para o qual aponta. Este último expõe as propriedades
do objeto para o qual aponta.
Isto irá imprimir { brand: 'Tesla', model: 'Model S' } undefined já que o valor de
retorno da função require foi atualizado para o objeto que module.exports
aponta, então a propriedade que exporta adicionada não pode ser acessada.
Qual é a diferença entre module.exports e export ?
Machine Translated by Google
15.2. Transferências
15.2.1. Instalando todas as dependências
15.2.2. Instalando um único pacote
Se um projeto tiver um arquivo package.json , executando
Começou como uma forma de baixar e gerenciar dependências de pacotes Node.js, mas
desde então se tornou uma ferramenta usada também em JavaScript front-end.
Além disso, desde o npm 5, este comando adiciona às dependências do
arquivo package.json . Antes da versão 5, você precisava adicionar o sinalizador
Em janeiro de 2017, mais de 350.000 pacotes foram listados no registro npm, tornando-o
o maior repositório de código de idioma único na Terra, e você pode ter certeza de que
existe um pacote para (quase!) tudo.
Há muitas coisas que o npm faz.
ele instalará tudo o que o projeto precisa, na pasta node_modules , criando-o caso ainda
não exista.
Você também pode instalar um pacote específico executando
Fio e pnpm são alternativas ao npm cli. Você pode verificá-los como
Nós vamos.
47
O npm gerencia os downloads das dependências do seu projeto.
npm é o gerenciador de pacotes padrão para Node.js.
npm install
--salvar .
npm instalar
Machine Translated by Google
https://yarnpkg.com/en/
https://pnpm.io/
15.2.3. Atualizando pacotes
npm update
atualização npm
48
--save-opcional instala e adiciona a entrada ao arquivo package.json
-D: --save-dev
Muitas vezes você verá mais sinalizadores adicionados a este comando:
-D ou --save-dev instala e adiciona a entrada ao arquivo package.json devDependencies --
no-save instala mas não adiciona a entrada às dependências do arquivo package.jsonoptionalDependencies --no-
optional impedirá que as dependências opcionais sejam instaladas
Quanto às Dependências opcionais , a diferença é que a falha de compilação da dependência não
causará falha na instalação. Mas é responsabilidade do seu programa lidar com a falta de
dependência. Leia mais sobre dependências opcionais.
-O: --save-opcional
A atualização também é facilitada, executando
O npm verificará todos os pacotes para uma versão mais recente que satisfaça seu controle de versão
Abreviações das bandeiras também podem ser usadas:
A diferença entre devDependencies e dependências é que o primeiro contém ferramentas de
desenvolvimento, como uma biblioteca de teste, enquanto o último é empacotado com o
aplicativo em produção.
Você também pode especificar um único pacote para atualizar:
-S: --salvar
restrições.
Machine Translated by Google
https://docs.npmjs.com/cli/v7/configuring-npm/package-json#optionaldependencies
"scripts":
{ "start-dev": "node lib/server-development", "start":
"node lib/server-production"
}
}
{
npm run
Muitas vezes você descobrirá que uma biblioteca é compatível apenas com uma versão principal de
outra biblioteca.
Por exemplo:
Além dos downloads simples, o npm também gerencia o controle de versão, para que você possa
especificar qualquer versão específica de um pacote ou exigir uma versão superior ou inferior à
necessária.
Ou um bug na versão mais recente de uma lib, ainda não corrigida, está causando um problema.
O arquivo package.json oferece suporte a um formato para especificar tarefas de linha de comando
que podem ser executadas usando
Especificar uma versão explícita de uma biblioteca também ajuda a manter todos na mesma versão
exata de um pacote, para que toda a equipe execute a mesma versão até que o arquivo package.json
seja atualizado.
Em todos esses casos, o versionamento ajuda muito, e o npm segue o padrão de versionamento
semântico (semver).
É muito comum usar esse recurso para executar o Webpack:
49
15.3. Controle de versão
15.4. Tarefas em execução
Machine Translated by Google
16. Onde o npm instala os
pacotes?
uma instalação global
Por padrão, quando você digita um comando npm install , como:
o pacote é instalado na árvore de arquivos atual, na subpasta node_modules .
Ao instalar um pacote usando o npm , você pode realizar 2 tipos de instalação:
Quando isso acontece, o npm também adiciona a entrada lodash na propriedade
dependencies do arquivo package.json presente na pasta atual.
Então, em vez de digitar esses comandos longos, que são fáceis de esquecer ou
digitar errado, você pode executar
uma instalação local
Uma instalação global é realizada usando o sinalizador -g :
50
}
{
npm instala lodash
"scripts":
{ "watch": "webpack --watch --progress --colors --config webpack.conf.js "dev":
"webpack --progress --colors --config webpack.conf.js", "prod": "NODE_ENV=produção
webpack -p --config webpack.conf.js"
}
$ npm executar
assistir $ npm
executar dev $ npm executar prod
Machine Translated by Google
instalado usando npm
17. Como usar ou executar um pacote
Onde exatamente?
, então pacotes
ou
em vez disso, ele usará um local global.
Quando isso acontecer, o npm não instalará o pacote na pasta local, mas
Por exemplo, se seu nome de usuário for 'joe' e você usar a
localização nvm
Quando você instala um pacote em sua pasta node_modules usando npm
também globalmente, como você o usa em seu código Node.js?
diferem.
Para usá-lo em seu código, você só precisa importá-lo para seu programa usando
Isso vai instalar o pacote na pasta node_modules local.
No entanto, se você usar nvm para gerenciar versões do Node.js, esse local
Como
No macOS ou Linux, esse local pode ser /usr/local/lib/node_modules . Sobre
,
máquina.
mostrar
a popular biblioteca de utilitários JavaScript, usando
O comando npm root -g lhe dirá onde essa localização exata está no seu
vai
,
51
npm install -g lodash
/Users/joe/.nvm/versions/node/v8.9.0/lib/node_modules .
Digamos que você instale o lodash
exigir :
npm instala lodash
Windows pode ser C:\Users\YOU\AppData\Roaming\npm\node_modules
Machine Translated by Google
_ = exigir('lodash')
Nesse caso, ele colocará o arquivo executável em node_modules/.bin/
const
Uma maneira fácil de demonstrar isso é cowsay.
pasta.
ele vai se instalar sozinho
O pacote cowsay fornece um programa de linha de comando que pode ser executado
,
E se o seu pacote for um executável?
Há uma pasta .bin oculta , que contém links simbólicos para o cowsay
fazer uma vaca dizer algo (e outros animais também).
binários:
Ao instalar o pacote usando npm, instale cowsay e
algumas dependências na pasta node_modules :
52
Machine Translated by Google
https://www.npmjs.com/package/cowsay
18. O guia package.json
npx cowsay me tire daqui
53
Como você executa aqueles?
,
e o npx encontrará o local do executável.
É claro que você pode digitar ./node_modules/.bin/cowsay para executá-lo e
funciona, mas npxincluído nas versões recentes do npm (desde 5.2), é uma opção muito
melhor. Você apenas executa:
Machine Translated by Google
18.1. A estrutura do arquivo
{
}
"name": "projeto-teste"
{}
54
Aqui está um arquivo package.json de exemplo:
Se você está construindo um pacote Node.js que deseja distribuir pelo npm , as
coisas mudam radicalmente, e você deve ter um conjunto de propriedades que
ajudarão outras pessoas a usá-lo. Veremos mais sobre isso mais adiante.
Ele define uma propriedade name , que informa o nome do aplicativo, ou pacote,
contido na mesma pasta em que esse arquivo reside.
Para que é isso? O que você deve saber sobre isso e quais são algumas das coisas
legais que você pode fazer com ele?
O arquivo package.json é uma espécie de manifesto para seu projeto. Ele pode fazer
um monte de coisas, completamente não relacionadas. É um repositório central de
configuração de ferramentas, por exemplo. É também onde npm e yarn armazenam
os nomes e versões de todos os pacotes instalados.
Está vazio! Não há requisitos fixos do que deve estar em um arquivo package.json ,
para um aplicativo. O único requisito é que respeite o formato JSON, caso contrário
não poderá ser lido por programas que tentem acessar suas propriedades
programaticamente.
Se você trabalha com JavaScript, ou já interagiu com um projeto JavaScript, Node.js
ou um projeto frontend, com certeza conheceu o arquivo package.json .
Este é outro pacote.json:
Aqui está um exemplo muito mais complexo, que foi extraído de um aplicativo
Vue.js de amostra:
Machine Translated by Google
"description": "Um projeto Vue.js",
"main": "src/main.js", "private": true,
"scripts": { "dev": "webpack-dev-server --
inline -- progress --config build/webpack.
"start": "npm run dev", "unit": "jest --config test/unit/jest.conf.js --coverage", "test":
"npm run unit" , "lint": "eslint --ext .js,.vue src test/unit", "build": "node build/build.js" },
"dependencies": { "vue": "^2.5.2"
"name": "projeto de teste",
"versão": "1.0.0",
},
"devDependencies":
{ "autoprefixer":