Bom dia amigos
Eu continuo a postar uma tradução deste tutorial Node.js .
Outras partes:
Parte 1
Parte 2
Parte 3
Parte 4
Obtendo dados inseridos pelo usuário no Node.js
Como faço para tornar um programa Node.js interativo?
Para fazer isso, a versão 7 do Node.js. introduz o módulo readline : é usado para obter dados de um fluxo para leitura, como
process.stdin
uma linha de comando durante a execução de um programa Node.js.
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
readline.question(`What is your name?`, name => {
console.log(`Hi ${name}!`)
readline.close()
})
Esse código solicita o nome de usuário. Após a digitação e o clique do usuário
enter
, uma saudação é exibida.
O método
question()
imprime o primeiro parâmetro (pergunta) no console e aguarda a resposta do usuário. Quando pressionado enter
, a função de retorno de chamada é executada.
Nesse retorno de chamada, fechamos a interface
readline
.
readline
contém outros métodos, sobre os quais você pode ler na documentação.
Se você precisar solicitar uma senha, é melhor não devolvê-la explicitamente, mas use símbolos
*
.
Uma maneira de fazer isso é usar o pacote readline-sync , que é simples de entender e fácil de configurar.
Uma solução mais completa e abstrata é fornecida pelo pacote Inquirer.js .
Nós o instalamos com a ajuda
npm install inquirer
e usamos da seguinte maneira:
const inquirer = require('inquirer')
const questions = [
{
type: 'input',
name: 'name',
message: `What's your name?`
}
]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers['name']}!`)
})
O Inquirer.js permite que você faça várias coisas legais, como sugerir várias opções, fornecer botões de opção, solicitar confirmação etc.
É mais conhecido como uma alternativa às soluções integradas, mas se você planeja levar a experiência do usuário para o próximo nível, o Inquirer.js é a melhor solução.
Estendendo a funcionalidade do arquivo Node.js usando exportação
O Node.js possui um sistema modular embutido.
O arquivo Node.js pode importar a funcionalidade de outros arquivos Node.js.
Quando você deseja importar algo que você usa
const library = require('./library')
para importar a funcionalidade exportada em um arquivo
library.js
localizado no diretório atual.
Nesse arquivo, a funcionalidade deve ser exportada antes de poder ser importada em outro arquivo.
Qualquer outro objeto ou variável definido em um arquivo é por padrão privado (privado) e não pode ser usado em outros arquivos.
É isso que a interface
module.exports
fornecida pelo sistema modular nos permite fazer .
Quando você atribui um objeto ou função como uma nova propriedade do objeto
exports
, você os exporta e, em seguida, eles podem ser importados para outro lugar no aplicativo ou em outro aplicativo.
Isso pode ser feito de duas maneiras.
A primeira maneira é atribuir um valor
module.exports
, que é o objeto padrão fornecido pelo sistema modular. Este método permite exportar apenas este objeto:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//
const car = require('./car')
A segunda maneira é adicionar o objeto exportado como uma propriedade do objeto
exports
. Este método permite exportar muitos objetos, funções ou dados:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car
ou então
exports.car = {
brand: 'Ford',
model: 'Fiesta'
}
Para usar este objeto em outro arquivo, você deve fazer um link para a importação:
const items = require('./items')
items.car
ou
const car = require('./items').car
Qual é a diferença entre
module.exports
e exports
?
O primeiro exporta o objeto referenciado, o segundo uma propriedade do objeto.
Uma introdução ao gerenciador de pacotes npm
Introdução ao npm
npm
É o gerenciador de pacotes padrão do Node.js.
Em janeiro de 2017, o npm tinha mais de 350.000 pacotes, tornando-o o maior repositório de código em uma única linguagem de programação do Google Earth, e você pode ter certeza de que existem pacotes para fazer praticamente qualquer coisa.
Tudo começou com o download e o gerenciamento de dependências no Node.js, mas logo essa ferramenta começou a ser usada ativamente no desenvolvimento do lado do cliente dos aplicativos.
npm
faz várias coisas.
Uma alternativa ao npm é o fio .
Carregando
npm
gerencia o carregamento de dependências do projeto.
Se existir um arquivo no projeto, o
package.json
lançamento npm install
instalará tudo o que o projeto requer no diretório node_modules
criado, se ele não existir.
Um pacote específico pode ser instalado usando
npm install <package-name>
.
Muitas vezes, a instalação de um pacote é acompanhada por sinalizadores:
- --save - instala o pacote e inclui uma entrada sobre ele na seção de dependências do arquivo
package.json
- --save-dev - instala o pacote e adiciona uma entrada sobre ele na seção devDependencies do arquivo
package.json
A principal diferença é que o devDependencies é usado para fins de desenvolvimento, por exemplo, para teste e as dependências são usadas na produção (ao criar um projeto).
Atualizando pacotes
A atualização é fácil com
npm update
.
npm
irá verificar todos os pacotes para novas versões que atendam às restrições estabelecidas.
Você também pode atualizar um pacote específico:
npm update <package-name>
.
Versionamento
Além dos downloads padrão, o npm suporta controle de versão, para que você possa especificar qualquer versão específica de um pacote ou solicitar uma versão mais recente ou mais antiga.
Você encontrará frequentemente que uma biblioteca é compatível apenas com uma versão (principal) de outra biblioteca.
E também com os bugs das versões mais recentes que não foram corrigidas por um longo tempo.
O controle de versão também ajuda no desenvolvimento da equipe, porque cada membro da equipe sabe qual versão usar antes de atualizar o arquivo
package.json
.
Em todos esses casos, o controle de versão ajuda; nesse sentido,
npm
segue os padrões aceitos.
Executando tarefas
package.json
suporta um formato para especificar comandos a serem executados no terminal com npm run <task-name>
.
Por exemplo:
{
"scripts": {
"start-dev": "node lib/server-development",
"start": "node lib/server-production"
},
}
É prática comum usar esse recurso para executar o Webpack:
{
"scripts": {
"watch": "webpack --watch --progress --colors --config webpack.conf.js",
"dev": "webpack --progress --colors --config webpack.conf.js",
"prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
},
}
Isso permite, em vez de um conjunto de comandos longos, fáceis de esquecer ou fáceis de cometer erros, fazer o seguinte:
npm run watch
npm run dev
npm run prod
Onde o npm instala pacotes?
Ao instalar pacotes usando,
npm
você pode escolher entre dois tipos de instalação:
- local
- global
Por padrão, quando você insere,
npm install
por exemplo:
npm install lodash
o pacote está instalado em uma pasta
node_modules
no diretório atual.
Após a instalação,
npm
adicione um registro o lodash
à seção dependencies
file package.json
no diretório atual.
Para uma instalação global, use o sinalizador
-g
:
npm install -g lodash
Em uma instalação global, o pacote é instalado não no diretório atual, mas no global.
Mas onde exatamente?
Para determinar isso, você precisa executar o comando
npm root -g
.
No macOS ou Linux, esse diretório pode ser
/usr/local/lib/node_modules
. No Windows - C:\Users\YOU\AppData\Roaming\npm\node_modules
. Esse diretório pode ser diferente
quando usado
nvm
para controle de versão do Node.js.
Como uso os pacotes instalados?
Como usar um
node_modules
pacote instalado em uma pasta ou globalmente.
Digamos que você instalou uma
lodash
biblioteca auxiliar JavaScript popular npm install lodash
.
Este comando será instalado
lodash
em um diretório local node_modules
.
Para usar o programa, você precisa importar o pacote usando
require
:
const _ = require('lodash')
E se o pacote for executável (arquivo)?
Neste caso, o arquivo executável será colocado no diretório
node_modules/.bin/
.
Isso pode ser facilmente demonstrado usando a biblioteca cowsay .
Este pacote fornece um programa de linha de comando, quando executado, a vaca (e outros animais) "fala" alguma coisa.
Ao instalar um pacote via
npm install cowsay
, o próprio pacote e várias de suas dependências serão instaladas:
A pasta
.bin
está oculta e contém links simbólicos para a resposta dos dados binários:
Como executá-los?
É claro que você pode digitar
./node_modules/.bin/cowsay
e deve funcionar, mas o npx incluído no npm (desde 5.2) é a melhor opção. Você apenas faznpx cowsay
e o npx localizará o arquivo automaticamente: A
vaca diz "me tire daqui".
Manual do Package.json
Ao trabalhar com JavaScript, ao interagir com um projeto JavaScript, Node.js ou o front-end de um aplicativo, você provavelmente encontrará um
package.json
.
O que é isso? O que você deveria saber sobre ele? E o que você pode fazer com isso?
package.json
É um tipo de manifesto do projeto. Ele pode fazer muitas coisas que não têm nenhuma relação entre si. Por exemplo, pode ser o arquivo principal para as configurações das ferramentas usadas. Ele também armazena os nomes e versões de todos os pacotes instalados (essas informações são usadas npm
e yarn
).
Estrutura de arquivo
Aqui está um exemplo
package.json
:
{}
Como você pode ver, está vazio. Não
package.json
há requisitos para o conteúdo . O único requisito é seu formato (JSON), caso contrário, os programas não poderão acessá-lo.
Se você estiver criando um pacote Node.js. que planeja distribuir
npm
, a situação mudará drasticamente e você precisará adicionar propriedades para ajudar outras pessoas a usar o pacote. Veremos isso mais tarde.
Aqui está outro exemplo
package.json
:
"name": "test-project"
Aqui nós definimos o nome do pacote ou aplicativo localizado no mesmo diretório que
package.json
.
Aqui está um exemplo de um mais complexo
package.json
emprestado de um aplicativo Vue.js.
{
"name": "test-project",
"version": "1.0.0",
"description": "A Vue.js project",
"main": "src/main.js",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"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"
},
"devDependencies": {
"autoprefixer": "^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",
"jest": "^22.0.4",
"jest-serializer-vue": "^0.3.0",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"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%", "last 2 versions", "not ie <= 8"]
}
Há muito aqui:
name
- nome do aplicativo / pacoteversion
- versão do aplicativo / pacotedescription
- uma breve descrição do aplicativo / pacotemain
- ficheiro principal (ponto de entrada) da aplicaçãoprivate
- o valortrue
impede a publicação acidental do aplicativo nonpm
scripts
- um conjunto de scripts (comandos) que podem ser executados (executados)dependencies
- dependências do projetodevDependencies
- dependências do projeto usadas apenas durante o desenvolvimentoengines
- versões em que o aplicativo / pacote está sendo executadobrowserlist
- navegadores suportados (e suas versões)
Todas essas propriedades são usadas
npm
.
Propriedades
Nesta seção, falaremos sobre algumas das propriedades que você pode usar. Usaremos o termo "pacote", mas a maior parte do que foi dito também se aplica a aplicativos.
A maioria das propriedades é necessária para publicar o pacote
npm
, algumas para interagir com o pacote.
Nome nome)
Especifica o nome do pacote.
Por exemplo:
"name": "test-project"
O nome não deve exceder 214 caracteres, não deve conter espaços e pode consistir apenas em letras minúsculas (minúsculas), hífens (-) e sublinhado (_).
Isso ocorre porque um
npm
URL é atribuído ao pacote quando ele é publicado com base em seu nome.
Se o pacote for publicado no GitHub, é uma boa prática vincular ao repositório.
Autor
Identifica o autor do pacote.
Por exemplo:
{
"author": "Joe <joe@whatever.com> (https://whatever.com)"
}
ou então:
{
"author": {
"name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
}
}
Contribuintes
Especifica um ou mais contribuidores para o pacote. Esta propriedade é uma matriz de seqüências de caracteres.
Por exemplo:
{
"contributors": ["Joe <joe@whatever.com> (https://whatever.com)"]
}
ou então:
{
"contributors": [
{
"name": "Joe",
"email": "joe@whatever.com",
"url": "https://whatever.com"
}
]
}
Erros
Define um link para um rastreador de problemas, geralmente um rastreador de problemas no GitHub.
Por exemplo:
{
"bugs": "https://github.com/whatever/package/issues"
}
Pagina inicial
Define o endereço da página inicial.
Por exemplo:
{
"homepage": "https://whatever.com/package"
}
Versão
Determina a versão atual do pacote.
Por exemplo:
"version": "1.0.0"
Esta propriedade segue o padrão de versão semântica. Isso significa que ele deve sempre consistir em três números separados por pontos
x.x.x
.
O primeiro número é a versão principal, o segundo é a versão secundária e o terceiro é o patch.
Cada número tem um significado específico: uma atualização para corrigir bugs é um patch, uma versão de alterações compatíveis com versões anteriores é uma versão menor e uma versão principal pode significar alterações incompatíveis com a versão anterior.
Licença
Especifica a licença para o pacote.
Por exemplo:
"license": "MIT"
Palavras-chave
Esta propriedade é uma matriz de palavras-chave associadas ao pacote.
Por exemplo:
"keywords": [
"email",
"machine learning",
"ai"
]
Eles ajudam as pessoas a encontrar pacotes.
Descrição
Define uma breve descrição para o pacote.
Por exemplo:
"description": "A package to work with strings"
Ao publicar um pacote em uma
npm
determinada propriedade, ajuda as pessoas a entender para que serve.
Repositório
Determina onde o código fonte do pacote está localizado.
Por exemplo:
"repository": "github:whatever/testing",
Preste atenção ao prefixo
github
. Existem outros serviços semelhantes:
"repository": "gitlab:whatever/testing",
"repository": "bitbucket:whatever/testing",
Você também pode definir um sistema de controle de versão:
"repository": {
"type": "git",
"url": "https://github.com/whatever/testing.git"
}
Você pode especificar vários sistemas de controle de versão:
"repository": {
"type": "svn",
"url": "..."
}
a Principal
Define o arquivo principal (ponto de entrada) do pacote.
Ao importar um pacote para um aplicativo, é nesse arquivo que o aplicativo procurará os módulos exportados.
Por exemplo:
"main": "src/main.js"
privado
Definir essa propriedade como um valor
true
impede que o pacote seja publicado acidentalmente em npm
.
Por exemplo:
"private": true
scripts
Define uma lista de comandos (scripts) que podem ser executados (executados).
Por exemplo:
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"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"
}
Esses scripts são aplicativos de linha de comando. Você pode executá-los com
npm run XXXX
ou yarn run XXXX
, onde XXXX
está o nome do comando. Por exemplo: npm run dev
.
Você pode usar qualquer nome como o nome do comando, o script fará o que você especificar nele.
Dependências
Define uma lista de dependências de pacotes.
Ao instalar um pacote usando npm ou yarn:
npm install <PACKAGENAME>
yarn add <PACKAGENAME>
o registro deste pacote será adicionado automaticamente à propriedade em questão.
Por exemplo:
"dependencies": {
"vue": "^2.5.2"
}
devDependencies
Define uma lista de dependências para fins de desenvolvimento.
Eles diferem
dependencies
, pois são instalados apenas no computador do desenvolvedor e não entram em produção.
Ao instalar um pacote usando npm ou yarn:
npm install --save-dev <PACKAGENAME>
yarn add --save-dev <PACKAGENAME>
o registro sobre ele é automaticamente adicionado à propriedade considerada.
Por exemplo:
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1"
}
motores
Determina em quais versões do Node.js ou outras ferramentas o pacote / aplicativo está executando.
Por exemplo:
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0",
"yarn": "^0.13.0"
}
lista de navegadores
Define uma lista de navegadores suportados (e suas versões). Essas informações são usadas pelo Babel, Autoprefixer e outras ferramentas para criar polyfills e garantir a compatibilidade com os navegadores especificados.
Por exemplo:
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
Essa configuração significa que você deseja oferecer suporte às duas versões mais recentes de todos os navegadores que mais de 1% das pessoas usam de acordo com as estatísticas do CanIUse , com exceção do IE8 e das versões anteriores.
Propriedades especiais
package.json
pode conter propriedades especiais para ferramentas como Babel, ESLint etc.
Cada uma dessas ferramentas possui suas próprias propriedades, por exemplo
eslintConfig
, babel
e assim por diante. Para detalhes sobre propriedades especiais, consulte a documentação correspondente.
Versões do pacote
Nos exemplos acima, você provavelmente notou entradas como esta:
~3.0.0
, ^0.13.0
. O que eles querem dizer? E que outros especificadores de versão posso usar?
Esses especificadores são usados para definir condições de atualização.
As regras são as seguintes:
~
- write~0.13.0
significa que apenas atualizações de patches são permitidas, ou seja, release é0.13.1
válido, mas release0.14.0
não é^
- write^0.13.0
significa patch e pequenas atualizações são permitidas*
- registro*
significa que qualquer atualização é permitida>
- quaisquer novas versões são permitidas>=
- versões semelhantes ou mais recentes são permitidas<=
- versões semelhantes ou mais antigas são aceitáveis<
- quaisquer versões antigas são permitidas
Aqui estão mais algumas regras:
- nenhum caractere inicial - somente a versão especificada é permitida
latest
- apenas a versão mais recente é permitida
Esses caracteres podem ser combinados de várias maneiras, por exemplo:
1.0.0 || >=1.1.0 <1.2.0
.
Obrigado pela atenção.
Continua…