#包管理工具的功能 处理和编写元数据 批量安装或更新所有依赖项 添加、更新和删除依赖项 运行脚本 发布软件包 进行安全审查 #简史 第一个发布的软件包管理器是 npm ,早在 2010 年就已经存在了。...node_modules 不同的依赖解析算法,嵌套 VS 扁平化 不同的安全问题 不同的锁文件格式,有性能影响 在磁盘上存储包的不同方式,对磁盘空间有效率影响 对多包(单一代码库)项目的不同支持 不同程度的可配置性和灵活性...中存储依赖项、自定义脚本、公共和私有包注册等概念都是 npm 引入的 #Yarn (v1) Yarn 是 Facebook 宣布与谷歌和其他一些公司开发新的软件包管理器,主要解决 npm 当时存在的一致性...这是通过 node_modules 层实现的,使用符号链接创建一个嵌套的依赖关系结构,其中文件夹中的每个包都是到存储的硬链接。 这是为什么 pnpm 会在快速和磁盘效率上有大幅提升的原因。...依赖管理 #依赖结构 安装依赖时的原理: 将依赖包的版本区间解析为某个具体的版本号 下载对应版本依赖的 tar 包到本地离线镜像 将依赖从离线镜像解压到本地缓存 将依赖从缓存拷贝到当前目录的 node_modules
,后面我们会针对npm的发展历史中存在的问题 来对比说明,pnpm的提出动机,pnpm 的优势在哪里,为什么具备这些优势。...npm v1/v2 嵌套依赖 最开始其实没有注重npm包的管理,只是简单的嵌套依赖,这种方式层级依赖结构清晰 但是随着npm包的增多,项目的迭代扩展,重复包越下载越多,造成了空间浪费,导致前端本地项目node_modules...如下图所示,A 的依赖项C 被提升到了顶层,如果后续有安装包,也依赖C,会去上一级的node_modules查找,如果有相同版本的包,则不会再去重复下载,直接从上一层拿到需要的依赖包C 说明:为什么自己的...通过package-lock.json,保障了依赖包安装的确定性与兼容性,使得每次安装都会出现相同的结果。...pnpm 弊端 调试问题 所有项目引用的包都在全局一个地方,如果想对某个包进行调试,其他项目正好引用了,本地运行也会收到影响。
它将安装在本地node_modules文件夹中。...它将完全卸载 node_modules 文件夹中已经存在的包。如果包提及不存在package.json列表或node_modules文件夹,它不会做任何事情。...确保 npm 注册表、registry.npmjs.com 或其他使用注册表 API 的服务可用。 使用 npm、node_modules(本地和全局)的目录存在并且可由当前用户写入。...npm install -g nodemon npm update -g nodemon -g 指定全局。如果-g不指定,包将默认安装在本地,项目目录外无法访问。...此外,您可以 package.json 在创建文件时将项目的元信息添加到文件中。
不管是 npm3 还是 yarn 都采用扁平化的 node_modules 文件夹方式,以此避免引入层级过深、相同依赖版本重复等问题。 随着公司业务不断壮大,团队支撑的项目越来越多。...由于依赖是跟随项目的,导致磁盘空间占用严重。 由于上述原因,开始尝试使用 pnpm 来进行管理。...节约磁盘空间 pnpm 依赖项将存储在一个全局内容可寻址的仓库中(${os.homedir}/.pnpm-store),具体项目中使用依赖采用硬链接方式,而不是进行复制。...对于每个模块的每个版本只保留一个副本。如:本地有10个项目依赖相同 vue 版本,如果使用 npm 或 yarn 时本地磁盘需要有 10 个 vue 的副本;而 pnpm 只有1个。...如果你用到了某依赖项的不同版本,那么只会将有差异的文件添加到仓库(公共仓库)。 所有文件都会存储在硬盘上的同一位置。
这只是最简单的例子,实际的工程项目中,依赖树不可避免地会有很多层级,很多依赖包,其中会有很多同名但版本不同的包存在于不同的依赖层级,对这些复杂的情况, npm 3 都会在安装时遍历整个依赖树,计算出最合理的文件夹安装方式...B 在一个月后根据它执行 npm install 所得到的 node_modules 结果很可能许多包都存在不同的差异,虽然 semver 机制的限制使得同一份 package.json 不会得到大版本不同的依赖包.../node_modules/.bin/ 目录添加到执行环境的 PATH 变量中,因此如果某个命令行包未全局安装,而只安装在了当前项目的 node_modules 中,通过 npm run 一样可以调用该命令...所以这里就引出了一个最佳实践: 将项目依赖的命令行工具安装到项目依赖文件夹中,然后通过 npm scripts 调用;而非全局安装 举例而言 webpack 作为前端工程标配的构建工具,虽然我们都习惯了全局安装并直接使用命令行调用...6.3 node 版本约束 虽然一个项目的团队都共享了相同的代码,但每个人的开发机器可能安装了不同的 node 版本,此外服务器端的也可能与本地开发机不一致。
包基本上是包含您需要的代码的文件夹,您可以在本地或全局安装它。 本地安装 本地安装意味着您实际上将文件下载到项目的文件夹中。在其中,您将找到一个您未创建的目录,称为“node_modules”。...全局安装的包不会添加到package.json文件中,那么既然不会添加到package.json中,那么为什么要安装全局安装呢?...例如,mocha要求您在全局和本地安装它,以便拥有一个名为“mocha”的CLI工具,并能够在本地项目上运行测试。 全局包在需要添加到PATH环境变量的常规路径中创建符号链接(或快捷方式)。...ci:几乎与npm install用于自动化环境(例如持续集成过程)相同。此命令比此命令更严格,install并确保安装始终是干净的(如果存在,它会自动删除node_modules文件夹)。...如果您不希望每次运行此命令时都安装最新版本,则还可以指定要安装的版本(对于自动环境(如CI / CD)尤其有用)。 ls:列出当前项目的所有已安装软件包。您可以列出全局包或本地安装的包。
npm 引入了文件和元数据字段,将依赖项列表存储在 package.json 文件中,并且将下载的文件保存到 node_modules 文件夹中。...pnpm 和 npm, yarn的管理策略不同,它通过引入内容可寻址存储来提升性能。通过生成嵌套的 node_modules 文件夹,每个版本的依赖项仅仅物理存储一次,节省了大量磁盘空间。...pnpm pnpm 项目的初始状态看起来就像一个 npm 项目一样,也是有 package.json 文件 和 node_modules 文件夹,不同的是在 node_modules 文件夹中, 它有自己的文件夹目录...此外,对于一些全局命令,如果不存在,它会自动下载安装到一个临时目录,然后使用,不会污染全局空间。 结论 包管理器的当前状态非常好。我们几乎在所有主要的包管理器中实现了功能平等。...但是,它们在引擎盖下确实存在很大差异。 pnpm 起初看起来像 npm,因为它们的 CLI 用法相似,但管理依赖项却大不相同;pnpm 的方法带来更好的性能和最佳的磁盘空间效率。
中所填写的name字段 global 与 local 的区别 因为npm link执行的特性,会将global+local的依赖都进行安装,所以在使用上不太好体现出两者的差异,所以我们决定将代码直接拷贝到.../server.js" } } 两者混用会带来的问题 这样的项目在你本地使用是完全没有问题的,但是如果有其他的同事需要运行你的这个项目,在第一步执行npm start时就会出异常,因为他本地可能并没有安装...,koa模块是没有问题的,因为都是存在于这些路径下的node_modules,而express则只存在于/node_modules/test-util/node_modules下,全局调用下...# 执行脚本所处的位置 └── # 本地的项目 ├── node_modules │ └── express └─...所以这也从侧面说明了为什么webpack可以直接在自己的文件中引用并不存在于自己模块下的依赖。
尽管它使安装速度更快,并且具有一些不错的新功能,但它使用与npm相同的平面node_modules结构(自版本 3 起)。扁平化的依赖树带来了一系列问题(具体后面会讲) 为什么叫pnpm?...嵌套安装 在 npm@3 之前,node_modules结构是干净、可预测的,因为node_modules 中的每个依赖项都有自己的node_modules文件夹,在package.json中指定了所有依赖项...通过前面的讲解,我们知道了pnpm在全局通过Store来存储所有的node_modules依赖,并且在.pnpm/node_modules中存储项目的hard links,通过hard link来链接真实的文件资源...语义化版本 前端中的包应该遵循语义化版本(也称为“semver”,来源于荷兰语)规范。当你从registry安装package时,它将会使用语义化的版本添加到项目的package.json中。...33] lerna version 更改自上次发布以来的包版本号 前往[34] lerna bootstrap 将本地包链接在一起并安装剩余的包依赖项 前往[35] lerna list 列出本地包 前往
每次安装新的包时,npm会遍历依赖树并创建相应的子目录来存放每个依赖包。 缓存机制:npm有本地缓存机制,用于加快重复安装的速度,但它并不像Yarn那样强制一致性的全局缓存。...当多个项目共享相同依赖时,这些依赖可能会在每个项目的node_modules目录下单独复制一份。...这种机制通过store(存储)目录集中管理所有的包版本,极大程度上减少了磁盘空间的占用。 高效的安装与卸载:pnpm在安装时能够识别出哪些包已经存在于全局存储中,并通过硬链接指向它们,而非复制文件。...install yarn add/install pnpm install 缓存机制 本地缓存每个项目的依赖 共享缓存,保证多个项目间的依赖版本一致 共享存储层缓存,避免重复下载 安装速度 相对较慢,...尤其在网络不佳时 快于npm,支持并行安装 更快,充分利用磁盘空间和网络资源 磁盘空间占用 每个项目下的node_modules有完整副本,占用较多空间 同一依赖只在全局缓存一份 利用符号链接进一步减少磁盘占用
#显示模块详情 npm update #升级当前目录下的项目的所有模块 npm update express #升级当前目录下的项目的指定模块 npm update -g express #升级全局安装的...可以执行两种安装类型: 本地安装 默认情况下,输入命令 npm install 命令时,软件包会安装到当前文件树中的 node_modules 子文件夹下 # npm 还会在当前文件夹中存在的 package.json...文件的 dependencies 属性中添加 less 条目 npm install less 全局安装 使用 -g 标志可以执行全局安装 npm install -g less npm 不会将软件安装到本地文件夹下...# 项目的根目录下执行 $ node-modules/.bin/mocha --version npx 就是想解决这个问题,让项目内部安装的模块用起来更方便,只要像下面这样调用就行了。...npx mocha --version npx 的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在。
为什么要使用 NPM npm 是随同 Node.js 一起安装的包管理工具,能解决 Node.js 代码部署上的很多问题,常见的场景有以下几种: 允许用户从 npm 服务器下载别人编写的第三方包到本地使用...“本地安装”指的是将一个模块下载到当前项目的 node_modules 子目录,然后只有在项目目录之中,才能调用这个模块。...本地模式和全局模式的特点如下: 模式 可通过 require 使用 注册 PATH 本地模式 是 否 全局模式 否 是 # 本地安装 $ npm install # 全局安装...,npm install 会先检查,node_modules 目录之中是否已经存在指定模块。.../node_modules/.bin 创建全局链接 npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间创建符号链接。
[安装在全局的特点] 1.所有的项目都可以使用这个模块 ->容易导致版本冲突 ->安装在全局的模块,不能基于CommonJS模块规范调取使用(也就是不能在JS中通过REQUIRE调取使用) [安装在本地的特点...npm root / -g 查看本地项目或者全局环境下,NPM的安装目录 安装在全局目录下的模块,但部分都会生成一个xxx.cmd的文件,只要有这个文件,那么xxx就是一个可执行的命令(例如:yarn.cmd...可以,但是需要配置package.json中的scripts 1.把模块安装在本地,如果是支持命令操作的(会在node_modules的bin中生成xxx.cmd的命令文件,只不过这个文件无法在全局下执行...(执行脚本)执行 ->执行脚本的时候,会到本地node_modules中的bin文件加查找,没有的话,在向NPM安装的全局目录下查找 3.NODE入门 NODE本身是基于CommonJS模块规范设计的.../xxx 再或者 /xxx,这种自己制定路径的模式,都是为了导入自定义的模块,换句话说,想要导入自定义的模块,必须加路径 require('xxx') 首先到当前项目的node_modules
写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过;如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本文...//全局安装 npm install -g webpack //安装到你的项目目录 npm install --save-dev webpack 正式使用Webpack前的准备 在上述练习文件夹中创建一个...package.json文件已经就绪,我们在本项目中安装Webpack作为依赖包 // 安装Webpack npm install --save-dev webpack 回到之前的空文件夹,并在里面创建两个文件夹...node_modules中的地址,继续上面的例子,在终端中属于如下命令 //webpack非全局安装的情况node_modules/.bin/webpack app/main.js public/bundle.js...现在如果你需要打包文件只需要在终端里你运行webpack(非全局安装需使用node_modules/.bin/webpack)命令就可以了,这条命令会自动参考webpack.config.js文件中的配置选项打包你的项目
首先,要了解为什么要做出一个有趣的决定,我们需要看一下 javascript 中包管理的历史。 npm 出现之前:前端依赖项是保存到存储库中并手动下载的?...2012-2016:前端项目的依赖项数量成倍增加? 2012-2016:构建和安装前端应用变得越来越慢?...2012-2016:大量(重复的)依赖项存储在神奇的 node_modules 内的嵌套文件夹中 ☢️ 2012-2016:rm -rf node_modules 成为前端开发人员最常用的命令。?...♀️ npm 检查要安装的依赖项中的安全漏洞 yarn 和 npm 的构建时间不再有显差异 2019:tink 开始进入 beta 模式 ?...避免使用 node_modules,而是为项目中的每个依赖项创建一个带有哈希值的文件 尚未做好投入生产环境的准备 … 哎… ? 如我们所见,yarn 发布后,npm 受到启发(并被迫?)
为什么要使用 NPM npm 是随同 Node 一起安装的包管理工具,能解决 Node 代码部署上的很多问题,常见的场景有以下几种: 允许用户从 npm 服务器下载别人编写的第三方包到本地使用。...“本地安装”指的是将一个模块下载到当前项目的 node_modules 子目录,然后只有在项目目录之中,才能调用这个模块。...本地模式和全局模式的特点如下: 模式 可通过 require 使用 注册 PATH 本地模式 是 否 全局模式 否 是 # 本地安装 $ npm install # 全局安装...,npm install 会先检查,node_modules 目录之中是否已经存在指定模块。.../node_modules/.bin 创建全局链接 npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间创建符号链接。
比 yarn link 更好的机制,因为它只影响工作区树而不是整个系统(yarn link 会在全局/usr/local/bin 中增加相关记录,[见下述](###yarn link) 所有的项目依赖项将一起安装...通过将子模块提升到其父项目的node_modules:monorepo/node_modules来在子项目/程序包之间共享模块。...至此,可以从项目的根 node_modules 访问所有模块,但我们通常会在其本地项目中构建每个程序包,这些模块在其自己的 node_modules 下可能不可见。...项目副本 peerDependencies peerDependencies的目的是提示宿主环境去安装满足插件peerDependencies所指定依赖的包,然后在插件import或者require...所依赖的包的时候,永远都是引用宿主环境统一安装的npm包,最终解决插件与所依赖包不一致的问题。
任何一个项目的构建离不开工具和统一的管理标准,在项目开发和维护过程中,我们需要了解安装包的相应工具和配置文件,以此来有效的进行项目的迭代和版本的更新,为项目提供基本的运行环境。...-D 安装到当前项目 并写入到devDependencies devDependencies与dependencies 的区别: devDependencies 是本地开发时用的依赖项 dependencies...是生产环境的依赖项 卸载模块 $ npm uninstall express 卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看: $ npm ls 更新模块...并写入到devDependencies devDependencies与dependencies 的区别: devDependencies 是本地开发时用的依赖项 dependencies 是生产环境的依赖项...安装依赖包 npm install 会将package.json 里面的devDependencies和dependencies下的所有包都会下载到项目的node_modules文件夹下(没有的改文件夹会新建一个
config set registry https://registry.npmjs.org/初始化配置文件通常一个项目中会使用到很多的包、库、模块、插件等等,这样使得node_modules这个文件夹会很大...package.json:用来存储项目下载的模块信息package.json创建package.json文件# 需要根据提示手动输入项目的信息npm init# 使用默认值创建,不用根据提示手动输入项目的信息..."license": "ISC", //许可证,开源协议 "dependencies": { //重要,项目的依赖, 方便代码的共享 通过 npm install可以直接安装所有的依赖项..."bootstrap": "^3.3.7", "jquery": "^3.3.1" }}下载命令下载安装模块,我们可以选择本地安装,也可以选择全局安装,下面是两种安装的命令:本地安装:将安装包放在.../node_modules 下# 只能在当前文件夹使用npm install 模块名称# 简写:npm i 模块名称# 示例:npm install antd全局安装:将安装包放在 /usr/local
领取专属 10元无门槛券
手把手带您无忧上云