The question
Whitin the scope of a node.js module there is a module
object meant to be a reference to the current module, a require
function meant to require modules and a require.resolve
function meant to look up the location of a module but rather than load the module just return the resolved filename.
If there is a module.require
as there is a require
, why there isn't a module.require.resolve
as there is a require.resolve
?
Or potentially the same thing: Why module.require !== require
?
console.log('is require.main the same as module?');
console.log( require.main === module );
console.log('does module have a require property being a function?');
console.log( 'function' === typeof module.require );
console.log('is module.require the same as require.main.require?')
console.log( module.require === require.main.require );
console.log('is module.require the same as require?')
console.log( module.require === require );
console.log('why not?')
Notes
- On the code example, assume a file called
something.js
executed throughnode something.js
. - Please do not answer because the current implementation is that, the question is if there is really a reason to justify the current design/implementation/behaviour.
- For those wondering about a use case, I want to resolve an identifier as if
require.resolve
was called from the main module, so I expectedrequire.main.require.resolve
not beingundefined
.
Related on SO
What is the purpose of module.require?
Related documentation
The node.js documentation about globals states here:
require()
To require modules. See the Modules section.
require
isn't actually a global but rather local to each module.
require.resolve()
Use the internal
require()
machinery to look up the location of a module, but rather than loading the module, just return the resolved filename.
and here:
module
A reference to the current module. In particularmodule.exports
is used for defining what a module exports and makes available throughrequire()
.
module
isn't actually a global but rather local to each module.
It also states about modules here that:
module.require(id)
The module.require method provides a way to load a module as if
require()
was called from the original module.Note that in order to do this, you must get a reference to the module object. Since
require()
returns the module.exports, and the module is typically only available within a specific module's code, it must be explicitly exported in order to be used.