Repository navigation
[Replacement]: semver #831
Description
Activity
I'm not a fan of
semverpackage after a day when they broke semver in their own package, but here you are forced to load the full package even if you need one simple helper when insemveryou can load only required.Even when loaded in its entirety, verkit starts up remarkably quickly.
semver’s sleight of hand is that, while it may appear to load only one or two functions, it actually pulls in many additional files. Reading those files from disk incurs extra overhead, making a partial semver import slower than loading all of verkit.
Simple benchmark:
semver
console.time('loading semver.parse') const parse = require('semver/functions/parse.js') const eq = require('semver/functions/eq.js') console.timeEnd('loading semver.parse') console.log( 'Loading files', Object.keys(require.cache).map((k) => k.replace(__dirname, '')), )
loading semver.parse: 3.273ms Loading files [ '/main.cjs', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js', '/node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js' ]verkit
console.time('loading verkit') const { parse, eq } = require('verkit') console.timeEnd('loading verkit') console.log( 'Loading files', Object.keys(require.cache).map((k) => k.replace(__dirname, '')), )
loading verkit: 2.06ms Loading files [ '/main.cjs', '/node_modules/.pnpm/verkit@0.2.0/node_modules/verkit/dist/index.js' ]Reacted by Roman and João Ferreirai'm generally agreed with this move but i'd like to see some more usage in the wild first.
it gained adoption very quickly thanks to your effort @sxzz , but that is different to natural adoption over time. i'd prefer to revisit in a couple of weeks at least when it has been running in prod a while.
Reacted by Roman and João Ferreiraverkitis now over 2 weeks old so I think it's a good time to revisit it nowReacted by Kevin Deng and João FerreiraYeah! Babel team just approved the PR of migrating to verkit: babel/babel#18145
Reacted by RomanWe merged the PR in Babel. I have been looking for so long for a
semveralternative that this is a very welcome package.Reacted by Roman and Kevin DengReacted by João Ferreira and Kevin DengIt has a much smaller bundle size for web apps
- addedacceptedUsed to signal if a suggested replacement has been accepted.Used to signal if a suggested replacement has been accepted.
on Aug 9, 2026
Package to replace
semverSuggested replacement(s)
verkit
Manifest type
preferred (lighter or more modern alternative package)
Rationale
verkit is a modern SemVer toolkit designed for ESM and TypeScript projects. It follows node-semver semantics while providing:
@types/semverThe README includes a detailed migration guide from node-semver, including mappings for renamed or reshaped APIs.
verkit is already being adopted by several projects, including Nuxt, tsdown, bumpp, npmx, and Nuxt DevTools. The migration progress is tracked in e18e/ecosystem-issues#277.
This is not a completely drop-in replacement: verkit is ESM-only and does not provide node-semver's CommonJS entry point, CLI, or
NODE_DEBUG=semveroutput. It is therefore best suited to modern ESM projects whose node-semver usage is covered by verkit.Availability
Not applicable; this is a package replacement rather than a native API.
Code example (optional)