ahalf-yuan / blog

一些学习记录,整理中...
0 stars 0 forks source link

npm 基础 #12

Open ahalf-yuan opened 3 years ago

ahalf-yuan commented 3 years ago

参考:https://juejin.cn/post/6844903582337237006#heading-15

一、知识点:

npm - 关于package

(1) 场景1:本地模块引用

(2) 场景2:私有 git 共享 package

(3) 场景3:开源 package 问题修复

二、npm版本管理

npm version major|minor|patch package 版本号自增,并且Git生成一条新的commit + tag。

Npm5 以前,没有lock文件,不同的人安装的是当前semver range的最新版;npm5 根据lock文件里的确定版本号安装,如果要升级到最新使用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.jsonpackage-lock.json
    • Plan B: 把要卸载的包从 package.json 中 dependencies 字段删除, 然后执行 npm install 并提交 package.jsonpackage-lock.json
  • 任何时候有人提交了 package.json, package-lock.json 更新后,团队其他成员应在 svn update/git pull 拉取更新后执行 npm install 脚本安装更新后的依赖包

三、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

{
    "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

(2) .npmrc 文件(项目级,用户级,全局,内置)

(3) node 版本约束

声明:通过 package.jsonengines 属性声明应用运行所需的版本运行时要求。

{
    "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) 脚本管理应用相关脚本。