es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

import index.js por nombre de directorio

He estado buscando y no puedo encontrar una respuesta clara a esto.

¿Es posible importar un archivo index.js desde un directorio del cliente utilizando el nombre del directorio (omitir /index.js)? Si es así, ¿cómo? Este es un nuevo proyecto y realmente no quiero empaquetar mi código en este momento.

La versión de Node es v17.1.0.

Estructura de archivos

package.json
server.js
src/
index.js
utils/
index.js

package.json

{
  "type": "module",
  "main": "server.js",
  "scripts": {
    "start": "nodemon --ignore src"
  },
  "devDependencies": {
    "express": "^4.17.1",
    "nodemon": "^2.0.14"
  }
}

server.js

import express from 'express'

express()
  .use(express.static('src'))
  .get('/', (_, res) => res.send(
    <script type="module" src="index.js"></script>
  ))
  .listen(3000, () => console.log('Running at http://localhost:3000'))

src/index.js

import { stuff } from './utils'

// Firefox: Loading module from “http://localhost:3000/utils/” 
// was blocked because of a disallowed MIME type (“text/html”).

He intentado ejecutar la aplicación con node --experimental-specifier-resolution=node server.js e intenté añadir express.static.mime.define({'text/javascript': ['js']}) a server.js, pero ninguno de los dos funciona para mí.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible importar un archivo index.js desde un directorio de clientes utilizando el nombre del directorio. Puedes lograr esto agregando una barra diagonal al final del nombre del directorio en la declaración de importación.

    Por ejemplo, para importar el archivo index.js desde el directorio utils, puedes usar:

    import { stuff } from './utils/'
    

    Esto importará el archivo index.js desde el directorio utils sin especificar explícitamente el nombre del archivo.

    Sin embargo, en la estructura de archivos y en los fragmentos de código proporcionados, parece que estás utilizando Node.js para ejecutar la aplicación, lo cual es un entorno del lado del servidor. La declaración de importación y la estructura de archivos parecen sugerir que estás utilizando los módulos de ES6, los cuales son compatibles de forma nativa en navegadores modernos.

    Si ese es el caso, es posible que encuentres problemas, como el error de tipo MIME que describiste, al ejecutar la aplicación en el lado del servidor. Node.js aún no ofrece soporte completo para los módulos de ES6.

    Para importar módulos en el lado del servidor, es posible que necesites utilizar un paquete como esm o babel, los cuales pueden transpilar los módulos de ES6 a módulos de CommonJS que Node.js puede entender.

    Otra opción es utilizar un empaquetador como Webpack o Rollup para agrupar tu código y sus dependencias en un solo archivo, el cual puede ser ejecutado en el lado del servidor con Node.js. Este es un enfoque común para aplicaciones JavaScript del lado del servidor.

    Si prefieres no empaquetar tu código, es posible que debas esperar a que Node.js agregue soporte completo para los módulos de ES6, o considerar la posibilidad de utilizar un entorno del lado del servidor alternativo, como Deno o una plataforma de funciones sin servidor.

Comments are closed.