@@ -270,7 +270,7 @@ changes: |
270 | 270 | Register a module that exports [hooks][] that customize Node.js module |
271 | 271 | resolution and loading behavior. See [Customization hooks][]. |
272 | 272 |
|
273 | | -## `module.stripTypeScriptTypes(code[, options])` |
| 273 | +### `module.stripTypeScriptTypes(code[, options])` |
274 | 274 |
|
275 | 275 | <!-- YAML |
276 | 276 | added: REPLACEME |
@@ -408,6 +408,175 @@ import('node:fs').then((esmFS) => { |
408 | 408 | }); |
409 | 409 | ``` |
410 | 410 |
|
| 411 | +## Module compile cache |
| 412 | +
|
| 413 | +<!-- YAML |
| 414 | +added: v22.1.0 |
| 415 | +changes: |
| 416 | + - version: v22.8.0 |
| 417 | + pr-url: https://github.com/nodejs/node/pull/54501 |
| 418 | + description: add initial JavaScript APIs for runtime access. |
| 419 | +--> |
| 420 | +
|
| 421 | +The module compile cache can be enabled either using the [`module.enableCompileCache()`][] |
| 422 | +method or the [`NODE_COMPILE_CACHE=dir`][] environment variable. After it is enabled, |
| 423 | +whenever Node.js compiles a CommonJS or a ECMAScript Module, it will use on-disk |
| 424 | +[V8 code cache][] persisted in the specified directory to speed up the compilation. |
| 425 | +This may slow down the first load of a module graph, but subsequent loads of the same module |
| 426 | +graph may get a significant speedup if the contents of the modules do not change. |
| 427 | +
|
| 428 | +To clean up the generated compile cache on disk, simply remove the cache directory. The cache |
| 429 | +directory will be recreated the next time the same directory is used for for compile cache |
| 430 | +storage. To avoid filling up the disk with stale cache, it is recommended to use a directory |
| 431 | +under the [`os.tmpdir()`][]. If the compile cache is enabled by a call to |
| 432 | +[`module.enableCompileCache()`][] without specifying the directory, Node.js will use |
| 433 | +the [`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or defaults |
| 434 | +to `path.join(os.tmpdir(), 'node-compile-cache')` otherwise. To locate the compile cache |
| 435 | +directory used by a running Node.js instance, use [`module.getCompileCacheDir()`][]. |
| 436 | +
|
| 437 | +Currently when using the compile cache with [V8 JavaScript code coverage][], the |
| 438 | +coverage being collected by V8 may be less precise in functions that are |
| 439 | +deserialized from the code cache. It's recommended to turn this off when |
| 440 | +running tests to generate precise coverage. |
| 441 | +
|
| 442 | +The enabled module compile cache can be disabled by the [`NODE_DISABLE_COMPILE_CACHE=1`][] |
| 443 | +environment variable. This can be useful when the compile cache leads to unexpected or |
| 444 | +undesired behaviors (e.g. less precise test coverage). |
| 445 | +
|
| 446 | +Compilation cache generated by one version of Node.js can not be reused by a different |
| 447 | +version of Node.js. Cache generated by different versions of Node.js will be stored |
| 448 | +separately if the same base directory is used to persist the cache, so they can co-exist. |
| 449 | +
|
| 450 | +At the moment, when the compile cache is enabled and a module is loaded afresh, the |
| 451 | +code cache is generated from the compiled code immediately, but will only be written |
| 452 | +to disk when the Node.js instance is about to exit. This is subject to change. The |
| 453 | +[`module.flushCompileCache()`][] method can be used to ensure the accumulated code cache |
| 454 | +is flushed to disk in case the application wants to spawn other Node.js instances |
| 455 | +and let them share the cache long before the parent exits. |
| 456 | +
|
| 457 | +### `module.constants.compileCacheStatus` |
| 458 | +
|
| 459 | +<!-- YAML |
| 460 | +added: v22.8.0 |
| 461 | +--> |
| 462 | +
|
| 463 | +> Stability: 1.1 - Active Development |
| 464 | +
|
| 465 | +The following constants are returned as the `status` field in the object returned by |
| 466 | +[`module.enableCompileCache()`][] to indicate the result of the attempt to enable the |
| 467 | +[module compile cache][]. |
| 468 | +
|
| 469 | +<table> |
| 470 | + <tr> |
| 471 | + <th>Constant</th> |
| 472 | + <th>Description</th> |
| 473 | + </tr> |
| 474 | + <tr> |
| 475 | + <td><code>ENABLED</code></td> |
| 476 | + <td> |
| 477 | + Node.js has enabled the compile cache successfully. The directory used to store the |
| 478 | + compile cache will be returned in the <code>directory</code> field in the |
| 479 | + returned object. |
| 480 | + </td> |
| 481 | + </tr> |
| 482 | + <tr> |
| 483 | + <td><code>ALREADY_ENABLED</code></td> |
| 484 | + <td> |
| 485 | + The compile cache has already been enabled before, either by a previous call to |
| 486 | + <code>module.enableCompileCache()</code>, or by the <code>NODE_COMPILE_CACHE=dir</code> |
| 487 | + environment variable. The directory used to store the |
| 488 | + compile cache will be returned in the <code>directory</code> field in the |
| 489 | + returned object. |
| 490 | + </td> |
| 491 | + </tr> |
| 492 | + <tr> |
| 493 | + <td><code>FAILED</code></td> |
| 494 | + <td> |
| 495 | + Node.js fails to enable the compile cache. This can be caused by the lack of |
| 496 | + permission to use the specified directory, or various kinds of file system errors. |
| 497 | + The detail of the failure will be returned in the <code>message</code> field in the |
| 498 | + returned object. |
| 499 | + </td> |
| 500 | + </tr> |
| 501 | + <tr> |
| 502 | + <td><code>DISABLED</code></td> |
| 503 | + <td> |
| 504 | + Node.js cannot enable the compile cache because the environment variable |
| 505 | + <code>NODE_DISABLE_COMPILE_CACHE=1</code> has been set. |
| 506 | + </td> |
| 507 | + </tr> |
| 508 | +</table> |
| 509 | +
|
| 510 | +### `module.enableCompileCache([cacheDir])` |
| 511 | +
|
| 512 | +<!-- YAML |
| 513 | +added: v22.8.0 |
| 514 | +--> |
| 515 | +
|
| 516 | +> Stability: 1.1 - Active Development |
| 517 | +
|
| 518 | +* `cacheDir` {string|undefined} Optional path to specify the directory where the compile cache |
| 519 | + will be stored/retrieved. |
| 520 | +* Returns: {Object} |
| 521 | + * `status` {integer} One of the [`module.constants.compileCacheStatus`][] |
| 522 | + * `message` {string|undefined} If Node.js cannot enable the compile cache, this contains |
| 523 | + the error message. Only set if `status` is `module.constants.compileCacheStatus.FAILED`. |
| 524 | + * `directory` {string|undefined} If the compile cache is enabled, this contains the directory |
| 525 | + where the compile cache is stored. Only set if `status` is |
| 526 | + `module.constants.compileCacheStatus.ENABLED` or |
| 527 | + `module.constants.compileCacheStatus.ALREADY_ENABLED`. |
| 528 | +
|
| 529 | +Enable [module compile cache][] in the current Node.js instance. |
| 530 | +
|
| 531 | +If `cacheDir` is not specified, Node.js will either use the directory specified by the |
| 532 | +[`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or use |
| 533 | +`path.join(os.tmpdir(), 'node-compile-cache')` otherwise. For general use cases, it's |
| 534 | +recommended to call `module.enableCompileCache()` without specifying the `cacheDir`, |
| 535 | +so that the directory can be overridden by the `NODE_COMPILE_CACHE` environment |
| 536 | +variable when necessary. |
| 537 | +
|
| 538 | +Since compile cache is supposed to be a quiet optimization that is not required for the |
| 539 | +application to be functional, this method is designed to not throw any exception when the |
| 540 | +compile cache cannot be enabled. Instead, it will return an object containing an error |
| 541 | +message in the `message` field to aid debugging. |
| 542 | +If compile cache is enabled successfully, the `directory` field in the returned object |
| 543 | +contains the path to the directory where the compile cache is stored. The `status` |
| 544 | +field in the returned object would be one of the `module.constants.compileCacheStatus` |
| 545 | +values to indicate the result of the attempt to enable the [module compile cache][]. |
| 546 | +
|
| 547 | +This method only affects the current Node.js instance. To enable it in child worker threads, |
| 548 | +either call this method in child worker threads too, or set the |
| 549 | +`process.env.NODE_COMPILE_CACHE` value to compile cache directory so the behavior can |
| 550 | +be inherited into the child workers. The directory can be obtained either from the |
| 551 | +`directory` field returned by this method, or with [`module.getCompileCacheDir()`][]. |
| 552 | +
|
| 553 | +### `module.flushCompileCache()` |
| 554 | +
|
| 555 | +<!-- YAML |
| 556 | +added: |
| 557 | + - v23.0.0 |
| 558 | + - v22.10.0 |
| 559 | +--> |
| 560 | +
|
| 561 | +> Stability: 1.1 - Active Development |
| 562 | +
|
| 563 | +Flush the [module compile cache][] accumulated from modules already loaded |
| 564 | +in the current Node.js instance to disk. This returns after all the flushing |
| 565 | +file system operations come to an end, no matter they succeed or not. If there |
| 566 | +are any errors, this will fail silently, since compile cache misses should not |
| 567 | +interfere with the actual operation of the application. |
| 568 | +
|
| 569 | +### `module.getCompileCacheDir()` |
| 570 | +
|
| 571 | +<!-- YAML |
| 572 | +added: v22.8.0 |
| 573 | +--> |
| 574 | +
|
| 575 | +> Stability: 1.1 - Active Development |
| 576 | +
|
| 577 | +* Returns: {string|undefined} Path to the [module compile cache][] directory if it is enabled, |
| 578 | + or `undefined` otherwise. |
| 579 | +
|
411 | 580 | <i id="module_customization_hooks"></i> |
412 | 581 |
|
413 | 582 | ## Customization Hooks |
@@ -1204,21 +1373,6 @@ added: |
1204 | 1373 | `path` is the resolved path for the file for which a corresponding source map |
1205 | 1374 | should be fetched. |
1206 | 1375 |
|
1207 | | -### `module.flushCompileCache()` |
1208 | | -
|
1209 | | -<!-- YAML |
1210 | | -added: |
1211 | | - - v22.10.0 |
1212 | | ---> |
1213 | | -
|
1214 | | -> Stability: 1.1 - Active Development |
1215 | | -
|
1216 | | -Flush the [module compile cache][] accumulated from modules already loaded |
1217 | | -in the current Node.js instance to disk. This returns after all the flushing |
1218 | | -file system operations come to an end, no matter they succeed or not. If there |
1219 | | -are any errors, this will fail silently, since compile cache misses should not |
1220 | | -interfer with the actual operation of the application. |
1221 | | -
|
1222 | 1376 | ### Class: `module.SourceMap` |
1223 | 1377 |
|
1224 | 1378 | <!-- YAML |
|