npm 一探到底

678 阅读9分钟

缘起:两个月没动的项目,从git上拉下来,突然间就跑不起来了?一顿操作之后,发现是依赖更新导致的不兼容,吃了一个修饰符的亏......

一、环境介绍

1. nvm

场景介绍:我们在开发项目的时候,最开始有一个老项目,安装的是node 4x的版本,后来有了新的项目,需要安装node 8x的版本,因此需要在两个版本之间进行切换,那么我们如何管理node的版本呢?此时nvm应运而生...

1). nvm是什么

  • nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本 2). 安装
  • 访问 github点击最新版本的 nvm-setup.zip 下载到本地并安装,安装目录自定
  • 打开 cmd , 输入 nvm -v,查看nvm版本号,确定安装成功
  • 设置 node 和 npm 镜像地址,在nvm安装目录(nvm root可查看nvm安装目录),找到 setting.txt加上如下两行
 node_mirror: https://npm.taobao.org/mirrors/node/
 node_mirror: https://npm.taobao.org/mirrors/node/
  • 安装你要的nodejs版本,必须是npm和nodejs都成功
    • nvm list available命令查看可下载的nodejs版本信息
    • nvm install 版本号 安装node指定版本的node
    • nvm ls 查看安装的node版本 3). 常用命令
命令含义
nvm -v查看nvm版本号
nvm list available查看网络可以安装的版本
nvm list/ls查看已经安装的版本
nvm install(uninstall)版本号安装(卸载)指定的版本
nvm use 切换使用指定的版本node
nvm use 切换使用指定的版本node
nvm alias 给不同的版本号添加别名
nvm unalias 删除已定义的别名
nvm root [path]设置和查看root路径

2. nrm

1). nrm是什么

  • nrm全名 npm registry manager 是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换。
  • 以前我们可能通过 npm config set registry registry.npm.taobao.org 去切换源,这种繁琐的方式,今天我们就来清爽一番... 2). 安装
  • 我们可以直接通过npm安装:npm install -g nrm
  • 通过nrm -V 查看版本,确定安装是否成功 3). 常用命令
命令含义
nrm -V查看nrm版本
nrm ls查看本机所有的源(其中带*的是当前使用的源)
nrm use [name]切换源
nrm add [registry] [url]增加源(其中reigstry为源名,url为源的路径)
nrm del [name]删除源(name为源名)
nrm current查看当前使用的源
nrm test [npm]测试速度(测试相应源的响应时间),源名可选

nrm切换源不仅可以用于npm,也可以用于yarn,当然我们还可以使用cnpm(有时候会出现一些诡异的问题)。

二、npm基础

1.npm

1). npm是什么

  • npm全称为Node Package Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行、支持的第三方模块最多的包管理器
  • npm的初衷是使得开发人员更容易分享和重用代码
  • 须知的基本概念
    • 包:是描述一个文件或一个目录,可以依赖其他包也可以不依赖
    • 包管理器:对包进行管理的工具,可以查看包的版本、依赖、作者等相关信息 2). npx是什么
      npm在5.2版本内置了npx工具,也可以使用npm install -g npx手动安装,主要用来在终端调用项目本地安装的模块,从而可以避免一些全局包的安装。
    • 调用项目中安装的包:如果我们在项目中安装了webpack,要执行webpack相关的命令,如果在项目目录下直接执行的话,它会去全局的包查找,如果要避免这种情况,就只能将命令定义在package.json的scripts中,然后通过npm run的方式来执行。如果使用npx,就会避免这种情况,因为它会优先去项目本地中寻找。
      • npx webpack --v
    • 避免全局安装模块:一般在使用一些脚手架的时候,我们需要在全局安装后才可使用,如果使用npx就不需要。
命令含义扩展
npm init初始化生成一个新的 package.json 文件npm init -y(yes) 默认配置,跳过提问环节
npm search <搜索词>搜索 npm 仓库,它后面可以跟字符串,也可以跟正则表达式如果更改了npm的镜像源,搜索包时需要切换到npm官方源
npm install <包名> [配置]安装包(install 可以简写为 i )-g(全局安装)、-S(生产依赖)、-D(开发依赖)
npm uninstall <包名> [配置]卸载包
npm update <包名> [配置]更新包
npm list列出当前项目安装的所有模块,以及它们依赖的模块npm list -global 列出全局安装的模块
npm info <包名>查看每个模块的具体信息
npm set xxx设置环境变量(基本信息)npm set init-author-name 'Your name'、npm set init-author-email 'Your email'等
npm publish [配置]发布包-tag beta: 指定标签,默认为版本号,如npm publish --tag beta等
npm cache clean --force清除缓存为了加快安装包的速度,NPM会在安装包的时候把他们缓存到本地,再次安装这些包的时候,直接从缓存拷贝,使用该命令可以清除缓存。

