概要
本文主要涉及:
-
nodejs
版本管理工具nvm
在win
、*nix
系统上的安装、更新、使用 -
npm
、yarn
、pnpm
包管理工具的使用,换源及还原源 -
package.lock.json
、yarn.lock
、pnpm-lock.yaml
文件的讲解及如何使用ni
优雅的跨不同的包管理工具项目进行依赖包处理
前提&原由
我本人是一位工作将近5年的前端工程师,在当年刚步入前端开发的时候,感觉有好多东西要学,很多技术想要尝试,但是有时候因为nodejs
版本的不同、依赖包下不下来、跟网上学的换源换的有问题了也不会还原,各种各样的奇葩问题,差点把我劝退。所以就将前端开发中的nodejs环境准备、包管理器、依赖安装、开发这一套流程总结出来的一个最佳实践记录下来,给新手、高手、老手们一个参考,免得每次碰到这些个磨人的问题都要去翻以前的笔记、收藏,求助于搜索引擎,总之这就是一篇记录前端开发环境的疑难杂症帖,不涉及任何技术讲解,直接给你最佳实践和问题的解决方案,如果你的本地环境已经烂的不行了,推荐全部卸载删掉,按照本文重新处理本地环境,本文后期会跟随流行的技术栈不定期更新内容推荐收藏,如果好的工具、内容或最佳实践欢迎在评论区交流!
nodejs版本管理工具nvm篇
nvm是什么?我为什么需要nvm?
当我们在使用一些新的库或者新版本的一些库的时候通常会碰到一个最低nodejs
版本的要求,这时候如果我们本地的nodejs
版本太老的,用不了怎么办(我想问那些说卸载了重新装个新版本的同学,下次还要这么干吗?如果你有好几个项目要维护,有的历史性的项目用不了比较新版本的nodejs
怎么办,你这个行不通!),所以我们就需要一个可以管理本地nodejs
版本的工具来解决这个问题
nvm安装、使用、更新
nvm
可以在win
、linux
、osx
上面安装,由于linux
和osx
上面安装过程基本差不多,我这里就拿win
和linux
举例子,如果你本地有nodejs
,并且全局安装的有包,请先使用npm list -g --depth 0
查看全局安装的包,使用node -v
查看你的nodejs
版本,并记录下来,方便之后安装好nvm
之后重新还原本地环境,然后参考如何彻底卸载win上的nodejs,将本地的nodejs删除,之后进行下一步。
win上安装nvm(如果已经安装直接跳过看win上更新的)
准备工作:右键你的开始菜单,点击
Windows PowerShell(管理员)(A)
,输入Set-ExecutionPolicy RemoteSigned
,回车之后输入A
,这是因为windows
下运行*.ps1
脚本(powershell
的脚本)的时候,需要设置执行权限。
nvm
在win
上的安装过程比较简单且仓库与原nvm
不是同一个仓库,是这个nvm-windows,首先我们到这个仓库的releases页面,找到nvm-setup.zip,点击下载一个安装文件的压缩包,下载完成之后就打开安装,一直下一步就完事了,如果你想要改变安装路径,也可以自行更换,但是一定要注意安装路径不能有中文和空格,不然你就重新卸载再安装吧。全部搞定之后,重启下终端或者电脑(重启终端不行,就重启电脑😝,这一步主要是需要使配置的环境变量PATH
生效),在重启完之后,打开终端,在终端输入nvm version
,如果有正常输出,就说明已经安装好了,这个时候我们需要换源(为了更快的网络速度,提高安装nodejs
和项目依赖包的速度),首先打开你安装的nvm
的目录,里面应该有一个settings.txt
的文件,将这个文件打开,在这个文件之后追加一下内容,保存后关闭。(后续如果需要更换源可以更换后面的源的路径,重置默认源直接把这一部分删除保存即可)
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
registry: https://registry.npm.taobao.org
重启终端,然后运行
nvm install xxxxxx(你之前安装的nodejs版本,比如16.13.2)
如果需要其他版本的也可以按照这个来安装指定版本的nodejs,等待安装完毕之后,打开Windows PowerShell(管理员)(A)
,nvm ls
查看安装了哪些版本的nodejs
,使用nvm use xxxxxx
指定默认使用哪个版本的nodejs
,当你没有用管理员终端运行的时候,不出意外会报exit status 1: ����������
这个错,用管理员终端来切换就可以了(只有在用nvm
切换nodejs
版本的时候才会有这个问题,平时开发不会用到)。这个时候你可以通过npm install -g xxx
去安装之前你全局安装的包就可以了。
到这里win
下的nvm
的安装的坑应该是踩完了,接下来告诉你更新的。
win上更新nvm
如果你的
nvm version
低于v1.1.8
可能就不能通过使用v16.13+
的nodejs
内置的corepack
来使用pnpm
了,不了解corepack
和pnpm
的同学可以去看我的另一篇文章,为了获得更好的开发体验和后续的升级,推荐在nvm
版本更新后一段时间后升级下nvm
。
同样的如果你看到nvm-windows
最新的releases比你的本地版本高的话,就在releases页面找到最新版本的nvm-update.zip然后下载后解压,右键使用管理员运行,选择最新的版本等待安装完成之后,重启终端使用nvm version
查看,是否安装成功,如果不是就重新运行一遍升级的文件。
linux上安装nvm(一样的如果安装了nodejs,请先卸载)
根据官方的readme
文档,运行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
# 或者
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
通常情况下,一部分同学会因为DNS污染的问题报curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
的错,这个时候往上一些帖子就会让你去那种查域名ip
的网站通过改本地host
的方式来修复这个问题,这里告诉你一个更加优雅的解决的方案:
在nvm仓库的readme中找到Install & Update Script的部分,点击install script跳转到
install.sh
这个文件,把这个文件的内容全部复制,在本地新建个install-nvm.sh
的脚本文件,将内容全部粘贴进去保存,之后在本地bash ./install-nvm.sh
运行这个脚本就可以了,之后如果需要更新升级nvm
了,只需要将脚本文件中的版本号改为最新的版本号即可,比如截至文章更新时,最新的nvm
版本为0.39.1
。同样的运行完之后需要按照readme
文档中的将下面的内容添加到你终端的配置文件中,比如你用默认的bash
你就要检查下你的~/.bashrc
中有没有以下的内容,如果没有需要添加,如果你用zsh
,你就需要把下面的这段配置添加到你的~/.zshrc
中,然后source
下你的配置文件,使之生效
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
到这里,在unix
系统上安装和更新nvm
的部分就完成了。
但是要注意在win
和unix
上设置默认nodejs
的版本的命令是不一样的。在win
上用nvm use 16.13.2
即可切换当前系统的nodejs
版本并将其设置为默认版本,,unix
上面需要使用nvm alias default 16.13.2
,设置默认的nodejs
版本,使用nvm use 16.13.2
设置当前环境中的nodejs
版本。运行一下下面这个来换源(后续如果需要更换源可以更换后面的源的路径重新执行,重置默认源直接把后面的路径换为https://npmmirror.com/mirrors/node
执行即可)
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
npm、yarn、pnpm依赖包管理工具
npm
是长期以来nodejs
默认的包管理工具,当你安装nodejs
之后就默认全局已经安装了npm
,但是由于历史设计问题,使用npm
安装依赖会导致项目中的依赖包体积特别大,网络不好的情况下安装过程会特别长,所以后面有了yarn
,但是yarn
也没有很好的解决依赖体积大的问题,后面就出现了pnpm
,关于这几个包管理工具的对比及原理并不是本文要讨论的,这里推荐新项目使用pnpm
安装依赖,关于如何使用pnpm
,也可以参考我之前的一篇文章,如果在本地带宽不差的情况下,依赖安装特别慢或者安装不上,并且报错的都是超时的话,可能就需要换源了,pnpm换源及重置源:
# 更换淘宝源
pnpm config set registry https://registry.npm.taobao.org
# 重置
pnpm config set registry https://registry.npmjs.org
npm
换源及还原都是一样的命令
ni
和lock
文件
使用不同的包管理工具安装依赖后会生成不同名称的lock
文件,比如npm
安装依赖后会生成package.lock.json
,yarn
会生成yarn.lock
,pnpm
会生成pnpm-lock.yaml
,这些文件是为了保证多人协作开发维护项目的时候,大家安装的包都是同一个版本的。
什么是ni?我为什么需要ni?
可能由于一些历史原因或其他原因,我们平时开发的时候维护的项目可能使用的包管理工具不都是统一的,造成我们需要根据不同的项目使用不同的命令来安装依赖、启动项目、打包,这样比较繁琐也比较容易出错,所以推荐使用ni来优化这个情况,ni
可以根据不同的lock
文件使用不同的命令安装依赖和执行其他的一些操作,并且可以配置你的默认包管理工具,在起一个新项目的时候可以直接无脑操作。
ni安装&使用
# 安装
npm i -g @antfu/ni
# 使用
# 安装依赖
ni # npm i; yarn i; pnpm i
# 安装特定的包
ni libname # npm i libname; yarn add libname; pnpm i libname
# run
nr xxscript # npm run xxscript; yarn xxscript; pnpm xxscript
# 执行
nx prisma generate # npx prisma generate; yarn dlx prisma generate; pnpm dlx prisma generate
# 更新依赖
nu # npm update; yarn update; pnpm update
# 命令后跟\?查看对应的包管理器源命令(不执行,只打印命令)
ni \? npm i; yarn i; pnpm i
这样开发人员在开发过程中就无需关注当前项目使用的是什么包管理工具了,直接无脑ni nr nx
即可
windows上ni命令与系统New-Item命令冲突?
有的同学在windows
上安装完ni
使用ni
安装依赖的时候发现终端出现了这些内容
位于命令管道位置 1 的 cmdlet New-Item
请为以下参数提供值:
Path[0]:
这个是因为在powershell
上有一个New-Item
的命令的别名ni
与我们需要的这个ni
命令冲突了,系统级别的别名优先级比较高,导致这个结果,怎么解决呢?其实官方的issue
已经有人给出了解决方案,就是把系统的这个别名删除,但是值得注意的是,有些同学的电脑可能powershell
的版本还是6
之前的,没有Remove-Alias
这个命令。
如果你打开一个新的终端,也会提示你尝试新的跨平台 PowerShell https://aka.ms/pscore6
的话就证明你本地的Power Shell
版本还是5
,系统ni
别名命令无法删除
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
所以需要我们将本地的powershell
版本升级。
如何升级powershell?
如果你有使用过微软应用商店,就打开MicroSoft Store
,搜索powershell
,找到后直接安装(记得把代理软件推出,不然会有网络问题),或者通过参考微软的文档来安装。如果你本地安装的同样有Windows Terminal
安装后打开Terminal
,新建标签页右边的下拉菜单中会自动多一个PowerShell
的选项,然后把这个终端设为默认终端(这部分可通过编辑Terminal
的settings.json
来实现,这部分网上也有比较多的教程,大家可以自行搜索教程)。然后为新版本的PowerShell
新建一个配置文件
if (!(Test-Path -Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
这时候再输入notepad $PROFILE
,打开新终端的配置文件输入Remove-Alias -Name ni -Force
然后保存,之后就能愉快的使用ni
命令了!
总结
web
前端各个方面发展的快,大家是有目共睹的,各种各种新鲜玩意层出不穷,各种新库的出现就像一个个劲敌,希望这篇文章能够帮助各位front-end-developer
练就一件自己趁手的兵器,能在打怪升级的道路上祝各位一臂之力,有用请点赞,喜欢请关注,我是Senar
(公众号同名),谢谢各位!