• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <meta charset="utf-8">
5  <meta name="viewport" content="width=device-width">
6  <meta name="nodejs.org:node-version" content="v14.21.2">
7  <title>Modules: CommonJS modules | Node.js v14.21.2 Documentation</title>
8  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic&display=fallback">
9  <link rel="stylesheet" href="assets/style.css">
10  <link rel="stylesheet" href="assets/hljs.css">
11  <link rel="canonical" href="https://nodejs.org/api/modules.html">
12</head>
13<body class="alt apidoc" id="api-section-modules">
14  <div id="content" class="clearfix">
15    <div id="column2" class="interior">
16      <div id="intro" class="interior">
17        <a href="/" title="Go back to the home page">
18          Node.js
19        </a>
20      </div>
21      <ul>
22<li><a href="documentation.html" class="nav-documentation">About this documentation</a></li>
23<li><a href="synopsis.html" class="nav-synopsis">Usage and example</a></li>
24</ul>
25<hr class="line">
26<ul>
27<li><a href="assert.html" class="nav-assert">Assertion testing</a></li>
28<li><a href="async_hooks.html" class="nav-async_hooks">Async hooks</a></li>
29<li><a href="buffer.html" class="nav-buffer">Buffer</a></li>
30<li><a href="addons.html" class="nav-addons">C++ addons</a></li>
31<li><a href="n-api.html" class="nav-n-api">C/C++ addons with Node-API</a></li>
32<li><a href="embedding.html" class="nav-embedding">C++ embedder API</a></li>
33<li><a href="child_process.html" class="nav-child_process">Child processes</a></li>
34<li><a href="cluster.html" class="nav-cluster">Cluster</a></li>
35<li><a href="cli.html" class="nav-cli">Command-line options</a></li>
36<li><a href="console.html" class="nav-console">Console</a></li>
37<li><a href="corepack.html" class="nav-corepack">Corepack</a></li>
38<li><a href="crypto.html" class="nav-crypto">Crypto</a></li>
39<li><a href="debugger.html" class="nav-debugger">Debugger</a></li>
40<li><a href="deprecations.html" class="nav-deprecations">Deprecated APIs</a></li>
41<li><a href="diagnostics_channel.html" class="nav-diagnostics_channel">Diagnostics Channel</a></li>
42<li><a href="dns.html" class="nav-dns">DNS</a></li>
43<li><a href="domain.html" class="nav-domain">Domain</a></li>
44<li><a href="errors.html" class="nav-errors">Errors</a></li>
45<li><a href="events.html" class="nav-events">Events</a></li>
46<li><a href="fs.html" class="nav-fs">File system</a></li>
47<li><a href="globals.html" class="nav-globals">Globals</a></li>
48<li><a href="http.html" class="nav-http">HTTP</a></li>
49<li><a href="http2.html" class="nav-http2">HTTP/2</a></li>
50<li><a href="https.html" class="nav-https">HTTPS</a></li>
51<li><a href="inspector.html" class="nav-inspector">Inspector</a></li>
52<li><a href="intl.html" class="nav-intl">Internationalization</a></li>
53<li><a href="modules.html" class="nav-modules active">Modules: CommonJS modules</a></li>
54<li><a href="esm.html" class="nav-esm">Modules: ECMAScript modules</a></li>
55<li><a href="module.html" class="nav-module">Modules: <code>module</code> API</a></li>
56<li><a href="packages.html" class="nav-packages">Modules: Packages</a></li>
57<li><a href="net.html" class="nav-net">Net</a></li>
58<li><a href="os.html" class="nav-os">OS</a></li>
59<li><a href="path.html" class="nav-path">Path</a></li>
60<li><a href="perf_hooks.html" class="nav-perf_hooks">Performance hooks</a></li>
61<li><a href="policy.html" class="nav-policy">Policies</a></li>
62<li><a href="process.html" class="nav-process">Process</a></li>
63<li><a href="punycode.html" class="nav-punycode">Punycode</a></li>
64<li><a href="querystring.html" class="nav-querystring">Query strings</a></li>
65<li><a href="readline.html" class="nav-readline">Readline</a></li>
66<li><a href="repl.html" class="nav-repl">REPL</a></li>
67<li><a href="report.html" class="nav-report">Report</a></li>
68<li><a href="stream.html" class="nav-stream">Stream</a></li>
69<li><a href="string_decoder.html" class="nav-string_decoder">String decoder</a></li>
70<li><a href="timers.html" class="nav-timers">Timers</a></li>
71<li><a href="tls.html" class="nav-tls">TLS/SSL</a></li>
72<li><a href="tracing.html" class="nav-tracing">Trace events</a></li>
73<li><a href="tty.html" class="nav-tty">TTY</a></li>
74<li><a href="dgram.html" class="nav-dgram">UDP/datagram</a></li>
75<li><a href="url.html" class="nav-url">URL</a></li>
76<li><a href="util.html" class="nav-util">Utilities</a></li>
77<li><a href="v8.html" class="nav-v8">V8</a></li>
78<li><a href="vm.html" class="nav-vm">VM</a></li>
79<li><a href="wasi.html" class="nav-wasi">WASI</a></li>
80<li><a href="worker_threads.html" class="nav-worker_threads">Worker threads</a></li>
81<li><a href="zlib.html" class="nav-zlib">Zlib</a></li>
82</ul>
83<hr class="line">
84<ul>
85<li><a href="https://github.com/nodejs/node" class="nav-https-github-com-nodejs-node">Code repository and issue tracker</a></li>
86</ul>
87    </div>
88
89    <div id="column1" data-id="modules" class="interior">
90      <header>
91        <div class="header-container">
92          <h1>Node.js v14.21.2 documentation</h1>
93          <button class="theme-toggle-btn" id="theme-toggle-btn" title="Toggle dark mode/light mode" aria-label="Toggle dark mode/light mode" hidden>
94            <svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" height="24" width="24">
95              <path fill="none" d="M0 0h24v24H0z" />
96              <path d="M11.1 12.08c-2.33-4.51-.5-8.48.53-10.07C6.27 2.2 1.98 6.59 1.98 12c0 .14.02.28.02.42.62-.27 1.29-.42 2-.42 1.66 0 3.18.83 4.1 2.15A4.01 4.01 0 0111 18c0 1.52-.87 2.83-2.12 3.51.98.32 2.03.5 3.11.5 3.5 0 6.58-1.8 8.37-4.52-2.36.23-6.98-.97-9.26-5.41z"/>
97              <path d="M7 16h-.18C6.4 14.84 5.3 14 4 14c-1.66 0-3 1.34-3 3s1.34 3 3 3h3c1.1 0 2-.9 2-2s-.9-2-2-2z"/>
98            </svg>
99            <svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" height="24" width="24">
100              <path d="M0 0h24v24H0z" fill="none" />
101              <path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/>
102            </svg>
103          </button>
104        </div>
105        <div id="gtoc">
106          <ul>
107            <li>
108              <a href="index.html">Index</a>
109            </li>
110            <li>
111              <a href="all.html">View on single page</a>
112            </li>
113            <li>
114              <a href="modules.json">View as JSON</a>
115            </li>
116
117    <li class="version-picker">
118      <a href="#">View another version <span>&#x25bc;</span></a>
119      <ol class="version-picker"><li><a href="https://nodejs.org/docs/latest-v19.x/api/modules.html">19.x</a></li>
120<li><a href="https://nodejs.org/docs/latest-v18.x/api/modules.html">18.x <b>LTS</b></a></li>
121<li><a href="https://nodejs.org/docs/latest-v17.x/api/modules.html">17.x</a></li>
122<li><a href="https://nodejs.org/docs/latest-v16.x/api/modules.html">16.x <b>LTS</b></a></li>
123<li><a href="https://nodejs.org/docs/latest-v15.x/api/modules.html">15.x</a></li>
124<li><a href="https://nodejs.org/docs/latest-v14.x/api/modules.html">14.x <b>LTS</b></a></li>
125<li><a href="https://nodejs.org/docs/latest-v13.x/api/modules.html">13.x</a></li>
126<li><a href="https://nodejs.org/docs/latest-v12.x/api/modules.html">12.x</a></li>
127<li><a href="https://nodejs.org/docs/latest-v11.x/api/modules.html">11.x</a></li>
128<li><a href="https://nodejs.org/docs/latest-v10.x/api/modules.html">10.x</a></li>
129<li><a href="https://nodejs.org/docs/latest-v9.x/api/modules.html">9.x</a></li>
130<li><a href="https://nodejs.org/docs/latest-v8.x/api/modules.html">8.x</a></li>
131<li><a href="https://nodejs.org/docs/latest-v7.x/api/modules.html">7.x</a></li>
132<li><a href="https://nodejs.org/docs/latest-v6.x/api/modules.html">6.x</a></li>
133<li><a href="https://nodejs.org/docs/latest-v5.x/api/modules.html">5.x</a></li>
134<li><a href="https://nodejs.org/docs/latest-v4.x/api/modules.html">4.x</a></li>
135<li><a href="https://nodejs.org/docs/latest-v0.12.x/api/modules.html">0.12.x</a></li>
136<li><a href="https://nodejs.org/docs/latest-v0.10.x/api/modules.html">0.10.x</a></li></ol>
137    </li>
138
139            <li class="edit_on_github"><a href="https://github.com/nodejs/node/edit/master/doc/api/modules.md">Edit on GitHub</a></li>
140          </ul>
141        </div>
142        <hr>
143      </header>
144
145      <details id="toc" open><summary>Table of contents</summary><ul>
146<li><span class="stability_2"><a href="#modules_modules_commonjs_modules">Modules: CommonJS modules</a></span>
147<ul>
148<li><a href="#modules_accessing_the_main_module">Accessing the main module</a></li>
149<li><a href="#modules_package_manager_tips">Package manager tips</a></li>
150<li><a href="#modules_the_mjs_extension">The <code>.mjs</code> extension</a></li>
151<li><a href="#modules_all_together">All together...</a></li>
152<li><a href="#modules_caching">Caching</a>
153<ul>
154<li><a href="#modules_module_caching_caveats">Module caching caveats</a></li>
155</ul>
156</li>
157<li><a href="#modules_core_modules">Core modules</a></li>
158<li><a href="#modules_cycles">Cycles</a></li>
159<li><a href="#modules_file_modules">File modules</a></li>
160<li><a href="#modules_folders_as_modules">Folders as modules</a></li>
161<li><a href="#modules_loading_from_node_modules_folders">Loading from <code>node_modules</code> folders</a></li>
162<li><a href="#modules_loading_from_the_global_folders">Loading from the global folders</a></li>
163<li><a href="#modules_the_module_wrapper">The module wrapper</a></li>
164<li><a href="#modules_the_module_scope">The module scope</a>
165<ul>
166<li><a href="#modules_dirname"><code>__dirname</code></a></li>
167<li><a href="#modules_filename"><code>__filename</code></a></li>
168<li><a href="#modules_exports"><code>exports</code></a></li>
169<li><a href="#modules_module"><code>module</code></a></li>
170<li><a href="#modules_require_id"><code>require(id)</code></a>
171<ul>
172<li><a href="#modules_require_cache"><code>require.cache</code></a></li>
173<li><span class="stability_0"><a href="#modules_require_extensions"><code>require.extensions</code></a></span></li>
174<li><a href="#modules_require_main"><code>require.main</code></a></li>
175<li><a href="#modules_require_resolve_request_options"><code>require.resolve(request[, options])</code></a>
176<ul>
177<li><a href="#modules_require_resolve_paths_request"><code>require.resolve.paths(request)</code></a></li>
178</ul>
179</li>
180</ul>
181</li>
182</ul>
183</li>
184<li><a href="#modules_the_module_object">The <code>module</code> object</a>
185<ul>
186<li><a href="#modules_module_children"><code>module.children</code></a></li>
187<li><a href="#modules_module_exports"><code>module.exports</code></a>
188<ul>
189<li><a href="#modules_exports_shortcut"><code>exports</code> shortcut</a></li>
190</ul>
191</li>
192<li><a href="#modules_module_filename"><code>module.filename</code></a></li>
193<li><a href="#modules_module_id"><code>module.id</code></a></li>
194<li><a href="#modules_module_ispreloading"><code>module.isPreloading</code></a></li>
195<li><a href="#modules_module_loaded"><code>module.loaded</code></a></li>
196<li><span class="stability_0"><a href="#modules_module_parent"><code>module.parent</code></a></span></li>
197<li><a href="#modules_module_path"><code>module.path</code></a></li>
198<li><a href="#modules_module_paths"><code>module.paths</code></a></li>
199<li><a href="#modules_module_require_id"><code>module.require(id)</code></a></li>
200</ul>
201</li>
202<li><a href="#modules_the_module_object_1">The <code>Module</code> object</a></li>
203<li><a href="#modules_source_map_v3_support">Source map v3 support</a></li>
204</ul>
205</li>
206</ul></details>
207
208      <div id="apicontent">
209        <h2>Modules: CommonJS modules<span><a class="mark" href="#modules_modules_commonjs_modules" id="modules_modules_commonjs_modules">#</a></span></h2>
210
211<p></p><div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p></p>
212
213<p>In the Node.js module system, each file is treated as a separate module. For
214example, consider a file named <code>foo.js</code>:</p>
215<pre><code class="language-js"><span class="hljs-keyword">const</span> circle = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./circle.js'</span>);
216<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`The area of a circle of radius 4 is <span class="hljs-subst">${circle.area(<span class="hljs-number">4</span>)}</span>`</span>);</code></pre>
217<p>On the first line, <code>foo.js</code> loads the module <code>circle.js</code> that is in the same
218directory as <code>foo.js</code>.</p>
219<p>Here are the contents of <code>circle.js</code>:</p>
220<pre><code class="language-js"><span class="hljs-keyword">const</span> { <span class="hljs-variable constant_">PI</span> } = <span class="hljs-title class_">Math</span>;
221
222<span class="hljs-built_in">exports</span>.<span class="hljs-property">area</span> = <span class="hljs-function">(<span class="hljs-params">r</span>) =></span> <span class="hljs-variable constant_">PI</span> * r ** <span class="hljs-number">2</span>;
223
224<span class="hljs-built_in">exports</span>.<span class="hljs-property">circumference</span> = <span class="hljs-function">(<span class="hljs-params">r</span>) =></span> <span class="hljs-number">2</span> * <span class="hljs-variable constant_">PI</span> * r;</code></pre>
225<p>The module <code>circle.js</code> has exported the functions <code>area()</code> and
226<code>circumference()</code>. Functions and objects are added to the root of a module
227by specifying additional properties on the special <code>exports</code> object.</p>
228<p>Variables local to the module will be private, because the module is wrapped
229in a function by Node.js (see <a href="#modules_the_module_wrapper">module wrapper</a>).
230In this example, the variable <code>PI</code> is private to <code>circle.js</code>.</p>
231<p>The <code>module.exports</code> property can be assigned a new value (such as a function
232or object).</p>
233<p>Below, <code>bar.js</code> makes use of the <code>square</code> module, which exports a Square class:</p>
234<pre><code class="language-js"><span class="hljs-keyword">const</span> <span class="hljs-title class_">Square</span> = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./square.js'</span>);
235<span class="hljs-keyword">const</span> mySquare = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Square</span>(<span class="hljs-number">2</span>);
236<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`The area of mySquare is <span class="hljs-subst">${mySquare.area()}</span>`</span>);</code></pre>
237<p>The <code>square</code> module is defined in <code>square.js</code>:</p>
238<pre><code class="language-js"><span class="hljs-comment">// Assigning to exports will not modify module, must use module.exports</span>
239<span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = <span class="hljs-keyword">class</span> <span class="hljs-title class_">Square</span> {
240  <span class="hljs-title function_">constructor</span>(<span class="hljs-params">width</span>) {
241    <span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span> = width;
242  }
243
244  <span class="hljs-title function_">area</span>(<span class="hljs-params"></span>) {
245    <span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span> ** <span class="hljs-number">2</span>;
246  }
247};</code></pre>
248<p>The module system is implemented in the <code>require('module')</code> module.</p>
249<section><h3>Accessing the main module<span><a class="mark" href="#modules_accessing_the_main_module" id="modules_accessing_the_main_module">#</a></span></h3>
250
251<p>When a file is run directly from Node.js, <code>require.main</code> is set to its
252<code>module</code>. That means that it is possible to determine whether a file has been
253run directly by testing <code>require.main === module</code>.</p>
254<p>For a file <code>foo.js</code>, this will be <code>true</code> if run via <code>node foo.js</code>, but
255<code>false</code> if run by <code>require('./foo')</code>.</p>
256<p>Because <code>module</code> provides a <code>filename</code> property (normally equivalent to
257<code>__filename</code>), the entry point of the current application can be obtained
258by checking <code>require.main.filename</code>.</p>
259</section><section><h3>Package manager tips<span><a class="mark" href="#modules_package_manager_tips" id="modules_package_manager_tips">#</a></span></h3>
260
261<p>The semantics of the Node.js <code>require()</code> function were designed to be general
262enough to support reasonable directory structures. Package manager programs
263such as <code>dpkg</code>, <code>rpm</code>, and <code>npm</code> will hopefully find it possible to build
264native packages from Node.js modules without modification.</p>
265<p>Below we give a suggested directory structure that could work:</p>
266<p>Let's say that we wanted to have the folder at
267<code>/usr/lib/node/&#x3C;some-package>/&#x3C;some-version></code> hold the contents of a
268specific version of a package.</p>
269<p>Packages can depend on one another. In order to install package <code>foo</code>, it
270may be necessary to install a specific version of package <code>bar</code>. The <code>bar</code>
271package may itself have dependencies, and in some cases, these may even collide
272or form cyclic dependencies.</p>
273<p>Because Node.js looks up the <code>realpath</code> of any modules it loads (that is, it
274resolves symlinks) and then <a href="#modules_loading_from_node_modules_folders">looks for their dependencies in <code>node_modules</code> folders</a>,
275this situation can be resolved with the following architecture:</p>
276<ul>
277<li><code>/usr/lib/node/foo/1.2.3/</code>: Contents of the <code>foo</code> package, version 1.2.3.</li>
278<li><code>/usr/lib/node/bar/4.3.2/</code>: Contents of the <code>bar</code> package that <code>foo</code> depends
279on.</li>
280<li><code>/usr/lib/node/foo/1.2.3/node_modules/bar</code>: Symbolic link to
281<code>/usr/lib/node/bar/4.3.2/</code>.</li>
282<li><code>/usr/lib/node/bar/4.3.2/node_modules/*</code>: Symbolic links to the packages that
283<code>bar</code> depends on.</li>
284</ul>
285<p>Thus, even if a cycle is encountered, or if there are dependency
286conflicts, every module will be able to get a version of its dependency
287that it can use.</p>
288<p>When the code in the <code>foo</code> package does <code>require('bar')</code>, it will get the
289version that is symlinked into <code>/usr/lib/node/foo/1.2.3/node_modules/bar</code>.
290Then, when the code in the <code>bar</code> package calls <code>require('quux')</code>, it'll get
291the version that is symlinked into
292<code>/usr/lib/node/bar/4.3.2/node_modules/quux</code>.</p>
293<p>Furthermore, to make the module lookup process even more optimal, rather
294than putting packages directly in <code>/usr/lib/node</code>, we could put them in
295<code>/usr/lib/node_modules/&#x3C;name>/&#x3C;version></code>. Then Node.js will not bother
296looking for missing dependencies in <code>/usr/node_modules</code> or <code>/node_modules</code>.</p>
297<p>In order to make modules available to the Node.js REPL, it might be useful to
298also add the <code>/usr/lib/node_modules</code> folder to the <code>$NODE_PATH</code> environment
299variable. Since the module lookups using <code>node_modules</code> folders are all
300relative, and based on the real path of the files making the calls to
301<code>require()</code>, the packages themselves can be anywhere.</p>
302</section><section><h3>The <code>.mjs</code> extension<span><a class="mark" href="#modules_the_mjs_extension" id="modules_the_mjs_extension">#</a></span></h3>
303<p>It is not possible to <code>require()</code> files that have the <code>.mjs</code> extension.
304Attempting to do so will throw <a href="errors.html#errors_err_require_esm">an error</a>. The <code>.mjs</code> extension is
305reserved for <a href="esm.html">ECMAScript Modules</a> which cannot be loaded via <code>require()</code>.
306See <a href="esm.html">ECMAScript Modules</a> for more details.</p>
307</section><section><h3>All together...<span><a class="mark" href="#modules_all_together" id="modules_all_together">#</a></span></h3>
308
309<p>To get the exact filename that will be loaded when <code>require()</code> is called, use
310the <code>require.resolve()</code> function.</p>
311<p>Putting together all of the above, here is the high-level algorithm
312in pseudocode of what <code>require()</code> does:</p>
313<pre>require(X) from module at path Y
3141. If X is a core module,
315   a. return the core module
316   b. STOP
3172. If X begins with '/'
318   a. set Y to be the filesystem root
3193. If X begins with './' or '/' or '../'
320   a. LOAD_AS_FILE(Y + X)
321   b. LOAD_AS_DIRECTORY(Y + X)
322   c. THROW "not found"
3234. If X begins with '#'
324   a. LOAD_PACKAGE_IMPORTS(X, dirname(Y))
3255. LOAD_PACKAGE_SELF(X, dirname(Y))
3266. LOAD_NODE_MODULES(X, dirname(Y))
3277. THROW "not found"
328
329LOAD_AS_FILE(X)
3301. If X is a file, load X as its file extension format. STOP
3312. If X.js is a file, load X.js as JavaScript text. STOP
3323. If X.json is a file, parse X.json to a JavaScript Object. STOP
3334. If X.node is a file, load X.node as binary addon. STOP
334
335LOAD_INDEX(X)
3361. If X/index.js is a file, load X/index.js as JavaScript text. STOP
3372. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
3383. If X/index.node is a file, load X/index.node as binary addon. STOP
339
340LOAD_AS_DIRECTORY(X)
3411. If X/package.json is a file,
342   a. Parse X/package.json, and look for "main" field.
343   b. If "main" is a falsy value, GOTO 2.
344   c. let M = X + (json main field)
345   d. LOAD_AS_FILE(M)
346   e. LOAD_INDEX(M)
347   f. LOAD_INDEX(X) DEPRECATED
348   g. THROW "not found"
3492. LOAD_INDEX(X)
350
351LOAD_NODE_MODULES(X, START)
3521. let DIRS = NODE_MODULES_PATHS(START)
3532. for each DIR in DIRS:
354   a. LOAD_PACKAGE_EXPORTS(X, DIR)
355   b. LOAD_AS_FILE(DIR/X)
356   c. LOAD_AS_DIRECTORY(DIR/X)
357
358NODE_MODULES_PATHS(START)
3591. let PARTS = path split(START)
3602. let I = count of PARTS - 1
3613. let DIRS = [GLOBAL_FOLDERS]
3624. while I >= 0,
363   a. if PARTS[I] = "node_modules" CONTINUE
364   b. DIR = path join(PARTS[0 .. I] + "node_modules")
365   c. DIRS = DIRS + DIR
366   d. let I = I - 1
3675. return DIRS
368
369LOAD_PACKAGE_IMPORTS(X, DIR)
3701. Find the closest package scope SCOPE to DIR.
3712. If no scope was found, return.
3723. If the SCOPE/package.json "imports" is null or undefined, return.
3734. let MATCH = PACKAGE_IMPORTS_RESOLVE(X, pathToFileURL(SCOPE),
374  ["node", "require"]) <a href="esm.md#resolver-algorithm-specification">defined in the ESM resolver</a>.
3755. RESOLVE_ESM_MATCH(MATCH).
376
377LOAD_PACKAGE_EXPORTS(X, DIR)
3781. Try to interpret X as a combination of NAME and SUBPATH where the name
379   may have a @scope/ prefix and the subpath begins with a slash (`/`).
3802. If X does not match this pattern or DIR/NAME/package.json is not a file,
381   return.
3823. Parse DIR/NAME/package.json, and look for "exports" field.
3834. If "exports" is null or undefined, return.
3845. let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(DIR/NAME), "." + SUBPATH,
385   `package.json` "exports", ["node", "require"]) <a href="esm.md#resolver-algorithm-specification">defined in the ESM resolver</a>.
3866. RESOLVE_ESM_MATCH(MATCH)
387
388LOAD_PACKAGE_SELF(X, DIR)
3891. Find the closest package scope SCOPE to DIR.
3902. If no scope was found, return.
3913. If the SCOPE/package.json "exports" is null or undefined, return.
3924. If the SCOPE/package.json "name" is not the first segment of X, return.
3935. let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(SCOPE),
394   "." + X.slice("name".length), `package.json` "exports", ["node", "require"])
395   <a href="esm.md#resolver-algorithm-specification">defined in the ESM resolver</a>.
3966. RESOLVE_ESM_MATCH(MATCH)
397
398RESOLVE_ESM_MATCH(MATCH)
3991. let { RESOLVED, EXACT } = MATCH
4002. let RESOLVED_PATH = fileURLToPath(RESOLVED)
4013. If EXACT is true,
402   a. If the file at RESOLVED_PATH exists, load RESOLVED_PATH as its extension
403      format. STOP
4044. Otherwise, if EXACT is false,
405   a. LOAD_AS_FILE(RESOLVED_PATH)
406   b. LOAD_AS_DIRECTORY(RESOLVED_PATH)
4075. THROW "not found"
408</pre>
409</section><section><h3>Caching<span><a class="mark" href="#modules_caching" id="modules_caching">#</a></span></h3>
410
411<p>Modules are cached after the first time they are loaded. This means (among other
412things) that every call to <code>require('foo')</code> will get exactly the same object
413returned, if it would resolve to the same file.</p>
414<p>Provided <code>require.cache</code> is not modified, multiple calls to <code>require('foo')</code>
415will not cause the module code to be executed multiple times. This is an
416important feature. With it, "partially done" objects can be returned, thus
417allowing transitive dependencies to be loaded even when they would cause cycles.</p>
418<p>To have a module execute code multiple times, export a function, and call that
419function.</p>
420<h4>Module caching caveats<span><a class="mark" href="#modules_module_caching_caveats" id="modules_module_caching_caveats">#</a></span></h4>
421
422<p>Modules are cached based on their resolved filename. Since modules may resolve
423to a different filename based on the location of the calling module (loading
424from <code>node_modules</code> folders), it is not a <em>guarantee</em> that <code>require('foo')</code> will
425always return the exact same object, if it would resolve to different files.</p>
426<p>Additionally, on case-insensitive file systems or operating systems, different
427resolved filenames can point to the same file, but the cache will still treat
428them as different modules and will reload the file multiple times. For example,
429<code>require('./foo')</code> and <code>require('./FOO')</code> return two different objects,
430irrespective of whether or not <code>./foo</code> and <code>./FOO</code> are the same file.</p>
431</section><section><h3>Core modules<span><a class="mark" href="#modules_core_modules" id="modules_core_modules">#</a></span></h3>
432
433<div class="api_metadata">
434<details class="changelog"><summary>History</summary>
435<table>
436<tbody><tr><th>Version</th><th>Changes</th></tr>
437<tr><td>v14.18.0</td>
438<td><p>Added <code>node:</code> import support to <code>require(...)</code>.</p></td></tr>
439</tbody></table>
440</details>
441</div>
442<p>Node.js has several modules compiled into the binary. These modules are
443described in greater detail elsewhere in this documentation.</p>
444<p>The core modules are defined within the Node.js source and are located in the
445<code>lib/</code> folder.</p>
446<p>Core modules are always preferentially loaded if their identifier is
447passed to <code>require()</code>. For instance, <code>require('http')</code> will always
448return the built in HTTP module, even if there is a file by that name.</p>
449<p>Core modules can also be identified using the <code>node:</code> prefix, in which case
450it bypasses the <code>require</code> cache. For instance, <code>require('node:http')</code> will
451always return the built in HTTP module, even if there is <code>require.cache</code> entry
452by that name.</p>
453</section><section><h3>Cycles<span><a class="mark" href="#modules_cycles" id="modules_cycles">#</a></span></h3>
454
455<p>When there are circular <code>require()</code> calls, a module might not have finished
456executing when it is returned.</p>
457<p>Consider this situation:</p>
458<p><code>a.js</code>:</p>
459<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'a starting'</span>);
460<span class="hljs-built_in">exports</span>.<span class="hljs-property">done</span> = <span class="hljs-literal">false</span>;
461<span class="hljs-keyword">const</span> b = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./b.js'</span>);
462<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'in a, b.done = %j'</span>, b.<span class="hljs-property">done</span>);
463<span class="hljs-built_in">exports</span>.<span class="hljs-property">done</span> = <span class="hljs-literal">true</span>;
464<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'a done'</span>);</code></pre>
465<p><code>b.js</code>:</p>
466<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'b starting'</span>);
467<span class="hljs-built_in">exports</span>.<span class="hljs-property">done</span> = <span class="hljs-literal">false</span>;
468<span class="hljs-keyword">const</span> a = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./a.js'</span>);
469<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'in b, a.done = %j'</span>, a.<span class="hljs-property">done</span>);
470<span class="hljs-built_in">exports</span>.<span class="hljs-property">done</span> = <span class="hljs-literal">true</span>;
471<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'b done'</span>);</code></pre>
472<p><code>main.js</code>:</p>
473<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'main starting'</span>);
474<span class="hljs-keyword">const</span> a = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./a.js'</span>);
475<span class="hljs-keyword">const</span> b = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./b.js'</span>);
476<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'in main, a.done = %j, b.done = %j'</span>, a.<span class="hljs-property">done</span>, b.<span class="hljs-property">done</span>);</code></pre>
477<p>When <code>main.js</code> loads <code>a.js</code>, then <code>a.js</code> in turn loads <code>b.js</code>. At that
478point, <code>b.js</code> tries to load <code>a.js</code>. In order to prevent an infinite
479loop, an <strong>unfinished copy</strong> of the <code>a.js</code> exports object is returned to the
480<code>b.js</code> module. <code>b.js</code> then finishes loading, and its <code>exports</code> object is
481provided to the <code>a.js</code> module.</p>
482<p>By the time <code>main.js</code> has loaded both modules, they're both finished.
483The output of this program would thus be:</p>
484<pre><code class="language-console"><span class="hljs-meta">$ </span><span class="language-bash">node main.js</span>
485main starting
486a starting
487b starting
488in b, a.done = false
489b done
490in a, b.done = true
491a done
492in main, a.done = true, b.done = true</code></pre>
493<p>Careful planning is required to allow cyclic module dependencies to work
494correctly within an application.</p>
495</section><section><h3>File modules<span><a class="mark" href="#modules_file_modules" id="modules_file_modules">#</a></span></h3>
496
497<p>If the exact filename is not found, then Node.js will attempt to load the
498required filename with the added extensions: <code>.js</code>, <code>.json</code>, and finally
499<code>.node</code>.</p>
500<p><code>.js</code> files are interpreted as JavaScript text files, and <code>.json</code> files are
501parsed as JSON text files. <code>.node</code> files are interpreted as compiled addon
502modules loaded with <code>process.dlopen()</code>.</p>
503<p>A required module prefixed with <code>'/'</code> is an absolute path to the file. For
504example, <code>require('/home/marco/foo.js')</code> will load the file at
505<code>/home/marco/foo.js</code>.</p>
506<p>A required module prefixed with <code>'./'</code> is relative to the file calling
507<code>require()</code>. That is, <code>circle.js</code> must be in the same directory as <code>foo.js</code> for
508<code>require('./circle')</code> to find it.</p>
509<p>Without a leading <code>'/'</code>, <code>'./'</code>, or <code>'../'</code> to indicate a file, the module must
510either be a core module or is loaded from a <code>node_modules</code> folder.</p>
511<p>If the given path does not exist, <code>require()</code> will throw an <a href="errors.html#errors_class_error"><code>Error</code></a> with its
512<code>code</code> property set to <code>'MODULE_NOT_FOUND'</code>.</p>
513</section><section><h3>Folders as modules<span><a class="mark" href="#modules_folders_as_modules" id="modules_folders_as_modules">#</a></span></h3>
514
515<p>It is convenient to organize programs and libraries into self-contained
516directories, and then provide a single entry point to those directories.
517There are three ways in which a folder may be passed to <code>require()</code> as
518an argument.</p>
519<p>The first is to create a <a href="packages.html#packages_node_js_package_json_field_definitions"><code>package.json</code></a> file in the root of the folder,
520which specifies a <code>main</code> module. An example <a href="packages.html#packages_node_js_package_json_field_definitions"><code>package.json</code></a> file might
521look like this:</p>
522<pre><code class="language-json"><span class="hljs-punctuation">{</span> <span class="hljs-attr">"name"</span> <span class="hljs-punctuation">:</span> <span class="hljs-string">"some-library"</span><span class="hljs-punctuation">,</span>
523  <span class="hljs-attr">"main"</span> <span class="hljs-punctuation">:</span> <span class="hljs-string">"./lib/some-library.js"</span> <span class="hljs-punctuation">}</span></code></pre>
524<p>If this was in a folder at <code>./some-library</code>, then
525<code>require('./some-library')</code> would attempt to load
526<code>./some-library/lib/some-library.js</code>.</p>
527<p>This is the extent of the awareness of <code>package.json</code> files within Node.js.</p>
528<p>If there is no <a href="packages.html#packages_node_js_package_json_field_definitions"><code>package.json</code></a> file present in the directory, or if the
529<a href="packages.html#packages_main"><code>"main"</code></a> entry is missing or cannot be resolved, then Node.js
530will attempt to load an <code>index.js</code> or <code>index.node</code> file out of that
531directory. For example, if there was no <a href="packages.html#packages_node_js_package_json_field_definitions"><code>package.json</code></a> file in the previous
532example, then <code>require('./some-library')</code> would attempt to load:</p>
533<ul>
534<li><code>./some-library/index.js</code></li>
535<li><code>./some-library/index.node</code></li>
536</ul>
537<p>If these attempts fail, then Node.js will report the entire module as missing
538with the default error:</p>
539<pre><code class="language-console">Error: Cannot find module 'some-library'</code></pre>
540</section><section><h3>Loading from <code>node_modules</code> folders<span><a class="mark" href="#modules_loading_from_node_modules_folders" id="modules_loading_from_node_modules_folders">#</a></span></h3>
541
542<p>If the module identifier passed to <code>require()</code> is not a
543<a href="#modules_core_modules">core</a> module, and does not begin with <code>'/'</code>, <code>'../'</code>, or
544<code>'./'</code>, then Node.js starts at the parent directory of the current module, and
545adds <code>/node_modules</code>, and attempts to load the module from that location.
546Node.js will not append <code>node_modules</code> to a path already ending in
547<code>node_modules</code>.</p>
548<p>If it is not found there, then it moves to the parent directory, and so
549on, until the root of the file system is reached.</p>
550<p>For example, if the file at <code>'/home/ry/projects/foo.js'</code> called
551<code>require('bar.js')</code>, then Node.js would look in the following locations, in
552this order:</p>
553<ul>
554<li><code>/home/ry/projects/node_modules/bar.js</code></li>
555<li><code>/home/ry/node_modules/bar.js</code></li>
556<li><code>/home/node_modules/bar.js</code></li>
557<li><code>/node_modules/bar.js</code></li>
558</ul>
559<p>This allows programs to localize their dependencies, so that they do not
560clash.</p>
561<p>It is possible to require specific files or sub modules distributed with a
562module by including a path suffix after the module name. For instance
563<code>require('example-module/path/to/file')</code> would resolve <code>path/to/file</code>
564relative to where <code>example-module</code> is located. The suffixed path follows the
565same module resolution semantics.</p>
566</section><section><h3>Loading from the global folders<span><a class="mark" href="#modules_loading_from_the_global_folders" id="modules_loading_from_the_global_folders">#</a></span></h3>
567
568<p>If the <code>NODE_PATH</code> environment variable is set to a colon-delimited list
569of absolute paths, then Node.js will search those paths for modules if they
570are not found elsewhere.</p>
571<p>On Windows, <code>NODE_PATH</code> is delimited by semicolons (<code>;</code>) instead of colons.</p>
572<p><code>NODE_PATH</code> was originally created to support loading modules from
573varying paths before the current <a href="#modules_all_together">module resolution</a> algorithm was defined.</p>
574<p><code>NODE_PATH</code> is still supported, but is less necessary now that the Node.js
575ecosystem has settled on a convention for locating dependent modules.
576Sometimes deployments that rely on <code>NODE_PATH</code> show surprising behavior
577when people are unaware that <code>NODE_PATH</code> must be set. Sometimes a
578module's dependencies change, causing a different version (or even a
579different module) to be loaded as the <code>NODE_PATH</code> is searched.</p>
580<p>Additionally, Node.js will search in the following list of GLOBAL_FOLDERS:</p>
581<ul>
582<li>1: <code>$HOME/.node_modules</code></li>
583<li>2: <code>$HOME/.node_libraries</code></li>
584<li>3: <code>$PREFIX/lib/node</code></li>
585</ul>
586<p>Where <code>$HOME</code> is the user's home directory, and <code>$PREFIX</code> is the Node.js
587configured <code>node_prefix</code>.</p>
588<p>These are mostly for historic reasons.</p>
589<p>It is strongly encouraged to place dependencies in the local <code>node_modules</code>
590folder. These will be loaded faster, and more reliably.</p>
591</section><section><h3>The module wrapper<span><a class="mark" href="#modules_the_module_wrapper" id="modules_the_module_wrapper">#</a></span></h3>
592
593<p>Before a module's code is executed, Node.js will wrap it with a function
594wrapper that looks like the following:</p>
595<pre><code class="language-js">(<span class="hljs-keyword">function</span>(<span class="hljs-params"><span class="hljs-built_in">exports</span>, <span class="hljs-built_in">require</span>, <span class="hljs-variable language_">module</span>, __filename, __dirname</span>) {
596<span class="hljs-comment">// Module code actually lives in here</span>
597});</code></pre>
598<p>By doing this, Node.js achieves a few things:</p>
599<ul>
600<li>It keeps top-level variables (defined with <code>var</code>, <code>const</code> or <code>let</code>) scoped to
601the module rather than the global object.</li>
602<li>It helps to provide some global-looking variables that are actually specific
603to the module, such as:
604<ul>
605<li>The <code>module</code> and <code>exports</code> objects that the implementor can use to export
606values from the module.</li>
607<li>The convenience variables <code>__filename</code> and <code>__dirname</code>, containing the
608module's absolute filename and directory path.</li>
609</ul>
610</li>
611</ul>
612</section><section><h3>The module scope<span><a class="mark" href="#modules_the_module_scope" id="modules_the_module_scope">#</a></span></h3>
613<h4><code>__dirname</code><span><a class="mark" href="#modules_dirname" id="modules_dirname">#</a></span></h4>
614<div class="api_metadata">
615<span>Added in: v0.1.27</span>
616</div>
617
618<ul>
619<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
620</ul>
621<p>The directory name of the current module. This is the same as the
622<a href="path.html#path_path_dirname_path"><code>path.dirname()</code></a> of the <a href="#modules_filename"><code>__filename</code></a>.</p>
623<p>Example: running <code>node example.js</code> from <code>/Users/mjr</code></p>
624<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(__dirname);
625<span class="hljs-comment">// Prints: /Users/mjr</span>
626<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(path.<span class="hljs-title function_">dirname</span>(__filename));
627<span class="hljs-comment">// Prints: /Users/mjr</span></code></pre>
628<h4><code>__filename</code><span><a class="mark" href="#modules_filename" id="modules_filename">#</a></span></h4>
629<div class="api_metadata">
630<span>Added in: v0.0.1</span>
631</div>
632
633<ul>
634<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
635</ul>
636<p>The file name of the current module. This is the current module file's absolute
637path with symlinks resolved.</p>
638<p>For a main program this is not necessarily the same as the file name used in the
639command line.</p>
640<p>See <a href="#modules_dirname"><code>__dirname</code></a> for the directory name of the current module.</p>
641<p>Examples:</p>
642<p>Running <code>node example.js</code> from <code>/Users/mjr</code></p>
643<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(__filename);
644<span class="hljs-comment">// Prints: /Users/mjr/example.js</span>
645<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(__dirname);
646<span class="hljs-comment">// Prints: /Users/mjr</span></code></pre>
647<p>Given two modules: <code>a</code> and <code>b</code>, where <code>b</code> is a dependency of
648<code>a</code> and there is a directory structure of:</p>
649<ul>
650<li><code>/Users/mjr/app/a.js</code></li>
651<li><code>/Users/mjr/app/node_modules/b/b.js</code></li>
652</ul>
653<p>References to <code>__filename</code> within <code>b.js</code> will return
654<code>/Users/mjr/app/node_modules/b/b.js</code> while references to <code>__filename</code> within
655<code>a.js</code> will return <code>/Users/mjr/app/a.js</code>.</p>
656<h4><code>exports</code><span><a class="mark" href="#modules_exports" id="modules_exports">#</a></span></h4>
657<div class="api_metadata">
658<span>Added in: v0.1.12</span>
659</div>
660
661<ul>
662<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a></li>
663</ul>
664<p>A reference to the <code>module.exports</code> that is shorter to type.
665See the section about the <a href="#modules_exports_shortcut">exports shortcut</a> for details on when to use
666<code>exports</code> and when to use <code>module.exports</code>.</p>
667<h4><code>module</code><span><a class="mark" href="#modules_module" id="modules_module">#</a></span></h4>
668<div class="api_metadata">
669<span>Added in: v0.1.16</span>
670</div>
671
672<ul>
673<li><a href="modules.html#modules_the_module_object" class="type">&#x3C;module></a></li>
674</ul>
675<p>A reference to the current module, see the section about the
676<a href="#modules_the_module_object"><code>module</code> object</a>. In particular, <code>module.exports</code> is used for defining what
677a module exports and makes available through <code>require()</code>.</p>
678<h4><code>require(id)</code><span><a class="mark" href="#modules_require_id" id="modules_require_id">#</a></span></h4>
679<div class="api_metadata">
680<span>Added in: v0.1.13</span>
681</div>
682
683<ul>
684<li><code>id</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a> module name or path</li>
685<li>Returns: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Data_types" class="type">&#x3C;any></a> exported module content</li>
686</ul>
687<p>Used to import modules, <code>JSON</code>, and local files. Modules can be imported
688from <code>node_modules</code>. Local modules and JSON files can be imported using
689a relative path (e.g. <code>./</code>, <code>./foo</code>, <code>./bar/baz</code>, <code>../foo</code>) that will be
690resolved against the directory named by <a href="#modules_dirname"><code>__dirname</code></a> (if defined) or
691the current working directory. The relative paths of POSIX style are resolved
692in an OS independent fashion, meaning that the examples above will work on
693Windows in the same way they would on Unix systems.</p>
694<pre><code class="language-js"><span class="hljs-comment">// Importing a local module with a path relative to the `__dirname` or current</span>
695<span class="hljs-comment">// working directory. (On Windows, this would resolve to .\path\myLocalModule.)</span>
696<span class="hljs-keyword">const</span> myLocalModule = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./path/myLocalModule'</span>);
697
698<span class="hljs-comment">// Importing a JSON file:</span>
699<span class="hljs-keyword">const</span> jsonData = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./path/filename.json'</span>);
700
701<span class="hljs-comment">// Importing a module from node_modules or Node.js built-in module:</span>
702<span class="hljs-keyword">const</span> crypto = <span class="hljs-built_in">require</span>(<span class="hljs-string">'crypto'</span>);</code></pre>
703<h5><code>require.cache</code><span><a class="mark" href="#modules_require_cache" id="modules_require_cache">#</a></span></h5>
704<div class="api_metadata">
705<span>Added in: v0.3.0</span>
706</div>
707<ul>
708<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a></li>
709</ul>
710<p>Modules are cached in this object when they are required. By deleting a key
711value from this object, the next <code>require</code> will reload the module.
712This does not apply to <a href="addons.html">native addons</a>, for which reloading will result in an
713error.</p>
714<p>Adding or replacing entries is also possible. This cache is checked before
715native modules and if a name matching a native module is added to the cache,
716only <code>node:</code>-prefixed require calls are going to receive the native module.
717Use with care!</p>
718<!-- eslint-disable node-core/no-duplicate-requires -->
719<pre><code class="language-js"><span class="hljs-keyword">const</span> assert = <span class="hljs-built_in">require</span>(<span class="hljs-string">'assert'</span>);
720<span class="hljs-keyword">const</span> realFs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
721
722<span class="hljs-keyword">const</span> fakeFs = {};
723<span class="hljs-built_in">require</span>.<span class="hljs-property">cache</span>.<span class="hljs-property">fs</span> = { <span class="hljs-attr">exports</span>: fakeFs };
724
725assert.<span class="hljs-title function_">strictEqual</span>(<span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>), fakeFs);
726assert.<span class="hljs-title function_">strictEqual</span>(<span class="hljs-built_in">require</span>(<span class="hljs-string">'node:fs'</span>), realFs);</code></pre>
727<h5><code>require.extensions</code><span><a class="mark" href="#modules_require_extensions" id="modules_require_extensions">#</a></span></h5>
728<div class="api_metadata">
729<span>Added in: v0.3.0</span><span>Deprecated since: v0.10.6</span>
730</div>
731<p></p><div class="api_stability api_stability_0"><a href="documentation.html#documentation_stability_index">Stability: 0</a> - Deprecated</div><p></p>
732<ul>
733<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a></li>
734</ul>
735<p>Instruct <code>require</code> on how to handle certain file extensions.</p>
736<p>Process files with the extension <code>.sjs</code> as <code>.js</code>:</p>
737<pre><code class="language-js"><span class="hljs-built_in">require</span>.<span class="hljs-property">extensions</span>[<span class="hljs-string">'.sjs'</span>] = <span class="hljs-built_in">require</span>.<span class="hljs-property">extensions</span>[<span class="hljs-string">'.js'</span>];</code></pre>
738<p><strong>Deprecated.</strong> In the past, this list has been used to load non-JavaScript
739modules into Node.js by compiling them on-demand. However, in practice, there
740are much better ways to do this, such as loading modules via some other Node.js
741program, or compiling them to JavaScript ahead of time.</p>
742<p>Avoid using <code>require.extensions</code>. Use could cause subtle bugs and resolving the
743extensions gets slower with each registered extension.</p>
744<h5><code>require.main</code><span><a class="mark" href="#modules_require_main" id="modules_require_main">#</a></span></h5>
745<div class="api_metadata">
746<span>Added in: v0.1.17</span>
747</div>
748<ul>
749<li><a href="modules.html#modules_the_module_object" class="type">&#x3C;module></a></li>
750</ul>
751<p>The <code>Module</code> object representing the entry script loaded when the Node.js
752process launched.
753See <a href="#modules_accessing_the_main_module">"Accessing the main module"</a>.</p>
754<p>In <code>entry.js</code> script:</p>
755<pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-built_in">require</span>.<span class="hljs-property">main</span>);</code></pre>
756<pre><code class="language-bash">node entry.js</code></pre>
757<!-- eslint-skip -->
758<pre><code class="language-js"><span class="hljs-title class_">Module</span> {
759  <span class="hljs-attr">id</span>: <span class="hljs-string">'.'</span>,
760  <span class="hljs-attr">path</span>: <span class="hljs-string">'/absolute/path/to'</span>,
761  <span class="hljs-attr">exports</span>: {},
762  <span class="hljs-attr">parent</span>: <span class="hljs-literal">null</span>,
763  <span class="hljs-attr">filename</span>: <span class="hljs-string">'/absolute/path/to/entry.js'</span>,
764  <span class="hljs-attr">loaded</span>: <span class="hljs-literal">false</span>,
765  <span class="hljs-attr">children</span>: [],
766  <span class="hljs-attr">paths</span>:
767   [ <span class="hljs-string">'/absolute/path/to/node_modules'</span>,
768     <span class="hljs-string">'/absolute/path/node_modules'</span>,
769     <span class="hljs-string">'/absolute/node_modules'</span>,
770     <span class="hljs-string">'/node_modules'</span> ] }</code></pre>
771<h5><code>require.resolve(request[, options])</code><span><a class="mark" href="#modules_require_resolve_request_options" id="modules_require_resolve_request_options">#</a></span></h5>
772<div class="api_metadata">
773<details class="changelog"><summary>History</summary>
774<table>
775<tbody><tr><th>Version</th><th>Changes</th></tr>
776<tr><td>v8.9.0</td>
777<td><p>The <code>paths</code> option is now supported.</p></td></tr>
778<tr><td>v0.3.0</td>
779<td><p><span>Added in: v0.3.0</span></p></td></tr>
780</tbody></table>
781</details>
782</div>
783<ul>
784<li><code>request</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a> The module path to resolve.</li>
785<li><code>options</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a>
786<ul>
787<li><code>paths</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string[]></a> Paths to resolve module location from. If present, these
788paths are used instead of the default resolution paths, with the exception
789of <a href="#modules_loading_from_the_global_folders">GLOBAL_FOLDERS</a> like <code>$HOME/.node_modules</code>, which are always
790included. Each of these paths is used as a starting point for
791the module resolution algorithm, meaning that the <code>node_modules</code> hierarchy
792is checked from this location.</li>
793</ul>
794</li>
795<li>Returns: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
796</ul>
797<p>Use the internal <code>require()</code> machinery to look up the location of a module,
798but rather than loading the module, just return the resolved filename.</p>
799<p>If the module can not be found, a <code>MODULE_NOT_FOUND</code> error is thrown.</p>
800<h6><code>require.resolve.paths(request)</code><span><a class="mark" href="#modules_require_resolve_paths_request" id="modules_require_resolve_paths_request">#</a></span></h6>
801<div class="api_metadata">
802<span>Added in: v8.9.0</span>
803</div>
804<ul>
805<li><code>request</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a> The module path whose lookup paths are being retrieved.</li>
806<li>Returns: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string[]></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Null_type" class="type">&#x3C;null></a></li>
807</ul>
808<p>Returns an array containing the paths searched during resolution of <code>request</code> or
809<code>null</code> if the <code>request</code> string references a core module, for example <code>http</code> or
810<code>fs</code>.</p>
811</section><section><h3>The <code>module</code> object<span><a class="mark" href="#modules_the_module_object" id="modules_the_module_object">#</a></span></h3>
812<div class="api_metadata">
813<span>Added in: v0.1.16</span>
814</div>
815
816
817<ul>
818<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a></li>
819</ul>
820<p>In each module, the <code>module</code> free variable is a reference to the object
821representing the current module. For convenience, <code>module.exports</code> is
822also accessible via the <code>exports</code> module-global. <code>module</code> is not actually
823a global but rather local to each module.</p>
824<h4><code>module.children</code><span><a class="mark" href="#modules_module_children" id="modules_module_children">#</a></span></h4>
825<div class="api_metadata">
826<span>Added in: v0.1.16</span>
827</div>
828<ul>
829<li><a href="modules.html#modules_the_module_object" class="type">&#x3C;module[]></a></li>
830</ul>
831<p>The module objects required for the first time by this one.</p>
832<h4><code>module.exports</code><span><a class="mark" href="#modules_module_exports" id="modules_module_exports">#</a></span></h4>
833<div class="api_metadata">
834<span>Added in: v0.1.16</span>
835</div>
836<ul>
837<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&#x3C;Object></a></li>
838</ul>
839<p>The <code>module.exports</code> object is created by the <code>Module</code> system. Sometimes this is
840not acceptable; many want their module to be an instance of some class. To do
841this, assign the desired export object to <code>module.exports</code>. Assigning
842the desired object to <code>exports</code> will simply rebind the local <code>exports</code> variable,
843which is probably not what is desired.</p>
844<p>For example, suppose we were making a module called <code>a.js</code>:</p>
845<pre><code class="language-js"><span class="hljs-keyword">const</span> <span class="hljs-title class_">EventEmitter</span> = <span class="hljs-built_in">require</span>(<span class="hljs-string">'events'</span>);
846
847<span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = <span class="hljs-keyword">new</span> <span class="hljs-title class_">EventEmitter</span>();
848
849<span class="hljs-comment">// Do some work, and after some time emit</span>
850<span class="hljs-comment">// the 'ready' event from the module itself.</span>
851<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
852  <span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span>.<span class="hljs-title function_">emit</span>(<span class="hljs-string">'ready'</span>);
853}, <span class="hljs-number">1000</span>);</code></pre>
854<p>Then in another file we could do:</p>
855<pre><code class="language-js"><span class="hljs-keyword">const</span> a = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./a'</span>);
856a.<span class="hljs-title function_">on</span>(<span class="hljs-string">'ready'</span>, <span class="hljs-function">() =></span> {
857  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'module "a" is ready'</span>);
858});</code></pre>
859<p>Assignment to <code>module.exports</code> must be done immediately. It cannot be
860done in any callbacks. This does not work:</p>
861<p><code>x.js</code>:</p>
862<pre><code class="language-js"><span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
863  <span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = { <span class="hljs-attr">a</span>: <span class="hljs-string">'hello'</span> };
864}, <span class="hljs-number">0</span>);</code></pre>
865<p><code>y.js</code>:</p>
866<pre><code class="language-js"><span class="hljs-keyword">const</span> x = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./x'</span>);
867<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(x.<span class="hljs-property">a</span>);</code></pre>
868<h5><code>exports</code> shortcut<span><a class="mark" href="#modules_exports_shortcut" id="modules_exports_shortcut">#</a></span></h5>
869<div class="api_metadata">
870<span>Added in: v0.1.16</span>
871</div>
872<p>The <code>exports</code> variable is available within a module's file-level scope, and is
873assigned the value of <code>module.exports</code> before the module is evaluated.</p>
874<p>It allows a shortcut, so that <code>module.exports.f = ...</code> can be written more
875succinctly as <code>exports.f = ...</code>. However, be aware that like any variable, if a
876new value is assigned to <code>exports</code>, it is no longer bound to <code>module.exports</code>:</p>
877<pre><code class="language-js"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span>.<span class="hljs-property">hello</span> = <span class="hljs-literal">true</span>; <span class="hljs-comment">// Exported from require of module</span>
878<span class="hljs-built_in">exports</span> = { <span class="hljs-attr">hello</span>: <span class="hljs-literal">false</span> };  <span class="hljs-comment">// Not exported, only available in the module</span></code></pre>
879<p>When the <code>module.exports</code> property is being completely replaced by a new
880object, it is common to also reassign <code>exports</code>:</p>
881<!-- eslint-disable func-name-matching -->
882<pre><code class="language-js"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = <span class="hljs-built_in">exports</span> = <span class="hljs-keyword">function</span> <span class="hljs-title function_">Constructor</span>(<span class="hljs-params"></span>) {
883  <span class="hljs-comment">// ... etc.</span>
884};</code></pre>
885<p>To illustrate the behavior, imagine this hypothetical implementation of
886<code>require()</code>, which is quite similar to what is actually done by <code>require()</code>:</p>
887<pre><code class="language-js"><span class="hljs-keyword">function</span> <span class="hljs-title function_">require</span>(<span class="hljs-params"><span class="hljs-comment">/* ... */</span></span>) {
888  <span class="hljs-keyword">const</span> <span class="hljs-variable language_">module</span> = { <span class="hljs-attr">exports</span>: {} };
889  (<span class="hljs-function">(<span class="hljs-params"><span class="hljs-variable language_">module</span>, <span class="hljs-built_in">exports</span></span>) =></span> {
890    <span class="hljs-comment">// Module code here. In this example, define a function.</span>
891    <span class="hljs-keyword">function</span> <span class="hljs-title function_">someFunc</span>(<span class="hljs-params"></span>) {}
892    <span class="hljs-built_in">exports</span> = someFunc;
893    <span class="hljs-comment">// At this point, exports is no longer a shortcut to module.exports, and</span>
894    <span class="hljs-comment">// this module will still export an empty default object.</span>
895    <span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = someFunc;
896    <span class="hljs-comment">// At this point, the module will now export someFunc, instead of the</span>
897    <span class="hljs-comment">// default object.</span>
898  })(<span class="hljs-variable language_">module</span>, <span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span>);
899  <span class="hljs-keyword">return</span> <span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span>;
900}</code></pre>
901<h4><code>module.filename</code><span><a class="mark" href="#modules_module_filename" id="modules_module_filename">#</a></span></h4>
902<div class="api_metadata">
903<span>Added in: v0.1.16</span>
904</div>
905<ul>
906<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
907</ul>
908<p>The fully resolved filename of the module.</p>
909<h4><code>module.id</code><span><a class="mark" href="#modules_module_id" id="modules_module_id">#</a></span></h4>
910<div class="api_metadata">
911<span>Added in: v0.1.16</span>
912</div>
913<ul>
914<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
915</ul>
916<p>The identifier for the module. Typically this is the fully resolved
917filename.</p>
918<h4><code>module.isPreloading</code><span><a class="mark" href="#modules_module_ispreloading" id="modules_module_ispreloading">#</a></span></h4>
919<div class="api_metadata">
920<span>Added in: v14.17.0</span>
921</div>
922<ul>
923<li>Type: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&#x3C;boolean></a> <code>true</code> if the module is running during the Node.js preload
924phase.</li>
925</ul>
926<h4><code>module.loaded</code><span><a class="mark" href="#modules_module_loaded" id="modules_module_loaded">#</a></span></h4>
927<div class="api_metadata">
928<span>Added in: v0.1.16</span>
929</div>
930<ul>
931<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&#x3C;boolean></a></li>
932</ul>
933<p>Whether or not the module is done loading, or is in the process of
934loading.</p>
935<h4><code>module.parent</code><span><a class="mark" href="#modules_module_parent" id="modules_module_parent">#</a></span></h4>
936<div class="api_metadata">
937<span>Added in: v0.1.16</span><span>Deprecated since: v14.6.0, v12.19.0</span>
938</div>
939<p></p><div class="api_stability api_stability_0"><a href="documentation.html#documentation_stability_index">Stability: 0</a> - Deprecated: Please use <a href="#modules_require_main"><code>require.main</code></a> and
940<a href="#modules_module_children"><code>module.children</code></a> instead.</div><p></p>
941<ul>
942<li><a href="modules.html#modules_the_module_object" class="type">&#x3C;module></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Null_type" class="type">&#x3C;null></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Undefined_type" class="type">&#x3C;undefined></a></li>
943</ul>
944<p>The module that first required this one, or <code>null</code> if the current module is the
945entry point of the current process, or <code>undefined</code> if the module was loaded by
946something that is not a CommonJS module (E.G.: REPL or <code>import</code>).</p>
947<h4><code>module.path</code><span><a class="mark" href="#modules_module_path" id="modules_module_path">#</a></span></h4>
948<div class="api_metadata">
949<span>Added in: v11.14.0</span>
950</div>
951<ul>
952<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
953</ul>
954<p>The directory name of the module. This is usually the same as the
955<a href="path.html#path_path_dirname_path"><code>path.dirname()</code></a> of the <a href="#modules_module_id"><code>module.id</code></a>.</p>
956<h4><code>module.paths</code><span><a class="mark" href="#modules_module_paths" id="modules_module_paths">#</a></span></h4>
957<div class="api_metadata">
958<span>Added in: v0.4.0</span>
959</div>
960<ul>
961<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string[]></a></li>
962</ul>
963<p>The search paths for the module.</p>
964<h4><code>module.require(id)</code><span><a class="mark" href="#modules_module_require_id" id="modules_module_require_id">#</a></span></h4>
965<div class="api_metadata">
966<span>Added in: v0.5.1</span>
967</div>
968<ul>
969<li><code>id</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&#x3C;string></a></li>
970<li>Returns: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Data_types" class="type">&#x3C;any></a> exported module content</li>
971</ul>
972<p>The <code>module.require()</code> method provides a way to load a module as if
973<code>require()</code> was called from the original module.</p>
974<p>In order to do this, it is necessary to get a reference to the <code>module</code> object.
975Since <code>require()</code> returns the <code>module.exports</code>, and the <code>module</code> is typically
976<em>only</em> available within a specific module's code, it must be explicitly exported
977in order to be used.</p>
978</section><section><h3>The <code>Module</code> object<span><a class="mark" href="#modules_the_module_object_1" id="modules_the_module_object_1">#</a></span></h3>
979<p>This section was moved to
980<a href="module.html#module_the_module_object">Modules: <code>module</code> core module</a>.</p>
981<!-- Anchors to make sure old links find a target -->
982<ul>
983<li><a id="modules_module_builtinmodules" href="module.html#module_module_builtinmodules"><code>module.builtinModules</code></a></li>
984<li><a id="modules_module_createrequire_filename" href="module.html#module_module_createrequire_filename"><code>module.createRequire(filename)</code></a></li>
985<li><a id="modules_module_createrequirefrompath_filename" href="module.html#module_module_createrequirefrompath_filename"><code>module.createRequireFromPath(filename)</code></a></li>
986<li><a id="modules_module_syncbuiltinesmexports" href="module.html#module_module_syncbuiltinesmexports"><code>module.syncBuiltinESMExports()</code></a></li>
987</ul>
988</section><section><h3>Source map v3 support<span><a class="mark" href="#modules_source_map_v3_support" id="modules_source_map_v3_support">#</a></span></h3>
989<p>This section was moved to
990<a href="module.html#module_source_map_v3_support">Modules: <code>module</code> core module</a>.</p>
991<!-- Anchors to make sure old links find a target -->
992<ul>
993<li><a id="modules_module_findsourcemap_path_error" href="module.html#module_module_findsourcemap_path"><code>module.findSourceMap(path)</code></a></li>
994<li><a id="modules_class_module_sourcemap" href="module.html#module_class_module_sourcemap">Class: <code>module.SourceMap</code></a>
995<ul>
996<li><a id="modules_new_sourcemap_payload" href="module.html#module_new_sourcemap_payload"><code>new SourceMap(payload)</code></a></li>
997<li><a id="modules_sourcemap_payload" href="module.html#module_sourcemap_payload"><code>sourceMap.payload</code></a></li>
998<li><a id="modules_sourcemap_findentry_linenumber_columnnumber" href="module.html#module_sourcemap_findentry_linenumber_columnnumber"><code>sourceMap.findEntry(lineNumber, columnNumber)</code></a></li>
999</ul>
1000</li>
1001</ul></section>
1002        <!-- API END -->
1003      </div>
1004    </div>
1005  </div>
1006  <script>
1007    'use strict';
1008    {
1009      const kCustomPreference = 'customDarkTheme';
1010      const userSettings = sessionStorage.getItem(kCustomPreference);
1011      const themeToggleButton = document.getElementById('theme-toggle-btn');
1012      if (userSettings === null && window.matchMedia) {
1013        const mq = window.matchMedia('(prefers-color-scheme: dark)');
1014        if ('onchange' in mq) {
1015          function mqChangeListener(e) {
1016            document.body.classList.toggle('dark-mode', e.matches);
1017          }
1018          mq.addEventListener('change', mqChangeListener);
1019          if (themeToggleButton) {
1020            themeToggleButton.addEventListener('click', function() {
1021              mq.removeEventListener('change', mqChangeListener);
1022            }, { once: true });
1023          }
1024        }
1025        if (mq.matches) {
1026          document.body.classList.add('dark-mode');
1027        }
1028      } else if (userSettings === 'true') {
1029        document.body.classList.add('dark-mode');
1030      }
1031      if (themeToggleButton) {
1032        themeToggleButton.hidden = false;
1033        themeToggleButton.addEventListener('click', function() {
1034          sessionStorage.setItem(
1035            kCustomPreference,
1036            document.body.classList.toggle('dark-mode')
1037          );
1038        });
1039      }
1040    }
1041  </script>
1042</body>
1043</html>
1044