Expor a funcionalidade de um arquivo Node.js usando exportações

O Node.js tem um sistema de módulos nativo.

Um arquivo Node.js pode importar funcionalidades expostas por outros arquivos Node.js.

Quando você quer importar algo você deve utilizar

const library = require('./library')

para importar a funcionalidade exposta no arquivo library.js que reside na pasta atual.

Nesse arquivo, a funcionalidade deve ser exposta antes de poder ser importada por outros arquivos.

Qualquer outra variável ou objeto definido no arquivo é privado por padrão e não exposto ao mundo exterior.

Isso é permitido por meio da API module.exports, oferecida pelo module system.

Quando você atribui um objeto ou uma função como uma nova propriedade do exports, isso se torna o que está sendo exposto, e como tal, pode ser importado em outras partes da sua aplicação, ou até em outras aplicações.

Você pode fazer isso de 2 formas.

A primeira é atribuir um objeto ao module.exports, que é um objeto provido nativamente pelo sistema de módulos, e ele fará com que o arquivo exporte apenas aquele objeto:

const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//..em outro arquivo
const car = require('./car')

A segunda é definir o objeto exportado como propriedade do exports. Essa abordagem permite que você exporte múltiplos objetos, funções ou dados:

const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car

ou diretamente

exports.car = {
brand: 'Ford',
model: 'Fiesta'
}

Em outro arquivo, você irá utilizá-lo referenciando a propriedade da sua 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 expõe o objeto para qual ele aponta. O último expõe as propriedades do objeto que ele aponta.