Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >NPM 7:这才算是真正的更新

NPM 7:这才算是真正的更新

作者头像
深度学习与Python
发布于 2020-12-18 08:34:46
发布于 2020-12-18 08:34:46
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

作者 | Fernando Doglio

译者 | 王强

策划 | 李俊辰

备受我们信赖的 NPM 上一次迎来重大更新后已经过了一段时间了。终于,在 Node 的最新版本(版本 15)中,我们等到了 NPM 的版本 7。这一版本对其内部架构进行了重大改进,并提供了一些非常有趣的新特性。

在本文中,我会介绍两个引起我注意并激发我的想象力的新特性。第一个特性会改变我们处理所有项目依赖项的方式,而第二个特性会优化一个之前必须手动完成的流程。

当然,我指的就是 工作区(workspaces) 和自动安装 对等依赖项(peer dependencies) 的能力。是不是来兴趣了?反正我心情很激动!

工作区

我最近分享了一篇文章,其中介绍了两种 NPM 客户端,它们都想要解决官方客户端当前实现中的一个主要问题:npm_modules 文件夹已经成为了一个磁盘空间黑洞。

https://blog.bitsrc.io/npm-clients-that-are-better-than-the-original-cd54ed0f5fe7

这两种选项都有自己的独特解决方案,但总体来说它们都会将所有模块保存在一个共享文件夹中,让各个项目之间能够更容易共享软件包。而随着 NPM 最新版本的发布和 Arborist 的引入(一个新项目,包含了负责遍历和分析 npm_modules 文件夹内模块目录树的逻辑),我们看到了官方对这种方法的回应:工作区

请注意,这并不是一个全新的概念,其他包管理器(例如 Yarn 和 pnpm)已经有了自己的工作区实现。因此,你可以说这只是官方的一个工作区版本而已。

这是什么?

你可以将它视为在预定义和通用上下文内的项目之间共享软件包的一种方式。这并不是说软件包是完全通用的,或者所有内容都要放进同一个下载位置。这个方案确实可以解决一遍又一遍地复制模块的麻烦,还能让你控制我们的模块要共享给哪些项目。

创建工作区后,你就可以明确地告诉 NPM,你的程序包将存放在何处。并且由于新版客户端可以感知工作区,因此它会正确安装依赖项,而不会复制那些通用的依赖。

使用其他包管理器时这个功能也非常有用。例如,可以在单个 NPM 工作区中管理的多个项目之间共享一个 Bit 组件。修改共享组件时,可以用工作区从多个项目中获得即时反馈(查看是否有哪里出现了中断)。

它向后兼容吗?

可惜不行!工作区不是区区配置更改那么简单,它还要求你用新的方式来构造项目。因此向后兼容是做不到的,你不能运行一条 npm 命令就一次性规范化 10 个项目。但是,你可以在重新考虑所有这些项目的结构并正确更改配置之后,将这些项目的依赖项重新安装到一个位置里,这样就可以对所有内容执行重复数据删除操作了。在我看来,这确实是一项巨大的进步!

这个新特性会强制你考虑工作区的实际结构,以及不同项目之间的相互关系,这还会帮助你改善项目的内部组织架构。

考虑下面的例子

有很多介绍工作区的文章,但它们提供的示例在我看来没什么用,所以这里我举一个例子,希望能对 Node.js 开发人员更有帮助。

考虑以下文件夹结构:

基本上,我们将要处理一组 REST API,其中每个 API 的实际代码都会放在“apis”工作区内,而通用代码和共享包将在“core”工作区。

我们如何做到这一点呢?了解了它的工作原理后,配置过程实际上非常简单。这里的重点是你需要在声明工作区的根级别(在 REST-APIS 文件夹内)定义一个 package.json 文件。准备好之后,你要做的就是在每个项目中都创建一个 package.json,并在其中声明其所需的依赖项。

然后,你从根文件夹运行 npm install,让 NPM 完成剩余的工作。下面是根文件夹中的 package.json 文件:

你要做的只有这些,你当然可以定义其他属性,但是对于这个新特性来说,“workspaces”键就足够了。在其中,你可以定义(如示例所示)一个路径列表(还有包含的通配符格式),这些路径引用了工作区所在的文件夹。

在这些文件夹中,你只需声明自己的 package.json 文件,而每个文件都声明它自己的依赖项。

你可以看到,各个 API 文件夹的 JSON 文件实际上区别只有名称和依赖项。core 文件夹也是如此,我们在其中将 Express 声明为其主要共享依赖项:

现在,我们可以从根文件夹运行 npm install,你觉得会发生什么呢?它将在一个通用的 node_modules 文件夹中安装所有这些工作区所需的所有内容。因此,重复的依赖项不会占用多份空间。

有了这些命令和文件夹结构后,你在根目录级别的 node_modules 文件夹中安装了所有三个模块(及其必需的依赖项)。但是,其层次结构内的任何文件都能访问所有这三个文件。

