This reproduce provide a sample project for issue:
Package B
importsPackage A (1.0.0)
Package C
importsPackage A (2.0.0)
The node_modules
inside project
folder are created to mimic how npm
may construct the tree to allow for correct module resolution.
project
├── index-b.js
├── index-c.js
└── node_modules
├── package-a
│ ├── a.js
│ └── package.json
├── package-b
│ ├── b.js
│ └── package.json
└── package-c
├── c.js
├── node_modules
│ └── package-a
│ ├── a.js
│ └── package.json
└── package.json
./build.mjs
contains 3 build steps:
default
- esbuild's default resolutionresolve-default
-@esbuild-plugins/node-resolve
default resolutionresolve-project-directory-as-basedir
-@esbuild-plugins/node-resolve
with project directory as basedir
Result are generated into dist
folder.
Observe index-c.js
for each test in the respective dist
folder.
Notice the value of a_default
.
(() => {
// project/node_modules/package-c/node_modules/package-a/a.js
var a_default = "node_modules/package-c/node_modules/package-a/a.js";
// project/node_modules/package-c/c.js
var c_default = `node_modules/package-c/c.js --> ${a_default}`;
// project/index-c.js
console.log("PackageC");
console.log(c_default);
})();
(() => {
// project/node_modules/package-a/a.js
var a_default = "node_modules/package-a/a.js";
// project/node_modules/package-c/c.js
var c_default = `node_modules/package-c/c.js --> ${a_default}`;
// project/index-c.js
console.log("PackageC");
console.log(c_default);
})();
Node's module resolution can also be directly validated using the following command:
node .\project\index-c.js
output:
PackageC
node_modules/package-c/c.js --> node_modules/package-c/node_modules/package-a/a.js
- apply modification
- use node 20
- rebuild
npx yarn
node build.mjs