How does require() in node.js work?
Solution 1:
Source code is here. exports
/require
are not keywords, but global variables. Your main script is wrapped before start in a function which has all the globals like require
, process
etc in its context.
Note that while module.js itself is using require()
, that's a different require function, and it is defined in the file called "node.js"
Side effect of above: it's perfectly fine to have "return" statement in the middle of your module (not belonging to any function), effectively "commenting out" rest of the code
Solution 2:
var mod = require('./mod.js');
The require is a function that takes one argument called path, in this case the path is ./mod.js
when the require is invoked, a sequences of tasks are happened:
call
Module.prototype.require
function declared in lib/module.js which assert that the path exists and was a stringcall
Module._load
which is a function in lib/module.js that resolve the file throughModule._resolveFilename(request, parent, isMain)
,- the
Module._resolveFilename
function is called and checks if the module is native (The native modules are returned byNativeModule
function defined in lib/internal/bootstrap_node.js), if yes it will return the module else it checks the number of characters of the parh (Must 2 character at least) and some characters (the path must started by./
) viaModule._resolveLookupPaths
function defined in defined in lib/internal/bootstrap_node.js - check the directory that contains the file
- If the path contains an extension (in our example yes: mod.js), the basename function defined in lib/path.js checks that the extension is "js"
- then it will create a new module for the file given in argument
var module = new Module(filename, parent);
- the content will be compiled via v8 through the function
NativeModule.prototype.compile
defined in lib/internal/bootstrap_node.js - the
NativeModule.wrap
defined in lib/internal/bootstrap_node.js takes the javascript content compiled ofmod.js
and wraps it : It wraps it in some other code that makes all this work. So the code you've written inmod.js
is wrapped in a function expression. that means everything you write in node is run in V8 - a module.exports is what's returned