看看 apis/api2/ 文件夹中的这个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require('express')
const app = express()
const port = 3000
const winston = require("winston")
const flat = require("flat")
app.get('/', (req, res) => {
  res.send('Hello World!')
})
app.listen(port, () => {
  console.log(`Example API (#2) listening at http://localhost:${port}`)
})

它用上了所有三个依赖项,而在以前它本来是找不到它们的,这太棒了!

你需要工作区吗?

好吧,如果你正在处理的是单个项目,或者是一些互不相关的项目,那么工作区可能对你来说并没什么用途。它们的需求可能会随时改变,结果让工作区带来的好处烟消云散。

但是,如果你在参与团队中多个相关项目(也许你正在设计一个基于微服务的架构),那么工作区可能会是你非常需要的功能。如果你有一个包含 100 个微服务的架构,所有微服务都依赖同一组模块,那么你可以想想这个新特性会为你节省多少磁盘空间。这个特性的用武之地就是类似这样的场景!

PeerDependencies 自动安装

我今天要介绍的第二大特性就是它。之前我们必须手动安装对等依赖项,以后就用不着了。但是首先,到底什么是对等依赖项呢?

如果你不太熟悉这个术语(以前我也不熟),这里就简单介绍一下:对等依赖项和普通的依赖项几乎没什么区别,它们并没有定义一个严格的要求,而是声明:

  • 你的软件包与另一个模块的特定版本兼容。
  • 如果该模块已经安装并且是正确的版本,则不要执行任何操作。
  • 如果找不到该模块或版本存在冲突,则向开发人员显示一条消息,警告他们这一事实,此外什么也不做。

理论上讲这都没什么问题,但如果你要自动安装这些依赖项,那么当你添加两个具有相同依赖项但版本不同的软件包时,两个版本就会同时安装(其中一个位于常规的 node_modules 文件夹中,另一个作为需要它的包的子依赖项)。

这可能会导致不兼容的问题,想象一下,我们把依赖模块 B 的模块 A(模块 A 又依赖 React@15)添加到依赖 React@16 的项目中。因为 A 需要版本 15,所以它也将会把版本 15 添加为依赖项,最后依赖项树会变成这个样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- React@15
- A
- B
  +- React@16

也就是说你得安装两个不同版本的 React,仅仅因为你需要模块 A。但现在我们有了 Arborist,它可以分析整个树并考虑对等依赖,如果出现冲突它就会显示对应的错误信息,并且中止流程。本质上来说,NPM 现在替开发人员完成了这部分工作,并帮助后者决定是否安装这一对等依赖项。考虑到依赖管理的工作也许会浪费一整天的时间,这绝对是一个非常有用的功能。

以前你遇到过这样的坑吗?这个新特性是不是让你非常激动?

NPM 版本 7 已发布,其中包含一些新特性和改进。这两项特性尤其吸引了我的注意,我很快就去尝试它们了。当处理具有多个共享依赖项的大型组合项目时,工作区可以从根本上改善开发人员的体验。

对等依赖管理的改进肯定会为使用基于 NPM 的工具的 React 开发人员带来好处,因为这一特性在这个生态系统中是非常常用的。

你喜欢这些特性吗?还有哪些更新你觉得是很有用的?请在下方留言并分享你的看法。

延伸阅读

