Soy nuevo en JS y Node. Por lo que he estado leyendo, parece que la importación de ES6 no es compatible con Node , por lo que me veo obligado a usar el modo de experimento (cambiando el nombre de mi archivo a mjs)
Esto funciona en su mayor parte a menos que el archivo mjs necesite usar require . Mi solución actual es dividir el fragmento de código que depende de require en un archivo .js separado e importar ese archivo js
foo.mjs
import readFileSync from './util.js' ... //orignally just do require('fs') and do fs.readFileSync() const configFile = readFileSync(configFilePath);util.js
const fs = require('fs'); const path = require('path'); function readFileSync(filePath) { console.log(__dirname) console.log(path.resolve(__dirname, filePath)) return fs.readFileSync(path.resolve(__dirname, filePath), 'utf8'); } module.exports = readFileSync ¿Hay alguna manera de evitar hacer esto? Mi app.js tiene muchos require y no quiero dividir todas esas partes en archivos js separados.
Intenté cambiar require para importar
// const express = require('express'); import * as express from 'express'; pero cuando se ejecuta node --experimental-modules app.mjs
me sale un error
TypeError: express is not a functioncreo que necesito
require en mjsTienes tres opciones decentes:
require en el código ESMimport() (importación dinámica) en su CJS para importar código ESM El envoltorio a utilizar require en el código ESM:
import { createRequire } from 'module' const require = createRequire(import.meta.url) const cjsFile = require('./test') // test is regular .js file using module.exportsImportaciones dinámicas:
// foo.mjs: export const foo = () => true // index.js: import('./foo.mjs').then(x => console.log(x.foo())) Los proyectos grandes con tipos de módulos mixtos frecuentemente usan Babel y/o TypeScript, los cuales manejan bien los tipos mixtos. Babel sería más fácil de aprender y configurar. Pero si no tiene un montón de código con el que lidiar, el método createRequire funciona bien.
En cuanto al problema con Express, falló porque la exportación predeterminada es lo que desea: import express from 'express' , no import * as express... .