‫Jonas: Como última parte de esta sección,
‫hablemos de cómo NODE. Los módulos JS realmente funcionan
‫detrás de escena.
‫Primero que nada en el NODO. Sistema de módulos
‫JS cada archivo JavaScript se trata como un módulo separado.
‫Y ya jugamos un poco con los
‫módulos en la
‫intersección, 'especialmente usando la función require
‫y exportando datos de los módulos.
‫Así que esos son los fundamentos de los módulos Common JS, que
‫es el sistema de módulos que usa el nodo.
‫Porque funciona especialmente bien en el servidor.
‫Ahora, también existe el script ECMA nativo o el
‫sistema de módulos ES
‫con el que quizás ya esté familiarizado,
‫especialmente si tomó mi curso de JavaScript
‫o si ha estado escribiendo
‫JavaScript en la interfaz últimamente.
‫Este sistema de módulo ES del que estaba hablando fue
‫desarrollado para funcionar en el navegador usando la sintaxis de importación y exportación.
‫Entonces, solo quería dejar en claro que estos
‫son dos sistemas de módulos diferentes que verá
‫en diferentes
‫situaciones, así que no se confunda.
‫También ha habido intentos de implementar módulos
‫ES nativos en NODE. JS ', especialmente
‫usando extensiones de archivo
‫como. mjs.
‫Pero hasta ahora, no se
‫ha convertido en algo muy popular.
‫Entonces, a menos que esté
‫viendo este curso
‫en un futuro lejano, probablemente siempre
‫usará el sistema Common JS con node.
‫Ahora, es posible que se pregunte por qué en NODE. JS todos
‫y cada uno de los módulos tienen
‫acceso a la función require
‫para importar módulos en primer lugar.
‫¿Derecha?
‫Quiero decir, no es una función estándar de JavaScript.
‫¿Entonces de donde viene?
‫¿Y cómo funciona exactamente entre bastidores?
‫Bueno, averigüémoslo.
‫Entonces, la pregunta aquí
‫es, qué sucede cada vez que
‫requerimos un módulo llamando a la función
‫require con un nombre de módulo, es el argumento.
‫Como una descripción general
‫muy amplia, los siguientes pasos se ejecutan detrás de escena.
‫Primero, se resuelve la ruta al
‫módulo requerido y se carga el archivo.
‫Luego, ocurre un proceso llamado empaquetado, se
‫ejecuta
‫el código del módulo y
‫se devuelven las exportaciones del módulo.
‫Y finalmente todo el módulo se almacena en caché.
‫Así que veamos ahora cada paso con más detalle.
‫En primer lugar, ¿cómo sabe el nodo qué archivo
‫cargar cuando necesitamos un módulo?
‫Porque recuerde, en realidad podemos
‫cargar tres tipos diferentes de módulos.
‫Los módulos centrales de
‫Node, nuestros propios módulos o módulos de terceros de npm como
‫express, que es el marco de nodo que
‫usaremos durante la mayor parte del curso.
‫Entonces, este proceso se conoce como resolución de la ruta del archivo.
‫Y así es como funciona.
‫Cuando las funciones obligatorias reciben el nombre
‫del módulo como
‫entrada, primero intentará cargar un módulo principal con ese nombre.
‫Como por ejemplo, el módulo http.
‫Automáticamente encontrará una ruta a ese módulo
‫y luego lo cargará.
‫Ahora bien, si la ruta comienza con un
‫punto, o dos
‫puntos, significa que es un módulo de desarrollador.
‫Porque indicamos la ruta relativa a nuestro archivo.
‫Por lo tanto, el nodo intentará cargar ese
‫archivo, pero si no hay ningún archivo con ese
‫nombre, buscará una carpeta en su
‫lugar y cargará el índice. js si está en esa carpeta.
‫Entonces, en este
‫ejemplo, intentará cargar lib / controller. js.
‫Recuerde que podemos eliminar el punto
‫js cuando necesitemos un módulo.
‫En caso de que no haya ningún
‫archivo en esta
‫ruta, intentará abrir index. js de la carpeta lib / controller en su lugar.
‫¿Tener sentido?
‫Y finalmente, si el módulo requerido
‫no es un
‫módulo central ni un módulo de
‫desarrollador, node asumirá que es un módulo de npm.
‫Y recuerde, en un módulo que cargamos desde npm, en
‫realidad no necesitamos escribir la ruta cuando lo necesitemos.
‫Solo el nombre
‫del módulo, tal y como funciona en un módulo principal.
‫Entonces, estos módulos de terceros se almacenan en
‫una carpeta de módulo de
‫nodo, por lo que el nodo ingresará a esa carpeta e
‫intentará encontrar un módulo allí y luego lo cargará.
‫Y, por supuesto, si el archivo no se puede encontrar en
‫ningún lugar, se genera un error y se detiene
‫la ejecución de la aplicación.
‫Continuando, después de que se carga
‫el módulo, el código del módulo se envuelve en una función
‫especial que nos dará acceso a un par de objetos especiales.
‫Entonces, este paso es donde ocurre la magia.
‫Es aquí donde obtenemos la respuesta a la pregunta,
‫¿de dónde proviene realmente la función require y por
‫qué tenemos acceso a ella?
‫Es porque el tiempo de ejecución
‫de nodejs quita el
‫código de nuestro módulo y lo coloca dentro
‫de la expresión de función invocada inmediatamente, o IIFE que puede ver aquí.
‫Entonces, el nodo en
‫realidad no ejecuta directamente el código que reescribo
‫en un archivo, sino la función contenedora que
‫contendrá nuestro código en su cuerpo.
‫También pasa el módulo requerido por los expertos, el
‫nombre del archivo y los objetos de directorio en él.
‫Es por eso que en cada
‫módulo automáticamente tenemos
‫acceso a cosas como la función require.
‫Entonces, estas son básicamente como variables globales que
‫se inyectan en todos y cada uno de los módulos.
‫Ahora, al hacer esto, node logra dos cosas muy importantes.
‫Lo primero, por supuesto, es dar a los desarrolladores acceso
‫a todas estas variables de las que acabamos de
‫hablar, lo cual es muy útil.
‫En segundo lugar, mantiene privadas las variables de nivel
‫superior que definimos en nuestros módulos.
‫Por lo tanto, está limitado solo al
‫módulo actual en lugar de filtrar todo al objeto global.
‫Así que imagina
‫por un segundo, que declaramos una variable x en uno de
‫nuestros módulos y luego incluimos un módulo npm que también
‫usa una variable llamada x.
‫Sin este mecanismo,
‫nuestra propia variable se anularía y
‫toda la aplicación simplemente no funcionaría.
‫Entonces, cada módulo que tiene su ámbito privado
‫es absolutamente crucial y se logra a través
‫de este ingenioso truco de envolver nuestro código en
‫esta función especial.
‫Ahora echemos un vistazo rápido a cada objeto
‫que obtiene nuestro módulo.
‫Primero la función require,
‫que ya conocemos.
‫Luego, hay un objeto de módulo,
‫que es solo una referencia al módulo actual
‫y que para nosotros es
‫más importante a la hora de exportar datos.
‫Lo mismo se aplica al objeto de
‫exportación que discutiremos en un momento.
‫Finalmente, están las variables convenientes
‫nombre de archivo y nombre de directorio
‫que simplemente contienen la ruta absoluta
‫al archivo del
‫módulo actual, así como el nombre de directorio actual.
‫Y así es como funciona el paso de ajuste de la carga de un módulo.
‫A continuación, el código en el módulo, o
‫para ser más precisos,
‫en la función contenedora del módulo, en
‫realidad es ejecutado por el NODE. Tiempo de ejecución de JS.
‫Entonces, nada lujoso aquí.
‫Hasta este punto,
‫la función require se ha llamado con un nombre de
‫módulo como argumento, la ruta
‫al archivo del módulo se ha resuelto en el archivo cargado,
‫todo el código se ha envuelto en la función
‫contenedora que luego se ha ejecutado.
‫Ahora es el momento de que la
‫función require realmente devuelva algo.
‫Y lo que devuelve son las exportaciones del módulo requerido.
‫Estas exportaciones se almacenan en el módulo. exportsobjects.
‫Puede que se parezca un poco a esto.
‫Entonces, nuevamente, en cada módulo podemos exportar
‫variables, que al final serán devueltas por la función require.
‫Y lo hacemos asignando variables al módulo. exportaciones o simplemente a exportaciones
‫donde es solo
‫un puntero al módulo. exportar.
‫Haremos esto en la práctica
‫en el próximo video, porque sé que suena
‫un poco confuso cuando lo digo así.
‫De todos modos, esto es lo
‫que necesita saber sobre cuándo usar el módulo. exportar o simplemente exportar.
‫Entonces, si todo lo que desea hacer es exportar una sola
‫variable, como una clase o una
‫función, generalmente usa module. exporta y configúrelo igual
‫a la variable que desea exportar.
‫Como en este ejemplo.
‫Por
‫otro lado, si está buscando exportar múltiples variables
‫nombradas como múltiples funciones, por
‫ejemplo, entonces debe
‫crearlas como propiedades del objeto de exportación.
‫Por ejemplo, si estuviéramos haciendo un módulo de calculadora, podría
‫crear exportaciones. agregar, exportaciones.
‫multiplicar las exportaciones. dividir y así sucesivamente.
‫¿Tiene sentido?
‫Nuevamente, haremos esto en el siguiente video
‫y para entonces tendrá más sentido.
‫Así es como exportamos e importamos datos
‫de un módulo al otro.
‫Por supuesto, esta es también la razón por
‫la que solemos asignar el resultado de una función require llamada a una nueva variable.
‫Para que podamos guardar las exportaciones devueltas.
‫Ahora, para terminar este video muy rápido,
‫el último paso es que los módulos se almacenan en
‫caché después de la primera vez que se cargan.
‫Lo que esto significa es que si necesita
‫el mismo módulo varias veces, siempre obtendrá el mismo resultado.
‫Y el código de los módulos en realidad solo se ejecuta en
‫la primera llamada.
‫En llamadas posteriores,
‫el resultado simplemente se recupera de la caché.
‫Perfecto.
‫Así que espero que toda la
‫lógica detrás de cómo
‫trabajar con módulos ya no parezca mágica.
‫Es muy importante saber cómo funciona todo esto
‫para convertirnos en un gran
‫NODO, y sobre todo,
‫más independiente. Desarrollador JS.