First, see this popular question on StackOverflow, whose solution is now broken for some packages using Node ESM (with "type": "module" and an "exports" field that does not explicitly expose package.json).
The problem is that if a package has the following in package.json,
Then one can not use require() or require.resolve() to resolve package locations like the can with normal CommonJS packages.
For example, trying to run require.resolve('@scope/package/package.json') will fail with
Uncaught Error: Cannot find module '@scope/package/package.json'
In the repl you'll see a MODULE_NOT_FOUND message.
The package author would need to expose package.json for resolving to work:
I thought that exports was supposed to affect only import statements, but not require.
First, see this popular question on StackOverflow, whose solution is now broken for some packages using Node ESM (with
"type": "module"and an"exports"field that does not explicitly exposepackage.json).The problem is that if a package has the following in
package.json,{ "name": "@scope/package", ... "types": "dist/index.d.ts", "exports COMMENT:": "This removes 'dist' from import statements, as well as replaces the 'main' field. See https://github.com/nodejs/node/issues/14970#issuecomment-571887546", "exports": { ".": "./dist/index.js", "./": "./dist/" }, ... }Then one can not use
require()orrequire.resolve()to resolve package locations like the can with normal CommonJS packages.For example, trying to run
require.resolve('@scope/package/package.json')will fail withIn the repl you'll see a
MODULE_NOT_FOUNDmessage.The package author would need to expose
package.jsonfor resolving to work:{ "name": "@scope/package", ... "types": "dist/index.d.ts", "exports": { "./package.json": "./package.json", // <---- here ".": "./dist/index.js", "./": "./dist/" }, ... }I thought that
exportswas supposed to affect onlyimportstatements, but notrequire.