English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Primero, entienda el mecanismo de carga de require en nodejs
1Carga de archivos de require
Al cargar archivos con require, se puede omitir la extensión:
require('/module');
// En este momento, el archivo se ejecuta como archivo JS
require('/module.js');
// En este momento, el archivo se analiza como archivo JSON
require('/module.json');
// En este momento, el archivo C precompilado++ Ejecución del módulo
require('/module.node');
// Cargar el archivo especificado por main en el package.json del directorio module
require('/module/default.js');
// Cargar el archivo index.js del directorio module
A través de ./ o ../ Si comienza con: se buscará el módulo desde la carpeta del archivo actual, siguiendo la ruta relativa;
require('../file.js'); => Se busca el archivo file.js en el directorio superior
A través de / Si comienza con: se buscará el módulo desde el directorio raíz del sistema;
require('/Users/iceStone/Documents/file.js'); => Se busca de manera absoluta, sin ninguna objeción
Si la cadena de parámetros no comienza con “./“ O ”/“: significa que se está cargando un módulo proporcionado por defecto (ubicado en el directorio de instalación del sistema de Node):
require('fs'); => Se carga el módulo del sistema de archivos del módulo de núcleo
o desde el directorio actual hacia arriba, se buscarán archivos en la carpeta node_modules:
require('my_module'); => Se buscará el archivo my_module.js en las carpetas node_modules de todos los niveles;
Si require recibe una ruta de directorio, se verificará automáticamente el archivo package.json del directorio, luego se cargará el archivo especificado por el campo main como el archivo de entrada
Si el archivo package.json no tiene el campo main o no hay archivo package.json, se buscará el archivo index.js en el directorio como módulo por defecto:
require('/calcuator'); => Busca el archivo index.js en el directorio calculator del directorio actual
2Caché de require
La primera vez que se carga un módulo, Node lo almacena en caché. En el futuro, se cargará directamente el módulo desde la caché obteniendo la propiedad module.exports del módulo (no se ejecutará el módulo nuevamente)
si se necesita ejecutar el código del módulo varias veces, generalmente se puede hacer que el módulo exprese comportamientos (funciones), la caché del módulo se puede obtener a través de require.cache, y también se puede eliminar
3todo el código se ejecuta en el ámbito del módulo, no contaminará el ámbito global.
II. Simulación de la función require
el mecanismo de carga interno de require es bastante complejo, vamos a realizar una simulación simple de carga
el mecanismo de implementación simple de require es:
encontrar el archivo de módulo correspondiente al id del módulo mediante las reglas de carga
leer el código dentro de este archivo
conectar de manera que se construya un espacio privado para este segmento de código
ejecutar este código
obtener el valor de module.exports y devolverlo
nodejs_require.js // [simulación de función require] "use strict" function $require(id) { //1primero verificar si el módulo existe, si no existe, lanzar Can't found file //2si existe, leer el código const fs = require('fs'); const path = require('path'); // nombre del archivo let filename = id; //verificar si es una ruta absoluta if (!path.isAbsolute(filename)) { filename = path.join(__dirname, id); } // directorio del archivo let dirname = path.dirname(filename); //simular el mecanismo de caché de require $require.cache = $require.cache || {}; if($require.cache[filename]){ return $require.cache[filename].exports; } // leer el código del módulo let code=""; try { code = fs.readFileSync(filename,'utf-8'); // bloquear la lectura del archivo, no se colocará en la cola de eventos } catch (error) { console.log(" [*]; no se puede encontrar el archivo! "); throw error; } // console.log(code); // 3ejecutar código, el código que se debe ejecutar, se necesita crear un espacio independiente // definir un contenedor de datos, usar el contenedor para almacenar los miembros exportados por el módulo let _module = { // Cada módulo JS tendrá una variable global de module. id:'.', exports:{}, parent:module, filename:filename }; let _exports = _module.exports; // Crear un espacio independiente code = `(function($require,module,_exports,__dirname,__filename){ $[code] })($require,_module,_exports,dirname,filename)`; // Ejecutar código eval(code); // Caché $require.cache[filename] = _module; // Resultado devuelto return _module.exports; } setInterval(()=>{ const rr = $require("./test.js"); console.log(rr); },1000);
Los dos módulos utilizados para la prueba del módulo superior
//test.js const date = $require('./date.js'); console.log(module); module.exports = date; //date.js module.exports = new Date();
Resumen
Este es el contenido completo del artículo, espero que el contenido de este artículo pueda proporcionar cierta ayuda a su aprendizaje o trabajo, si tienen alguna pregunta, pueden dejar comentarios para intercambiar.
Declaración: el contenido de este artículo se ha obtenido de la red, pertenece al autor original, el contenido ha sido contribuido y cargado por los usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado manualmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)