前端依赖问题解决方案
https://rsdoctor.dev/zh/blog/topic/duplicate-pkg-problem
Updated, moved to https://rsdoctor.dev/blog/topic/duplicate-pkg-problem
pnpm "workspace" ""
package.json hack
workspace react
{
"name": "a",
"dependencies": {
"react": "18.2.0"
}
}
`` node_modules
workspace
package.json
overrides pnpm "a>b":""
package.json
{
"pnpm": {
"overrides": {
"[email protected]>loose-envify": "1.0.0", // 1
"react>loose-envify": "1.0.0", // 2
"loose-envify": "1.0.0" // 3
}
}
}
1. "[email protected]>loose-envify": "1.0.0"
"[email protected]"
package.json
loose-envify
1.0.0 "dependencies" "devDependencies"
2. "react>loose-envify": "1.0.0"
react@*>loose-envify
"react@*"
(reactreact@16 react@17 react@18) package.json
loose-envify
1.0.0
3. "loose-envify": "1.0.0"
*>loose-envify
package.json
loose-envify
1.0.0 workspace
( monorepo )
** a>b>c
**
lockfile workspace
pnpm peer Hack SoonIter/pnpm-peer-trick
// package.json
"overrides": {
"react>loose-envify>js-tokens": "8.0.0", //
"react>loose-envify": "1.1.0", //
"[email protected]>js-tokens": "8.0.0",
}
.pnpmfile.cjs , overrides
hooks.readPackage(pkg, context): pkg | Promise<pkg> Allows you to mutate a dependency's package.json after parsing and prior to resolution.
function readPackage(pkg, context) {
if (pkg.name === 'react') {
pkg.dependencies["loose-envify"] = "1.0.0";
}
return pkg;
}
module.exports = {
hooks: {
readPackage,
},
};
workspace resolve bundler
react
{
"name": "c",
"dependencies": {
"react": "18.2.0",
"@babel/runtime": "7.21.0"
},
"license": "MIT"
}
const path = require('path');
module.exports = {
//...
resolve: {
alias: {
"@babel/runtime": path.resolve(__dirname, 'node_modules', '@babel/runtime'),
"react": path.resolve(__dirname, 'node_modules', 'react'),
},
},
};