Open ahalf-yuan opened 3 years ago
参考:https://juejin.cn/post/6844903582337237006#heading-15
一、知识点:
npm - 关于package
(1) 场景1:本地模块引用
(2) 场景2:私有 git 共享 package
(3) 场景3:开源 package 问题修复
二、npm版本管理
采用 semver 规范,约定的版本号格式为:【主版本号:次版本号:修订版本号】
package.json 中常见的是采用 semver range 指定的依赖包版本号及范围。
npm version major|minor|patch package 版本号自增,并且Git生成一条新的commit + tag。
npm version major|minor|patch
Npm5 以前,没有lock文件,不同的人安装的是当前semver range的最新版;npm5 根据lock文件里的确定版本号安装,如果要升级到最新使用npm update。
npm update
最佳实践 总结起来,在 2018 年 (node 9.8.0, npm 5.7.1) 时代,我认为的依赖版本管理应当是: 使用 npm: >=5.1 版本, 保持 package-lock.json 文件默认开启配置 初始化:第一作者初始化项目时使用 npm install <package> 安装依赖包, 默认保存 ^X.Y.Z 依赖 range 到 package.json中; 提交 package.json, package-lock.json, 不要提交 node_modules 目录 初始化:项目成员首次 checkout/clone 项目代码后,执行一次 npm install 安装依赖包 不要手动修改 package-lock.json 升级依赖包: 升级小版本: 本地执行 npm update 升级到新的小版本 升级大版本: 本地执行 npm install <package-name>@<version> 升级到新的大版本 也可手动修改 package.json 中版本号为要升级的版本(大于现有版本号)并指定所需的 semver, 然后执行 npm install 本地验证升级后新版本无问题后,提交新的 package.json, package-lock.json 文件 降级依赖包: 正确: npm install <package-name>@<old-version> 验证无问题后,提交 package.json 和 package-lock.json 文件 错误: 手动修改 package.json 中的版本号为更低版本的 semver, 这样修改并不会生效,因为再次执行 npm install 依然会安装 package-lock.json 中的锁定版本 删除依赖包: Plan A: npm uninstall <package> 并提交 package.json 和 package-lock.json Plan B: 把要卸载的包从 package.json 中 dependencies 字段删除, 然后执行 npm install 并提交 package.json 和 package-lock.json 任何时候有人提交了 package.json, package-lock.json 更新后,团队其他成员应在 svn update/git pull 拉取更新后执行 npm install 脚本安装更新后的依赖包
总结起来,在 2018 年 (node 9.8.0, npm 5.7.1) 时代,我认为的依赖版本管理应当是:
>=5.1
package-lock.json
npm install <package>
^X.Y.Z
package.json
node_modules
npm install
npm install <package-name>@<version>
npm install <package-name>@<old-version>
npm uninstall <package>
三、Npm install 包结构
(1) npm2,安装- 递归式-依赖关系层层递进,形成依赖树,依赖树与文件目录一一对应
(2) npm3,开始,安装扁平化,npm 默认会在无冲突前提下,尽可能将包安装在较高的层级。
(3) npm5,默认增加了package-lock文件,锁定固定版本,使得不同环境依赖的版本一致。之前可以通过 npm shrinkwrap 获得。(lock 中的依赖与node_modules文件目录一致)
四、npm scripts 介绍
(1) npm scripts
-npm scripts 运行时会将node_modules/.bin/ 目录添加到当前运行环境的PATH路径,所以理论上,依赖的工具包不用在全局环境安装。
-npm 提供了pre和post两种钩子,用来在执行脚本的前后执行。
-可以使用--传参。
-脚本里可以访问一些运行时的变量,比如 process.env 。
(2) node_modules/.bin 目录
可执行命令行包,如果package.json文件定义了bin字段,如下,<command>:filename
<command>:filename
{ "bin": { "webpack": "./bin/webpack.js" } }
本地安装:检查package.json,并将bin命令定义的文件安装在 node_modules 的.bin目录下,文件名为该命令名。
全局安装: 会在全局node_modules 的bin目录下创建名为 指向filename的软链接。
??问题??如何写bin命令
(3) npx
npx神奇用法
一句话:npx 的作用就是下载远程包到临时目录并执行,执行结束后删除,常见用于 CRA 这种只使用一次的脚手架创建工具。
五、npm配置
(1) npm config ls -l
npm config ls -l
(2) .npmrc 文件(项目级,用户级,全局,内置)
(3) node 版本约束
声明:通过 package.json 的 engines 属性声明应用运行所需的版本运行时要求。
engines
{ "engines": { "node": ">=7.6.0"} }
强约束:在 npm 中以上字段内容仅作为建议字段使用,若要在私有项目中添加强约束,需要自己写脚本钩子,读取并解析 engines 字段的 semver range 并与运行时环境做对比校验并适当提醒。
最佳实践 统一项目配置: 需团队共享的 npm config 配置项,固化到 .npmrc 文件中。 统一运行环境,统一 package.json,统一 package-lock 文件。 合理使用多样化的源安装依赖包: npm install <git url>|<local file>。 使用 npm: >=5.2 版本。 使用 npm scripts 与 npx (npm: >=5.2) 脚本管理应用相关脚本。
最佳实践
统一项目配置: 需团队共享的 npm config 配置项,固化到 .npmrc 文件中。
统一运行环境,统一 package.json,统一 package-lock 文件。
合理使用多样化的源安装依赖包: npm install <git url>|<local file>。
npm install <git url>|<local file>
使用 npm: >=5.2 版本。
使用 npm scripts 与 npx (npm: >=5.2) 脚本管理应用相关脚本。
参考:https://juejin.cn/post/6844903582337237006#heading-15
一、知识点:
npm - 关于package
(1) 场景1:本地模块引用
(2) 场景2:私有 git 共享 package
(3) 场景3:开源 package 问题修复
二、npm版本管理
采用 semver 规范,约定的版本号格式为:【主版本号:次版本号:修订版本号】
package.json 中常见的是采用 semver range 指定的依赖包版本号及范围。
npm version major|minor|patch
package 版本号自增,并且Git生成一条新的commit + tag。Npm5 以前,没有lock文件,不同的人安装的是当前semver range的最新版;npm5 根据lock文件里的确定版本号安装,如果要升级到最新使用
npm update
。三、Npm install 包结构
(1) npm2,安装- 递归式-依赖关系层层递进,形成依赖树,依赖树与文件目录一一对应
(2) npm3,开始,安装扁平化,npm 默认会在无冲突前提下,尽可能将包安装在较高的层级。
(3) npm5,默认增加了package-lock文件,锁定固定版本,使得不同环境依赖的版本一致。之前可以通过 npm shrinkwrap 获得。(lock 中的依赖与node_modules文件目录一致)
四、npm scripts 介绍
(1) npm scripts
-npm scripts 运行时会将node_modules/.bin/ 目录添加到当前运行环境的PATH路径,所以理论上,依赖的工具包不用在全局环境安装。
-npm 提供了pre和post两种钩子,用来在执行脚本的前后执行。
-可以使用--传参。
-脚本里可以访问一些运行时的变量,比如 process.env 。
(2) node_modules/.bin 目录
可执行命令行包,如果package.json文件定义了bin字段,如下,
<command>:filename
本地安装:检查package.json,并将bin命令定义的文件安装在 node_modules 的.bin目录下,文件名为该命令名。
全局安装: 会在全局node_modules 的bin目录下创建名为 指向filename的软链接。
??问题??如何写bin命令
(3) npx
npx神奇用法
一句话:npx 的作用就是下载远程包到临时目录并执行,执行结束后删除,常见用于 CRA 这种只使用一次的脚手架创建工具。
五、npm配置
(1)
npm config ls -l
(2) .npmrc 文件(项目级,用户级,全局,内置)
(3) node 版本约束
声明:通过
package.json
的engines
属性声明应用运行所需的版本运行时要求。强约束:在 npm 中以上字段内容仅作为建议字段使用,若要在私有项目中添加强约束,需要自己写脚本钩子,读取并解析 engines 字段的 semver range 并与运行时环境做对比校验并适当提醒。