Node.js is a Javascript running environment based on event-driven, non-blocking I/O. It allows us to organize and manage code more conveniently through an integrated modular system. In Node.js, modularization is an important concept. Each file is treated as an independent module, and these modules can be loaded through the require function.
In Node.js, the module loading process is mainly divided into three steps: path analysis, file location and compilation execution. Below we will introduce the process and working principle of these three steps in detail.
Path analysis
In Node.js, the module's distinguishable path has three forms:
When we call the require function and pass in a path parameter, Node.js will perform path analysis according to the following rules:
If the module path is passed in, follow the following steps:
a. Use the module path as the key value and check whether the module has been loaded in the module cache object. Module, if it has been loaded, directly returns the exports object of the module.
b. If the module has not been loaded in the module cache, follow the following steps to find it:
i. If the module name contains /, the module path is considered to be an absolute path. Load directly.
ii. If the module name starts with a relative path such as ./ or ../, the path will be converted into an absolute path and then loaded.
iii. If the module name does not start with . or /, follow the following steps to find:
1. 从当前文件所在目录开始,往上逐级查找node_modules目录中是否包含有该模块名的文件夹,如果找到了,则加载该文件夹中的index.js文件。 2. 如果在当前文件所在目录下没有找到该模块名的文件夹,则从当前目录的父目录开始,往上逐级查找node_modules目录中是否包含有该模块名的文件夹,直到到达系统根目录或者找到该模块名的文件夹为止。 3. 如果在所有目录中都没有找到该模块名的文件夹,则抛出模块加载失败的异常。
In this way, through path analysis, we can find the module that needs to be loaded. The file path where it is located.
File location
After confirming the path of the module, Node.js will next try to locate the module, that is, find the file corresponding to the module.
For Javascript files, Node.js will complete the suffix name to .js by default. If there is no suffix in the file name, Node.js will try to add the .js, .json and .node suffixes in sequence before searching.
When trying to find a file, if a directory with the same name as the path parsed is found, Node.js will treat the directory as a package.
For packages, Node.js will look for the package.json file in this directory to obtain the entry file path of the package. If the package.json file is found, Node.js will use the module path specified in the main field as the entry file. If the main field is not specified, index.js will be used as the entry file by default.
If the package.json file is not found in the package directory, or the main field is not specified in the package.json file, Node.js will use index.js in the package directory as the entry file by default.
Compile and execute
After locating the file, Node.js will compile and execute the file.
For Javascript files, Node.js will use the V8 engine for compilation and execution. During the compilation and execution process, Node.js will encapsulate the variables and methods in the file in a closure to avoid contamination and conflicts of variables and methods. At the same time, Node.js will also include all the code in the file in a try...catch block to catch and throw the exception.
During the compilation and execution process, Node.js will also decide whether to recursively load other modules that the module depends on based on whether the file contains a require function call. If the file contains a require function call, Node.js will load other modules that the module depends on according to the method described previously, and pass the exports objects of these dependent modules as parameters into the function corresponding to the file for the purpose. file usage.
Summary
In Node.js, loading modules through the require function is an important operation. During the module loading process, Node.js will go through multiple steps such as path analysis, file location, and compilation and execution to load and execute the module. Mastering the module loading process of Node.js can better understand the modular programming ideas of Node.js, thereby improving development efficiency and code quality.
The above is the detailed content of nodejs package loading process. For more information, please follow other related articles on the PHP Chinese website!