Skip to content

Conversation

@anonrig
Copy link
Member

@anonrig anonrig commented Jan 20, 2026

Initially started a couple of years ago, the new cjs module lexer is 25% faster for cold importing cjs files. This change introduces a new dependency and removes the old one.

Benchmark CI: https://ci.nodejs.org/view/Node.js%20benchmark/job/benchmark-node-micro-benchmarks/1784/console

                                                                                                                                                                confidence improvement accuracy (*)
esm/detect-esm-syntax.js n=10000 type='with-package-json'                                                                                                              ***      1.47 %       ±0.40%
esm/detect-esm-syntax.js n=10000 type='without-package-json'                                                                                                           ***      0.64 %       ±0.35%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/non-exist' packageConfigMain='./index.js' packageJsonUrl='node_modules/test/package.json' n=10000                *      0.95 %       ±0.92%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/non-exist' packageConfigMain='' packageJsonUrl='node_modules/test/package.json' n=10000                                -0.06 %       ±0.95%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.js' packageConfigMain='./index.js' packageJsonUrl='node_modules/test/package.json' n=10000                  -0.72 %       ±1.02%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.js' packageConfigMain='' packageJsonUrl='node_modules/test/package.json' n=10000                             0.33 %       ±0.62%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.json' packageConfigMain='./index.js' packageJsonUrl='node_modules/test/package.json' n=10000                 0.38 %       ±0.98%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.json' packageConfigMain='' packageJsonUrl='node_modules/test/package.json' n=10000                   **      0.84 %       ±0.61%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.node' packageConfigMain='./index.js' packageJsonUrl='node_modules/test/package.json' n=10000                 0.66 %       ±1.04%
esm/esm-legacyMainResolve.js resolvedFile='node_modules/test/index.node' packageConfigMain='' packageJsonUrl='node_modules/test/package.json' n=10000                           0.21 %       ±0.92%
esm/esm-loader-defaultResolve.js specifier='./relative-existing.js' n=1000                                                                                                     -1.93 %       ±5.48%
esm/esm-loader-defaultResolve.js specifier='./relative-nonexistent.js' n=1000                                                                                                  -0.48 %       ±1.94%
esm/esm-loader-defaultResolve.js specifier='node:os' n=1000                                                                                                                    -8.43 %       ±9.28%
esm/esm-loader-defaultResolve.js specifier='node:prefixed-nonexistent' n=1000                                                                                                  -8.48 %      ±10.15%
esm/esm-loader-defaultResolve.js specifier='unprefixed-existing' n=1000                                                                                                         0.56 %       ±3.21%
esm/esm-loader-defaultResolve.js specifier='unprefixed-nonexistent' n=1000                                                                                                     -0.08 %       ±1.73%
esm/esm-loader-import.js specifier='./relative-existing.js' n=1000                                                                                                       *      5.62 %       ±5.09%
esm/esm-loader-import.js specifier='./relative-nonexistent.js' n=1000                                                                                                           1.53 %       ±2.90%
esm/esm-loader-import.js specifier='data:text/javascript,{i}' n=1000                                                                                                            1.47 %       ±2.73%
esm/esm-loader-import.js specifier='node:os' n=1000                                                                                                                             0.43 %       ±7.59%
esm/esm-loader-import.js specifier='node:prefixed-nonexistent' n=1000                                                                                                           2.29 %       ±3.67%
esm/import-cjs.js type='cold'                                                                                                                                          ***     26.83 %       ±0.58%
esm/import-cjs.js type='warm'                                                                                                                                          ***     11.95 %       ±0.14%
esm/import-esm-reload.js n=1000 count=1                                                                                                                                         0.08 %       ±1.04%
esm/import-esm-reload.js n=1000 count=100                                                                                                                                *      0.99 %       ±0.92%
esm/import-meta.js valuesToRead='dirname-and-filename' n=1000                                                                                                           **      1.11 %       ±0.75%
esm/import-meta.js valuesToRead='dirname' n=1000                                                                                                                                0.50 %       ±0.67%
esm/import-meta.js valuesToRead='filename' n=1000                                                                                                                       **      1.17 %       ±0.76%
esm/import-meta.js valuesToRead='url' n=1000                                                                                                                                   -0.57 %       ±0.77%
esm/require-esm.js n=1000 exports='default' type='access'                                                                                                                       0.77 %       ±1.21%
esm/require-esm.js n=1000 exports='default' type='all'                                                                                                                          1.31 %       ±1.75%
esm/require-esm.js n=1000 exports='default' type='load'                                                                                                                         0.06 %       ±1.96%
esm/require-esm.js n=1000 exports='named' type='access'                                                                                                                         0.79 %       ±1.05%
esm/require-esm.js n=1000 exports='named' type='all'                                                                                                                           -0.54 %       ±1.98%
esm/require-esm.js n=1000 exports='named' type='load'                                                                                                                          -0.90 %       ±2.32%

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/gyp
  • @nodejs/security-wg

@nodejs-github-bot nodejs-github-bot added build Issues and PRs related to build files or the CI. dependencies Pull requests that update a dependency file. needs-ci PRs that need a full CI run. labels Jan 20, 2026
@anonrig anonrig force-pushed the yagiz/experiment-with-cjs-lexer branch 3 times, most recently from ae6ab98 to 5e69495 Compare January 21, 2026 16:24
@codecov
Copy link

codecov bot commented Jan 21, 2026

Codecov Report

❌ Patch coverage is 78.84615% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.84%. Comparing base (98d2331) to head (d687c0a).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
src/node_cjs_lexer.cc 77.55% 8 Missing and 3 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #61456      +/-   ##
==========================================
- Coverage   89.85%   89.84%   -0.02%     
==========================================
  Files         671      672       +1     
  Lines      203166   203191      +25     
  Branches    39057    39060       +3     
==========================================
- Hits       182554   182549       -5     
- Misses      12967    12985      +18     
- Partials     7645     7657      +12     
Files with missing lines Coverage Δ
lib/internal/modules/esm/translators.js 92.58% <100.00%> (-0.39%) ⬇️
src/node_binding.cc 82.74% <ø> (ø)
src/node_builtins.cc 75.95% <ø> (-0.24%) ⬇️
src/node_metadata.cc 92.42% <100.00%> (ø)
src/node_cjs_lexer.cc 77.55% <77.55%> (ø)

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@anonrig anonrig force-pushed the yagiz/experiment-with-cjs-lexer branch 13 times, most recently from 9bfb358 to 1da16dd Compare January 21, 2026 19:44
@anonrig anonrig changed the title [DO NOT MERGE] experiment with commonjs-lexer build,deps: replace cjs-module-lexer with merve Jan 21, 2026
@anonrig anonrig requested a review from guybedford January 21, 2026 19:46
@anonrig anonrig force-pushed the yagiz/experiment-with-cjs-lexer branch 4 times, most recently from 33e84b7 to 66e99b4 Compare January 21, 2026 20:17
@anonrig anonrig force-pushed the yagiz/experiment-with-cjs-lexer branch from 66e99b4 to d687c0a Compare January 21, 2026 20:29
@anonrig anonrig requested a review from mcollina January 21, 2026 20:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Issues and PRs related to build files or the CI. dependencies Pull requests that update a dependency file. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants