本文应该作为Node.js最喜欢的伙伴:npm的多合一基本指南。
自2009年以来,Node.js一直席卷全球。使用Node.js构建了成千上万的系统,这促使开发人员社区宣称“ JavaScript正在吞噬软件”。
Node成功的主要因素之一是npm-它受欢迎的软件包管理器,它使JavaScript开发人员可以快速方便地共享有用的软件包,例如lodash和moment。
在撰写本文时,npm促进了130万个软件包的发布,每周下载量超过160亿个!这些数字对于任何软件工具都非常有用。现在,让我们讨论一下npm到底是什么。
什么是NPM?
NPM(或“节点程序包管理器”)是JavaScript运行时Node.js的默认程序包管理器。
它也被称为“忍者南瓜突变体”,“非营利比萨饼制作者”,以及许多其他随机名称,您可以在npm-expansions上进行探索,甚至可以做出贡献。
NPM由两个主要部分组成:
一个用于发布和下载软件包的CLI(命令行界面)工具,以及
托管JavaScript程序包的在线存储库
为了获得更直观的解释,我们可以将存储库npmjs.com视为一个实现中心,该中心从卖家(npm包裹的作者)那里接收商品的包裹,并将这些商品分发给买方(npm包裹的用户)。
为了促进此过程,npmjs.com履行中心雇用了一群勤劳的袋熊(npm CLI),他们将被分配为每个npmjs.com客户的个人助理。因此,依赖项将交付给JavaScript开发人员,如下所示:
为您的JS伙伴发布软件包的过程如下:
让我们看看这只袋熊如何协助想要在项目中使用JavaScript包的开发人员。我们还将看到它们如何帮助开源向导将其出色的库推向世界。
package.json
JavaScript中的每个项目(无论是Node.js还是浏览器应用程序)都可以归类为npm软件包,并具有自己的软件包信息和package.json描述项目的工作。
我们可以将其package.json视为我们袋熊部队运送的npm好盒子上的加盖标签。
package.json将在npm init运行以初始化JavaScript / Node.js项目时生成,其中包含开发人员提供的以下基本元数据:
name:您的JavaScript库/项目的名称
version:项目的版本。通常,在应用程序开发中,由于显然没有必要对开源库进行版本控制,因此经常忽略该领域。但是,它仍然可以作为部署版本的来源方便使用。
description:项目说明
license:项目的许可证
npm脚本
package.json还支持scripts可定义为运行安装在项目本地上下文中的命令行工具的属性。例如,scripts一个npm项目的一部分可能看起来像这样:
{
"scripts": {
"build": "tsc",
"format": "prettier --write **/*.ts",
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
"pack": "ncc build",
"test": "jest",
"all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
}
}
有eslint,prettier,ncc,jest不一定安装为全球的可执行文件,而是为您的本地项目中node_modules/.bin/。
最近引入的npx允许我们node_modules通过前缀npx ...(ie npx prettier --write **/*.ts)来像全局安装的程序一样运行这些项目范围的命令。
依赖vs开发依赖
这两个以键值对象的形式出现,其中npm库的名称为键,其语义格式的版本为值。这是来自Github的TypeScript Action模板的示例:
{
"dependencies": {
"@actions/core": "^1.2.3",
"@actions/github": "^2.1.1"
},
"devDependencies": {
"@types/jest": "^25.1.4",
"@types/node": "^13.9.0",
"@typescript-eslint/parser": "^2.22.0",
"@zeit/ncc": "^0.21.1",
"eslint": "^6.8.0",
"eslint-plugin-github": "^3.4.1",
"eslint-plugin-jest": "^23.8.2",
"jest": "^25.1.0",
"jest-circus": "^25.1.0",
"js-yaml": "^3.13.1",
"prettier": "^1.19.1",
"ts-jest": "^25.2.1",
"typescript": "^3.8.3"
}
}
这些依赖关系通过npm install带有--save和--save-dev标志的命令安装。它们分别用于生产和开发/测试环境。在下一部分中,我们将更深入地研究这些软件包的安装。
同时,重要的是要了解语义版本之前可能出现的符号(假设您已阅读semvermajor.minor.patch模型):
^:最新的次要版本。例如,如果^1.0.4规范1.3.0是1主要系列中的最新次要版本,则该规范可能会安装。
~:最新的修补程序版本。与^次要版本相同,如果~1.0.4规范1.0.7是1.0次要系列中的最新次要版本,则可以安装规范。
所有这些确切的软件包版本都将记录在生成的package-lock.json文件中。
package-lock.json
该文件描述了npm JavaScript项目中使用的依赖项的确切版本。如果package.json是通用描述性标签,package-lock.json则是成分表。
就像我们通常不阅读产品的成分表(除非您太无聊或需要知道)一样,package-lock.json也不意味着开发人员逐行阅读(除非我们不顾一切地解决“在我的机器上工作”问题。
package-lock.json通常是由npm install命令生成的,也可以由我们的NPM CLI工具读取,以确保使用复制项目的构建环境npm ci。
如何有效地命令NPM袋熊作为“买方”
从前面提到的130万个发布的软件包中,有160亿次下载,可以推断出,大多数npm用户都朝着这个方向使用npm。因此,很高兴知道如何使用这个强大的工具。
npm安装
这是当今我们开发JavaScript / Node.js应用程序时最常用的命令。
默认情况下,npm install <package-name>将安装带有^版本符号的软件包的最新版本。一个npm install与NPM项目的范围内将软件包下载到该项目的node_modules按文件夹package.json规格,升级包版本(进而再生package-lock.json),无论它可以根据^和~版本匹配。
-g如果要在全局上下文中安装程序包,可以在机器的任何地方使用它,则可以指定一个全局标志(这对于命令行工具程序包(如live-server)很常见)。
npm使安装JavaScript软件包非常容易,以至于经常错误地使用此命令。这导致npm成为许多程序员的笑话的屁股:
这是--production救助旗帜的地方!在上一节中,我们分别讨论了在生产和开发/测试环境中的使用情况,dependencies并devDependencies打算分别在其中使用。此--production标志是如何产生差异的node_modules。
通过将此标志附加到npm install命令,我们将仅从安装软件包dependencies,从而极大地减小node_modules了应用程序的大小,这对于启动和运行应用程序是绝对必要的。
就像男孩和女童子军一样,我们没有将柠檬榨汁器带到我们的柠檬水摊位,就像我们不该将devDependencies其投入生产!
npm ci
因此,如果npm install --production对于生产环境是最佳的,是否必须有一个对于我的本地开发,测试设置最理想的命令?
答案是npm ci。
就像package-lock.json项目中不存在的项目一样,它在每次npm install调用时都会生成,它npm ci会消耗此文件来下载项目所依赖的每个软件包的确切版本。
这样,无论是用于开发的笔记本电脑还是Github Actions等CI(连续集成)构建环境,我们都可以确保项目上下文在不同机器上保持完全相同。
npm审核
由于已经发布了许多软件包并且可以轻松安装它们,因此npm软件包容易受到恶意作者的恶意攻击,这些恶意作者具有此类意图。
意识到有一个在生态系统中的问题,npm.js组织想出了这个主意的npm audit。他们维护了一个安全漏洞列表,开发人员可以使用此npm audit命令来审核其依赖项。
npm audit向开发人员提供有关漏洞以及是否有要修复的版本的信息。例如,
如果补救措施在下一个不间断的版本升级中npm audit fix可用,则可用于自动升级受影响的依赖项的版本。
如何有效地命令NPM袋熊成为“卖方”
我们已经经历了如何将NPM CLI工具用作使用者,但是如何有效地将其用作作者(又有可能成为JavaScript开源向导
2023-03-22 10:04:19