Soy un principiante en NodeJS. Estaba tratando de importar un módulo fs.readFileSync . Usé import { readFileSync } de 'fs' según los documentos de NodeJS, pero sigo recibiendo el siguiente error:
ERROR ----->> SyntaxError: Cannot use import statement outside a module
Mi investigación
-> Descubrí que agregar type:module en el archivo package.json resuelve este problema.
Mi duda
->Quiero saber por qué esto no se puede importar según la documentación.
Código
import { readFileSync } from 'fs'; fs.writeFileSync('notes.txt','This was read by NodeJS')Error completo
SyntaxError: Cannot use import statement outside a module at Object.compileFunction (node:vm:352:18) at wrapSafe (node:internal/modules/cjs/loader:1031:15) at Module._compile (node:internal/modules/cjs/loader:1065:27) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47De forma predeterminada, para un archivo .js , nodejs primero busca en el archivo package.json el tipo de módulo. Si no se encuentra ningún tipo de módulo allí, entonces pasa por la extensión de archivo del archivo. Es un archivo .js , luego asume que es un módulo CommonJS (donde usa require() , no import ). Si es un archivo .mjs , entonces asume que es un archivo ESM (donde usa import ).
Como descubrió, puede anular el manejo de las extensiones de archivo especificando el type como module en el archivo package.json para que los archivos .js puedan usar import .
Puede indicar en su seguimiento de pila que la carga del archivo se realiza mediante: internal/modules/cjs/loader donde cjs significa CommonJS , por lo que definitivamente está tratando de cargar el archivo como un módulo CommonJS.
Si se pregunta por qué las cosas están configuradas de esta manera, es por el historial de nodejs. Originalmente, todo lo que había eran archivos CommonJS: ese fue el único tipo de módulo durante muchos años. Entonces, para compatibilidad con versiones anteriores, si no se especifica ningún tipo de módulo en el archivo package.json o a través de una extensión de archivo especial, entonces nodejs asume un archivo CommonJS para que siga siendo compatible con módulos más antiguos que no saben nada sobre el módulo más nuevo. tipos
En cuanto a por qué no puede usar la import en archivos CommonJS, esta fue claramente una decisión que los arquitectos de nodejs probablemente consideraron cuidadosamente. El desafío es que algunas partes de la especificación del módulo ESM son incompatibles con algunas cosas en el formato del módulo CommonJS. Entonces, en lugar de intentar meter las funciones de ambos módulos en un solo formato, decidieron tener dos formatos completamente separados. Esto evita conflictos entre las dos arquitecturas, pero crea esta necesidad de averiguar qué tipo de módulo se está utilizando.
Aquí está la documentación de nodejs sobre cómo nodejs elige un tipo de módulo:
https://nodejs.org/api/packages.html#determining-module-system