Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] "type": "module"

Durante a tentativa de execução do index.js na aula 5 - Exibindo os Livros me deparei com o seguinte erro

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'C:\Users\Monitora\Documents\treinamentoJsHelthClient\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///C:/Users/Monitora/Documents/treinamentoJsHelthClient/Ordena%C3%A7%C3%A3o/index.js:1:16
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Node.js v20.11.0

após eu alterar a linha de código 'type' do meu arquivo package.json de module para commonjs

 "type": "commonjs",

funcionou! porque isso acontece?

1 resposta
solução!

Olá Leandro, tudo bem?

Isso acontece pois o Node.js opera com dois sistemas de importação distintos: CommonJS e ES6 Imports.

O primeiro, é uma exclusividade do Node.JS e não está disponível nos navegadores, mas o segundo foi criado especificamente para os navegadores, e então adaptado para o Node.

Assim, ao importar um arquivo, a forma de importação muda de acordo com o ambiente que está usando.

O Node automaticamente importa com CommonJS, a menos que especificado o contrário. Então, se remover a linha "type" do "package.json", e nomear o arquivo com a extensão ".js", automaticamente poderá utilizar o require() para importar.

Entretanto, se preferir utilizar o modo de importação mais recente, ES6 Imports, você pode: renomear o arquivo como ".mjs", e/ou alterar "type" para "module", para permitir esse comportamento.

De acordo com a documentação: "Files ending with .js or lacking any extension will be loaded as ES modules when the nearest parent package.json file contains a top-level field "type" with a value of "module"."

Que, traduzido, diz: "Arquivos terminados com a extensão '.js' ou sem extensão, serão carregados como módulos ES6 quando o 'package.json' mais próximo contiver um campo "type" com valor "module".

Lembre-se que: uma forma diferente de importar significa uma forma diferente de exportar também. Certifique-se de checar a sintaxe de tudo antes e depois de alterar o tipo de importação.

Pessoalmente, prefiro lidar com CommonJS usando o require(), mas ele tem suas vantagens e desvantagens. Entretanto, por enquanto a maioria dos pacotes disponíveis para Node.js utilizam CommonJS, então pode ser uma boa ideia lidar com esse formato até que (caso realmente haja) uma migração geral ocorra.

Uma postagem de blog a respeito, mais aprofundada: https://blog.logrocket.com/commonjs-vs-es-modules-node-js/

Outra postagem, mais completa: https://medium.com/globant/exploring-node-js-modules-commonjs-vs-es6-modules-2766e838bea9