2.yarn

1). 是什么
Yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 ,正如官方文档中写的,Yarn 是为了弥补 npm 的一些缺陷而出现的

  • 安装太慢
  • 存在安全隐患,因为 npm 允许包在安装的时候运行代码 yarn的优势:
  • 速度快,并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能
  • 更简洁的输出:npm 的输出信息比较冗长。在执行 npm install 的时候,命令行里会不断地打印出所有被安装上的依赖。相比之下,Yarn 简洁太多:默认情况下,结合了 emoji直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息。
  • 更好的语义化: yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。 参考文章npm和yarn的区别,我们该如何选择?
    2). yarn和npm命令一览表
npmyarn含义
npm install(npm i)yarn install(yarn)根据 package.json 安装所有依赖
npm i [package] --saveyarn add [package]添加依赖包至 dependencies
npm i [package] –-save-devyarn add [package] –-dev添加依赖包至 devDependencies
npm i -g [package]yarn global add [package]安装全局依赖包
npm update --saveyarn upgrade [package]升级依赖包
npm uninstall [package]yarn remove [package]移除依赖包

相同的操作命令

npmyarn含义
npm runyarn run运行 package.json 中预定义的脚本
npm config listyarn config list查看配置信息
npm config set registry urlyarn config set registry url设置源
npm inityarn init初始化,创建package.json 文件
npm listyarn list查看当前目录下已安装的node包
npm loginyarn login登录(保存你的用户名、邮箱)
npm logoutyarn logout登出(删除你的用户名、邮箱)
npm outdatedyarn outdated检查过时的依赖包
npm linkyarn link开发时链接依赖包,以便在其他项目中使用
npm unlinkyarn unlink取消链接依赖包
npm publishyarn publish发布包到npm
npm testyarn test测试响应速度
yarn infoyarn info显示包的信息

参考文章:参考文章:【前端工程化】篇二 白璧微瑕-包管理器

三、npm进阶

1.npm版本固化(依赖锁版本)

缘起之处,归于此,框架组更新了一个依赖,不兼容主项目,导致我的项目突然死去...那么,先抛出一个问题,是否有必要锁定版本?
1). npm版本管理

  • 版本格式:
    • 主版本号.此版本号.修订号
  • 版本控制符:
     "test""1.0.0 - 2.9.7",   //介于两者之间的版本
     "test"">= 1.0.0 < 2.9.7",  // 运算符版本控制(介于之间)
     "test": "1.0.1", // 固定版本
     "test": "1.0.3 || 1.0.8", // 或运算
     "test": "http://www.baid.com", // 指定下载地址代替版本
     "test": "^1.2.0", // 同一主版本号
     "test": "~1.2.3", // 同一主版本号和次版本号
     "test": "2.x", // 2.0.0 以上均可
     "test": "2.2.x", // 2.2.0以上均可
     "test": "latest", // 最新的版本
     "file": "../app" // 从本地下载
    
  • npm默认
    • npm默认使用^,即锁定主版本号 2). 版本固化的方式:
  • npm-shrinkwrap.json:
    • 该方式是比较早的锁定版本的方式, 与package-lock.json功能类似,区别在于npm包发布的时候可以发布上去。
    • 如果package-lock.json和npm-shrinkwrap.json同时存在于项目根目录,package-lock.json将会被忽略。
    • 使用方式:
    npm shrinkwrap  // 生成依赖  默认不包括dev dependencies
    npm shrinkwrap--dev   // 将dev-dependencies计算在内
  • package-lock.json:
    • 相对于npm-shrinkwrap ,其不会被发布到npm
    • npm5.4.2版本后如果改了package.json,且package.json和lock文件不同,那么执行npm i时npm会根据 package中的版本号以及语义含义去下载最新的包,并更新至lock。如果两者是同一状态,那么执行npm i都会根据lock下载,不会理会package实际包的版本是否有新。
    • 注意在npm5.4.2版本之前,执行npm i 时的不同处理...
  • yarn.lcok:
    • yarn毕竟是针对npm的缺点而生,所以其自带版本控制,默认依赖都会生成yarn.lock文件,该文件会通过包名+版本来确定具体信息。
    • 对于固化还是建议使用yran.lock实现,npm的lock在不同版本下存在的差异让人头疼。 3). 是否应该锁定版本:
  • 个人认为,自行维护的,向下兼容的依赖可以不锁版本,如果是依赖于第三方的,可以锁定版本,保证程序的可执行性,至于锁定到什么层级,视情况而定,这个没有啥标准。大佬们有什么看法意见,还望指出... 参考文章: yarn or npm 版本固化如何选择