使用 `peerDependency` 和 `devDependency` 的最佳实践

Best practices for using `peerDependency`and `devDependency`

我正在编写一个 React 组件库,不想捆绑 React,所以我将库添加到 peerDependencies 而不是 dependencies

此外,为了防止那些关于缺少 peerDependencies 的愚蠢警告,我将相同的库添加到 devDependencies 部分。

那不是 DRY,但固定警告对我来说比 DRY package.json 更重要。

所以问题是:是否有 DRYer 方法可以实现这一点,或者我是否真的遵循了 2020 年 5 月的最佳实践?

{
    "peerDependencies": {
        "react": "^16.9.0",
        "react-dom": "^16.9.0",
        "tslib": "^1.11.0",
    },
    "devDependencies": {
        "@types/react": "^16.9.0",
        "react": "^16.9.0",
        "react-dom": "^16.9.0",
        "typescript": "^3.8.0"
    },
    "dependencies": {
        // nothing here
    }
}

对于 npm >= v7,npm 宣布自动安装 peerDependency 个包。

因此,只需从 devDependencies 中删除 dep,如果它们已经列在 peerDependencies 部分中,如下所示:

{
    "peerDependencies": {
        "react": "^16.9.0",
        "react-dom": "^16.9.0",
        "tslib": "^1.11.0",
    },
    "devDependencies": {
        "@types/react": "^16.9.0",
        "typescript": "^3.8.0"
    },
    "dependencies": {
        // nothing here
    }
}

对于 npm < 7,请遵循@gcastros 的回答。

--

另请参阅: https://github.com/npm/rfcs/blob/latest/accepted/0025-install-peer-deps.md https://blog.npmjs.org/post/617484925547986944/npm-v7-series-introduction

我不确定您使用什么来创建捆绑包,但如果您使用的是 Webpack 或 Rollup,则可以定义不包含在捆绑包中的外部组件。

在您的照顾下,您在 peerDependencies 中拥有的所有内容都将进入 dependencies,并且在 webpack 或 rollup 的配置中,您将按如下方式定义外部:

{
  ...
  externals: ['react', 'react-doe', 'tslib'],
}