Primeiro programa em node.js

Antes de fazermos o primeiro programa para node.js, vamos criar uma pasta no disco para os programas. Podemos criar uma pasta chama nodejs.
De seguida, abrimos o terminal e mudamos para a pasta nodejs:

Vamos então criar o ficheiro de javascript ola.js com o editor Visual Studio Code.
Na pasta nodejs fazemos
code ola.js

Este comando abre o Visual Studio Code e cria o ficheiro ola.js.

No ficheiro ola.js escrevemos o seguinte código:

function ola(nome) {
   console.log("Olá " + nome);
}

ola("Maria");

Guardamos o ficheiro e para executá-lo vamos ao terminal e escrevemos:

node ola.ja;

A instrução node ola.js chama o runtime do node.js e passa-lhe o ficheiro de javascript a ser executado.

Como podemos ver, ele mostra a mensagem Olá Luis na consola.

O ficheiro package.json

O ficheiro package.json é um ficheiro indispensável em qualquer projecto de node.js. É um ficheiro com código json constituído por um objecto com várias propriedades.
Essas propriedades contém informação importante, ou seja, metadados, sobre o projecto.

O ficheiro package.json lista os módulos dos quais o seu projeto depende. Especifica as versões nos módulos instalados. Torna a sua compilação reproduzível e, portanto, mais fácil de compartilhar com outros programadores.

O ficheiro package.json deve residir na pasta de raiz do projeto nodejs.

Criamos o ficheiro package.json escrevendo a instrução npm init, no terminal, na pasta do projeto.

Ao executarmos a instrução acima, é pedido ao programador que introduza informação sobre o projeto tal como: nome, versão, descrição, autor, etc.

O ficheiro criado tem uma estrutura básica que é a seguinte:

{ 
"name": "mysql-app", 
"version": "1.0.0", 
"description": "", 
"main": "app.js", 
"scripts": {
   "test": "echo \"Error: no test specified\" && exit 1"  
 }, 
"author": "", 
"license": "ISC" 
} 

Estrutura do ficheiro package.json

O ficheiro package.json é composto por várias propriedades sendo duas delas obrigatórias: name e version.
name é o nome da aplicação.
version é a versão da aplicação.

Para além dessas propriedades existem várias outras opcionais.
De notar, a directiva main que especifica o script de javascript que é o ponto de entrada da
aplicação.
Na propriedade scripts podemos especificar os scripts de teste da aplicação.

Quando instalamos um package ou módulo, como por exemplo o package mysql, o ficheiro package.json é atualizado na propriedade dependencies passando a referenciar o módulo instalado:

{ 
"name": "mysql-app", 
"version": "1.0.0", 
"description": "", 
"main": "app.js", 
"scripts": { 
   "test": "echo \"Error: no test specified\" && exit 1" 
 }, 
"author": "", 
"license": "ISC", 
"dependencies": { 
   "mysql": "^2.17.1" 
 }
}

A instalação do módulo mysql está refletida na propriedade dependencies onde está o nome do módulo e a sua versão.

O ficheiro package-lock.json

A partir da versão 5.X.X do npm, sempre que se instala um package é criado o ficheiro
package-lock.json .
Normalmente, o ficheiro package-lock.json é criado com o comando e que descreve a
árvore de dependências dos packages instalados.
Exemplo de um ficheiro package-lock.json, após a instalação do package mysql:

{ 
"name": "mysql-app", 
"version": "1.0.0", 
"lockfileVersion": 1, 
"requires": true, 
"dependencies": { 
"bignumber.js": { 
"version": "7.2.1", 
"resolved": "https://registry.npmjs.org/bignumber.js/- 
/bignumber.js-7.2.1.tgz", 
"integrity": "sha512- 
S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3 
NuaaygCRrEpqox4uDOrbdQ==" 
}, 
"core-util-is": { 
"version": "1.0.2", 
"resolved":  "https://registry.npmjs.org/core-util-is/- 
/core-util-is-1.0.2.tgz", 
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 
}, 
"inherits": { 
"version": "2.0.4", 
"resolved": "https://registry.npmjs.org/inherits/- 
/inherits-2.0.4.tgz", 
"integrity": "sha512- 
k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zG 
SoIFeMpXKxa4dYeZIQqewQ==" 
}, 
"isarray": { 
"version": "1.0.0", 
"resolved": "https://registry.npmjs.org/isarray/-/isarray- 
1.0.0.tgz", 
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 
}, 
"mysql": { 
"version": "2.17.1", 
"resolved": "https://registry.npmjs.org/mysql/-/mysql- 
2.17.1.tgz", 
"integrity": "sha512- 
7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaH 
rHwNcQ/MTUz7/oobZ2OyyA==", 
"requires": { 
"bignumber.js": "7.2.1", 
"readable-stream": "2.3.6", 
"safe-buffer": "5.1.2", 
"sqlstring": "2.3.1" 
} 
}, 
"process-nextick-args": { 
"version": "2.0.1", 
"resolved": "https://registry.npmjs.org/process-nextick- 
args/-/process-nextick-args-2.0.1.tgz", 
"integrity": "sha512- 
3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxu 
bEF6Wn2ypscTKiKJFFn1ag==" 
}, 
"readable-stream": { 
"version": "2.3.6", 
"resolved": "https://registry.npmjs.org/readable-stream/- 
/readable-stream-2.3.6.tgz", 
"integrity": "sha512- 
tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9d 
UrAC39ITejlZWhVIwawkKw==", 
"requires": { 
"core-util-is": "~1.0.0", 
"inherits": "~2.0.3", 
"isarray": "~1.0.0", 
"process-nextick-args": "~2.0.0", 
"safe-buffer": "~5.1.1", 
"string_decoder": "~1.1.1", 
"util-deprecate": "~1.0.1" 
} 
}, 
"safe-buffer": { 
"version": "5.1.2", 
"resolved": "https://registry.npmjs.org/safe-buffer/- 
/safe-buffer-5.1.2.tgz", 
"integrity": "sha512- 
Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF 
8LOIrt8ud/wPtojys4G6+g==" 
}, 
"sqlstring": { 
"version": "2.3.1", 
"resolved": "https://registry.npmjs.org/sqlstring/- 
/sqlstring-2.3.1.tgz", 
"integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 
},
"string_decoder": { 
"version": "1.1.1", 
"resolved": "https://registry.npmjs.org/string_decoder/- 
/string_decoder-1.1.1.tgz", 
"integrity": "sha512- 
n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8p 
JAveEEdnkHyPyTP/mzRfwg==", 
"requires": { 
"safe-buffer": "~5.1.0" 
} 
}, 
"util-deprecate": { 
"version": "1.0.2", 
"resolved": "https://registry.npmjs.org/util-deprecate/- 
/util-deprecate-1.0.2.tgz", 
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 
} 
} 
}