You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保npm传递依赖被直接安装在node_modules根目录下?

根本原因

npm、Yarn 等包管理器默认存在依赖提升(hoisting)机制:

  • 当宿主项目或其其他依赖没有声明和你包中版本冲突的ESLint相关依赖时,你包的依赖会被提升到宿主项目根目录的node_modules下
  • 一旦存在版本冲突,包管理器会把冲突版本的依赖嵌套安装在你自己包的node_modules子目录中

而ESLint默认只会从被检测项目的根目录出发,向上查找插件、解析器依赖,不会进入第三方包的深层依赖目录搜索,就会出现找不到依赖的报错。

你看到的「peerDependencies不会自动安装」是npm 6及更早版本的过时结论,npm 7(2021年正式发布)及之后的版本默认会自动安装peerDependencies,完全可以满足开箱即用的需求。

推荐实现方案

方案1:peerDependencies + require.resolve 兜底(兼容性最好,零用户配置)

这是目前ESLint生态共享配置包的通用标准做法,两步配置即可:

  1. 把所有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 }
  }
}
  1. 在你包导出的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:54:21