https://blog.bitsrc.io/npm-7-this-is-what-i-call-an-update-de17a34ab787


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
npm 依赖管理中被忽略的那些细节
? 这是第 66 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:npm 依赖管理中被忽略的那些细节 https://www.zoo.te
政采云前端团队
2020/08/26
2.6K0
npm 依赖管理中被忽略的那些细节
❤️作为开发人员你需要知道的 npm 命令❤️
此命令用于安装 npm 包和特定包所依赖的其他包。它将安装在本地node_modules文件夹中。
海拥
2021/08/23
1.1K0
❤️作为开发人员你需要知道的 npm 命令❤️
带你深入了解NPM——NPM初学者指南
前段时间,我们邀请了我们“城内”(葡萄城)资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课,在课程过程中有不少同学对于NPM的概念和用法有一些疑问,所以这次我们希望通过这篇文章来解答各位同学的问题。另外在介绍的基础上,我们还会适当的深入介绍下,如何在npm上发布第一个属于自己的包。那么,让我们马上开始吧!
葡萄城控件
2019/09/29
1.8K0
带你深入了解NPM——NPM初学者指南
nodejs npm常用命令
npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准。有了npm,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。
bear_fish
2018/09/19
1.4K0
npm命令完整使用指南
在我们的工作中,npm是我们会经常使用到的工具,比如我们在App自动化测试中使用到的appium,就是通过npm命令来安装的。但是有许多人表示,自己并不清楚npm命令的使用,本文就给大家介绍一下npm命令的使用。
霍格沃兹测试开发Muller老师
2024/04/24
2140
前端工程化 - 剖析npm的包管理机制(完整版)
现如今,前端开发的同学已经离不开 npm 这个包管理工具,其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区,理解其内部机制非常有利于加深我们对模块开发的理解、各项前端工程化的配置以加快我们排查问题(相信不少同学收到过各种依赖问题的困扰)的速度。
ConardLi
2019/12/19
3.1K0
使用Yarn workspace,TypeScript,esbuild,React和Express构建 K8S 云原生应用(一)
本文将指导您使用 K8S ,Docker,Yarn workspace ,TypeScript,esbuild,Express 和 React 来设置构建一个基本的云原生 Web 应用程序。在本教程的最后,您将拥有一个可完全构建和部署在 K8S 上的 Web 应用程序。
为少
2021/05/27
4.2K1
开发者必看:揭开 NPM 依赖管理的复杂面纱
今天聊一个很少被提及的话题 —— 「依赖管理」(Dependencies Management) 。
童欧巴
2024/04/17
9910
开发者必看:揭开 NPM 依赖管理的复杂面纱
monorepo--依赖
19年,团队沉淀了组件库、图表库、工具库等基础建设相关内容。上述的内容均为独立工程维护,起初我们采用 Git Subtree + npm install <folder> 来关联各个项目,带来了开发、调试的便利,同时也带了一些复杂性。
奋飛
2020/05/28
2.7K0
卸载 npm 软件包[通俗易懂]
卸载 npm 软件包 若要卸载之前在本地安装(在 node_modules 文件夹使用 npm install )的软件包,则从项目的根文件夹(包含 node_modules 文件夹的文件夹)中运行:
Java架构师必看
2022/04/11
2.1K0
使用NPM
Nodejs生态圈很强大,第一个原因就是NPM,因为全球有无数的程序员在NPM中贡献了自己的力量。
代码之风
2018/10/31
1.2K0
npm 入门教程
Node.js 的出现使得用 Javascript 写服务端应用成为可能。Node.js 由 C++ 编写而成并且构建于 V8 引擎之上,因此运行得很快。一开始,Node.js 只是想运行于服务端环境,但是开发者们显然不满足于此,开始创造各种工具来实现自动化任务。也因为此,基于 Node 的前端自动化工具(如Grunt, Gulp 和 Webpack)的出现也给前端开发带来了翻天覆地的变化。
疯狂的技术宅
2019/03/27
1.4K0
npm 入门教程
前端包管理工具与配置项
任何一个项目的构建离不开工具和统一的管理标准,在项目开发和维护过程中,我们需要了解安装包的相应工具和配置文件,以此来有效的进行项目的迭代和版本的更新,为项目提供基本的运行环境。
程序员海军
2023/11/07
5660
NPM的基本使用
小城故事
2024/08/24
1020
包管理工具
前端的包管理工具相信大家一定不会陌生,因为每天都需要跟他打交道,新项目或者刚拉下来的前端项目都需要去 install 依赖进行包的依赖安装,大家最熟悉的应该就是 npm 了,或者国内的 npm 镜像包 cnpm ,大家熟称为淘宝镜像
离殊
2022/04/01
2.8K0
包管理工具
npm常用命令
npm是什么,大家都应该很熟悉了。npm的常用命令很多,为了避免经常到npm官网查找,特将常用的npm命令整理下来。 npm install 包安装模块 本地安装 npm install expres
IMWeb前端团队
2017/12/29
1.6K0
npm常用命令
卸载npm和安装npm_使用`npm uninstall`卸载npm软件包「建议收藏」
To uninstall a package you have previously installed locally (using npm install <package-name> in the node_modules folder, run
全栈程序员站长
2022/07/25
3.4K0
关于现代包管理器的深度思考——为什么现在我更推荐 pnpm 而不是 npm/yarn?
很长时间没有更新原创文章了,但是还一直在思考和沉淀当中,后面公众号会更频繁地输出一些前端工程相关的干货,希望对大家有一些启发,也希望在实际的工作当中帮助大家提升效率。
用户3806669
2021/03/10
3.2K0
2018 年了,你还是只会 npm install 吗?
作者:rianma | 腾讯web前端开发工程师 nodejs 社区乃至 Web 前端工程化领域发展到今天,作为 node 自带的包管理工具的 npm 已经成为每个前端开发者必备的工具。但是现实状况是,我们很多人对这个nodejs基础设施的使用和了解还停留在: 会用 npm install 这里(一言不合就删除整个 node_modules 目录然后重新 install 这种事你没做过吗?) 当然 npm 能成为现在世界上最大规模的包管理系统,很大程度上确实归功于它足够用户友好,你看即使我只会执行 inst
Techeek
2018/03/26
6.6K7
了解可执行的NPM包
NPM是Node.js的包管理工具,随着Node.js的出现,以及前端开发开始使用gulp、webpack、rollup以及其他各种优秀的编译打包工具(大多数采用Node.js来实现),大家都开始接触到一些Node.js,发现了使用NPM来管理一些第三方模块会很方便。 大家搬砖的模式也是从之前的去插件官网下载XXX.min.js改为了npm install XXX,然后在项目中require或者import。
贾顺名
2019/12/09
1.4K0
相关推荐
npm 依赖管理中被忽略的那些细节
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验