如何从 NPM 项目中删除可选的对等依赖?

Chr*_*olf 5 npm peer-dependencies

我正在参与构建一个曾经使用node-sass. sass我们同时迁移到,但我们仍然保留node-sass在我们的package-lock.json. 我想解决这个问题。

\n

一开始,我们有这样的事情

\n
$ npm ls node-sass\ncookbook@0.9.13 /home/private/Documents/Projekte/nextcloud-apps/nextcloud-app-dev/volumes/custom_apps/cookbook\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node-sass@7.0.1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\xac sass-loader@13.0.2\n  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 node-sass@7.0.1 deduped\n
Run Code Online (Sandbox Code Playgroud)\n

好的,让我们通过调用来删除依赖关系npm uninstall node-sass。结果是

\n
$ npm ls node-sass\ncookbook@0.9.13 /home/private/Documents/Projekte/nextcloud-apps/nextcloud-app-dev/volumes/custom_apps/cookbook\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\xac sass-loader@13.0.2\n  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 node-sass@7.0.1\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白原因,为什么sass-loader仍然取决于node-sass。好吧,让我们仔细看看:

\n
$ npm why node-sass\nnode-sass@7.0.1 optional peer\nnode_modules/node-sass\n  peerOptional node-sass@"^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" from sass-loader@13.0.2\n  node_modules/sass-loader\n    sass-loader@"^13.0.2" from the root project\n    peer sass-loader@"^13.0.1" from @nextcloud/webpack-vue-config@5.3.0\n    node_modules/@nextcloud/webpack-vue-config\n      dev @nextcloud/webpack-vue-config@"^5.0.0" from the root project\n
Run Code Online (Sandbox Code Playgroud)\n

现在我有点惊讶了。该包node-sass仅作为对等依赖项安装。那么,为什么要安装它呢?我认为对等依赖的想法是允许根项目选择正在使用的版本。

\n

而且,它只是可选的。因此,它应该能够删除它(最终在删除过程中可能会出现警告,但没什么严重的)。

\n

我没有处理这个@nextcloud/webpack-vue-config包裹。它只是 Web 应用程序的开发依赖项。因此,NPM 不应将其安装node-sass为我的任何依赖项的开发依赖项。

\n

如何node-sass从我的项目中删除该包package-lock.json它仍然锚定在每个构建上package-lock.json,因此安装在每个构建上。

\n

我可以使用--no-optionalCLI 选项npm跳过所有可选依赖项。我不想那样做。这样做的“问题”是 GitHub 依赖项检查器不会将该node-sass模块视为已跳过并继续抱怨。此外,其他可选依赖项也可能会被跳过,尽管我们希望拥有它们。

\n

小智 4

前几天我用 node-sass 和 sass-loader 遇到了这个问题。

@nextcloud/webpack-vue-config对我来说,简单的解决方案是从我的 package.json 中删除,npm install然后将其放回去并重新运行npm install

这足以让内部结构重置以使node-sass消失。