Trato de entender cómo funciona el arranque de nodeJS, pero estoy apilado con la función require
internal/bootstrap/node.js (Vea la imagen a continuación)src/node.cc como native_module_requireinternal/bootstrap/loaders.js (que se ejecutó antes del paso 1)internal/bootstrap/loaders.js usa internalBinding , que usa getInternalBindinggetInternalBinding crear desde...src/node_binding.cc , parece un poco complicado, pero mi caso ( "native_module" del paso 4) es findModule(modlist_internal...modlist_internal guardado en node_module_registernapi_module_registerNAPI_MODULENAPI_MODULE (excepto para prueba y banco)Uso la versión 16.14.0 LTS de nodeJS de GitHub
¿Qué estoy tratando de hacer? Nada especial, solo curiosidad, también estudio el código fuente del proyecto anterior, que puede ejecutar el nodo dentro del navegador https://github.com/olydis/node-in-browser , pero usa la versión anterior de nodeJS (con diferentes require ), y el proyecto no se actualiza hace algunos años. Además, me pregunto cómo stackblitz.com lanza una versión moderna de nodeJS dentro del navegador.
PD: también hay una carpeta lib\internal\modules\ que de alguna manera está relacionada con require e import , pero no creo que se use en el proceso de arranque, tal vez un poco más tarde.
PPS, solo conozco javaScript, por lo que puedo perderme algo importante en el código fuente de C ++
En la sección .data del ejecutable del nodo hay cadenas C++ que contienen fuentes js nativas. En la sección .text del ejecutable del nodo hay fragmentos de código ejecutable compilados a partir de esas cadenas. V8 mantiene los enlaces entre las fuentes js nativas y los fragmentos de código ejecutable a través de asignaciones dentro del objeto global del aislado de la instancia V8, y el nodo configura el aislado V8 con las asignaciones/enlaces correctos durante la inicialización. Require es una de las fuentes js nativas.
El código js adicional se convierte en código ejecutable y datos por nodo a través de V8. Su programa, que requieren las llamadas, es un código js de este tipo. Dado que require es un módulo js nativo, existe un enlace al código ejecutable, por lo que V8 sabe qué dirección usar al compilar la llamada. La implementación de require tiene lógica para averiguar si su argumento es un módulo nativo o no, ya que hay una lógica diferente para importar módulos nativos y no nativos.
Entonces, una llamada a require funciona al compilarse en una llamada a una función precompilada que es parte del ejecutable del nodo que V8 conoce gracias a la configuración del nodo de V8.