乱花迷人眼 - 一文彻底看懂 package.json 中的各种 dependencies

简介: package.json 中存在各种各样的依赖定义:dependencies、devDependencies、peerDependencies、optionalDependencies、bundleDependencies,很容易让初学的开发者晕头,到底有什么区别。

网络异常,图片无法展示
|

package.json 中存在各种各样的依赖定义:dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundleDependencies,很容易让初学的开发者晕头,到底有什么区别。

依赖主要涉及到两个场景:

  • 在当前项目的 package.json 中的依赖定义
  • 当前项目中安装的包中的 package.json 中的依赖定义

所以下面每个依赖项定义都会通过两个维度来讨论:定义在项目中和定义在依赖中。

dependencies

dependencies 表示该项目在运行时所需要用到的依赖项。

然而作为最常见的依赖项定义,经常会被不明所以的开发者误用(dependencies 一把梭 🤦‍♂️)。

定义在项目中

如果你开发的项目依赖于某个包来运行,那么你就可以选择将你所依赖的包添加到 dependencies 中。

install 时该依赖将会被下载,并可在项目的代码中使用。

定义在依赖中

当你开发一个项目需要用到一个 A 包时,假设 A 包的 dependencies 中存在如下定义:

{
    "dependencies": {
        "B": "*"
    }
}
复制代码

那你在项目中安装 A 包时,无论你的项目是否依赖 B 包,B 包都会作为 A 包的依赖同时被安装。

有些包的开发者可能会一股脑将各种依赖全部丢在包的 dependencies 中,这会导致开发者在使用该包时,会安装各种无用的包。

install 时该依赖会被下载,但是不应该在你的项目中直接引用该包,因为该包的安装路径会和包管理器行为相关,会导致幽灵依赖现象。

devDependencies

devDependencies 表示在开发时所需要用到的或依赖的包。

定义在项目中

如果你的项目在开发中依赖某个包,但是在运行时不依赖,则可以将该包添加到 devDependencies

install 时该依赖将会被下载,可以在代码中使用,但是请不要在项目要上线的代码中使用。

注意当 NODE_ENVproduction 时,install 等效于 install --productiondevDependencies 将不会被下载,这种场景一般常见于 node 项目中,比如开发时依赖测试库,但项目线上运行不需要安装测试库,但是一些前端项目在 CI/CD 中构建时可能会遇到问题,有些 CI/CD 中的 NODE_ENV 环境变量默认为 production,会导致在打包所需的依赖包不会被安装。

定义在依赖中

install 时依赖包中的 devDependencies 将会被忽略,不会被安装。

peerDependencies

peerDependencies 主要用于依赖包中,表示安装该包时还需要安装哪些包,乍一看非常类似 dependencies,不过场景和行为都存在一定差异。

定义在项目中

peerDependencies 主要用于依赖包中,在项目中不起作用。

installpeerDependencies 不会被安装,开发时一般会配合 devDependencies 来实现开发和发包时的版本解耦。

{
    "peerDependencies": {
        "react": "16 || 17 || 18"
    },
    "devDependencies": {
        "react": "16"
    }
}
复制代码

定义在依赖中

installpeerDependencies 不会安装,但是包管理器会检查项目的依赖与 peerDependencies 是否匹配,如果版本不匹配或未安装,将会弹出警告。

包开发将依赖定义在 peerDependencies 中来避免项目中和依赖包中出现重复安装包所导致的包版本不相容、打包了多份不同版本的库等问题。

此外通过 peerDependenciesMeta 可以让 peerDependencies 作为可选依赖项,让开发者可以有选择性的选择需要的包:

{
    "peerDependenciesMeta": {
        "soy-milk": {
            "optional": true
        }
    }
}
复制代码

optionalDependencies

optionalDependencies 用于定义可选依赖项,和 dependencies 非常类似,主要的差别在于:在 optionalDependencies 中的依赖包安装报错甚至找不到时不会影响到包管理器的安装行为。

定义在项目中

install 时会被安装,但是安装失败时不会中断安装行为,程序依旧可以正常运行。项目中使用时应该通过判定该包是否存在来决定所需要执行的代码。

定义在依赖中

install 时会被安装,但是安装失败时不会中断安装行为,程序依旧可以正常运行。

bundleDependencies/bundledDependencies

bundleDependencies 是一个较为特殊的依赖项定义,不同于其它依赖项定义,他的数据结构是一个数组,需要配合 dependencies 使用。

{
    "bundleDependencies": ["renderized", "super-streams"]
}
复制代码

bundleDependencies 在项目中不起作用,在项目作为包发布时通过 npm pack,将会把 bundleDependencies 中的依赖包的本地代码和该项目包一起打包成一个文件。

install 时通过 url 指定 pack 打包好的文件,将会将文件中打包的依赖解压到包目录,而不会去根据 dependencies 中的定义去安装 bundleDependencies 中的包。

总结

简单总结下所有依赖的安装行为和使用场景:

依赖类型 定义在项目中 定义在依赖中 一句话总结 举例
dependencies 会被安装 会被安装 定义包运行所需要的依赖包 某前端项目使用 react 进行开发,需要将 react 添加到 dependencies
devDependencies 会被安装 不会被安装 定义包在开发时所需要的依赖包 antd 使用了 @testing-library/react 进行测试,需要将 @testing-library/react 添加到 devDependencies
peerDependencies 不会被安装 不会被安装,但是如果指向的依赖没有被安装或不符合时会有警告(peerDependenciesMeta 会影响该行为) 定义该包运行所需要的依赖环境,一般和 devDependencies 一起使用 antd 是一个 react 组件库,为了不和使用它的项目中的 react 版本定义造成冲突,需要将支持的 react 版本添加到 peerDependencies
optionalDependencies 会被安装,但是安装报错不会影响 会被安装,但是安装报错不会影响 optionalDependencies 用于定义对包运行不会造成影响的依赖包 一个包在使用 A 包进行了某些操作,但是如果 A 包不在的话,可以使用别的 API 达到同样的效果,可以将 A 包添加到 optionalDependencies
目录
打赏
0
0
0
0
5
分享
相关文章
Package.json中dependencies依赖包中^符号和~符号前缀的区别
刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比较好的答案所以在此mark下 ~,^的区别是 ~的意思是匹配最近的小版本 比如~1.
1539 0
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
62 0
|
12天前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
37 0
|
12天前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
38 0
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
162 83
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等