如何确保npm传递依赖被直接安装在node_modules根目录下?
根本原因
npm、Yarn 等包管理器默认存在依赖提升(hoisting)机制:
- 当宿主项目或其其他依赖没有声明和你包中版本冲突的ESLint相关依赖时,你包的依赖会被提升到宿主项目根目录的
node_modules下 - 一旦存在版本冲突,包管理器会把冲突版本的依赖嵌套安装在你自己包的
node_modules子目录中
而ESLint默认只会从被检测项目的根目录出发,向上查找插件、解析器依赖,不会进入第三方包的深层依赖目录搜索,就会出现找不到依赖的报错。
你看到的「peerDependencies不会自动安装」是npm 6及更早版本的过时结论,npm 7(2021年正式发布)及之后的版本默认会自动安装peerDependencies,完全可以满足开箱即用的需求。
推荐实现方案
方案1:peerDependencies + require.resolve 兜底(兼容性最好,零用户配置)
这是目前ESLint生态共享配置包的通用标准做法,两步配置即可:
- 把所有ESLint、插件、解析器依赖从
dependencies移到peerDependencies,同时在peerDependenciesMeta中标记为非可选,保证npm 7+ 自动安装到宿主根目录:
{ "name": "@yamato-daiwa/style_guides", "version": "0.0.14", "peerDependencies": { "eslint": "8.18.0", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-node": "11.1.0", "eslint-plugin-vue": "9.1.1", "eslint-plugin-vue-pug": "0.5.2" }, "peerDependenciesMeta": { "eslint": { "optional": false }, "@typescript-eslint/eslint-plugin": { "optional": false }, "@typescript-eslint/parser": { "optional": false }, "eslint-plugin-import": { "optional": false }, "eslint-plugin-node": { "optional": false }, "eslint-plugin-vue": { "optional": false }, "eslint-plugin-vue-pug": { "optional": false } } }
- 在你包导出的ESLint配置文件中,用Node.js原生的
require.resolve方法指定所有解析器、插件的绝对路径,彻底绕开ESLint的依赖查找逻辑,不管依赖被装在什么位置都能准确定位:
// 你的包导出的eslint配置入口,比如index.js module.exports = { // 解析器用绝对路径 parser: require.resolve("@typescript-eslint/parser"), // 插件全部替换为绝对路径 plugins: [ "@typescript-eslint", "import", "node", "vue", "vue-pug" ].map(pluginName => { // 处理带scope的插件名 const pluginPackageName = pluginName.startsWith("@") ? pluginName : `eslint-plugin-${pluginName}`; return require.resolve(pluginPackageName); }), // 其余规则、extends配置正常编写即可 rules: { // 你的自定义规则 } }
这套组合方案不需要用户做任何手动配置,兼容npm 7+、Yarn 1/2/3、pnpm 所有主流包管理器,不会出现依赖找不到的问题。
不推荐的做法
- 不要把ESLint相关依赖放在
dependencies中:这种方式一旦宿主项目本身安装了其他版本的ESLint或相关插件,就会触发版本冲突导致依赖被嵌套,出现你现在遇到的问题。 - 不要要求用户手动修改.npmrc配置提升依赖:这违背了开箱即用的原则,会增加用户使用成本。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

