Documentation update to recommend `node`/`default` conditions over `require`/`import`.
The issue suggests updating the Node.js documentation to recommend using `node`/`default` conditions instead of `require`/`import` to avoid dual package hazards. The change involves modifying the packages.md file. The main blocker is the maintainer's concern about documenting opinionated practices that may soon be obsolete.
https://nodejs.org/api/packages.html#dual-package-hazard
Publishing packages with dual CommonJS and ESM sources, while has the benefits of supporting both CJS consumers and ESM-only platforms, is known to cause problems because Node.js might load both versions. Example:
package.json | foo.cjs | foo.mjs |
|---|---|---|
|
|
|
package.json | bar.js |
|---|---|
|
|
// my app
import { object as fooObj } from "foo";
import { object as barObj } from "bar";
console.log(fooObj === barObj); // false?????
The two suggested solutions boil down to "even when you have an ESM entrypoint, still use only CJS internallly". This solves the dual package hazard, but completely defeats the cross-platform benefits of dual modules.
If foo instead used these export conditions:
{
"name": "foo",
"exports": {
"node": "./foo.cjs",
"default": "./foo.mjs"
}
}
Then:
node version (if they are configured to target Node.js) or the default version (if they are configured to target other platforms).We have been using this node/default patter
Claim this issue to let others know you're working on it. You'll earn 10 points when you complete it!