提醒:本文发布于 584 天前,文章内容可能 因技术时效性过期 或 被重新修改,请谨慎参考。
FNM(Fast Node Manager) 的优点是比nvm快得多。
选择fnm的一个原因是,node及一些常用的npm包更新太快,有时候创建项目的时候 下载的npm包要求更高版本的node, 所以不得不每隔不定时间都得下载一个更新的版本。
但是,有一些常用的npm全局包,不是需要经常更新,但是经常用。切换node版本之后,还要在当前版本下重新安装全局包,nvm有–reinstall-packages-from,但是fnm没有,按网上的教程,可以对~/.npmrc设置相同的prefix
假设遇到一种情况,我需要一个更低版本的node, 比如v10, 我希望v10下,不和其余版本的node共享prefix,可以按下面终端函数实现,需要注意的是,如果只是直接修改prefix, 那切换之后 还是会首PATH的变量影响,所以需要对PATH也做对应修改。
node_versions=(14.21.3) // 黑名单
function fnm() { local command=$1 local node_version=$2
if [[ $command == "use" && $node_version =~ ^[0-9]+(\.[0-9]+)*$ ]]; then if [[ ${node_versions[(ie)$node_version]} -le ${#node_versions} ]]; then echo '当前node使用黑名单版本, 注意退出之后 要对 prefix和cache进行还原' npm config delete prefix npm config delete cache export PATH=$(echo $PATH | tr ':' '\n' | grep -v '/Users/k/.npm_global/bin' | paste -sd ':' -) hash -r else npm config set prefix="/Users/k/.npm_global" npm config set cache='/Users/k/.npm_global_cache' export PATH="/Users/k/.npm_global/bin:$PATH" fi else fi command fnm "$@" }
|
PATH是根据顺序优先级来的,如果不删除对应node环境的PATH,就可能导致执行的全局包不如你期望
下面一些问题值得注意
// 1
fnm use 14.21.3 // 执行了黑名单node之后,.npmrc文件会做出对应修改,关闭终端
// 再次打开终端 fnm current // 18
➜ npm root -g // 输出/Users/k/Library/Application Support/fnm/node-versions/v18.14.2/installation/lib/node_modules
// 因为.npmrc被修改,所以这点需要注意
// 当然你也可以加一个这样的函数,每次终端加载的时候执行此函数 function setPrefix(){ npm config set prefix="/Users/k/.npm_global" npm config set cache='/Users/k/.npm_global_cache' export PATH="/Users/k/.npm_global/bin:$PATH" }
// eval "$(setPrefix)" // 看个人需求
// 2 //由于所有版本共享.npmrc文件, 避免出现同时执行黑名单node环境,和普通node环境的项目
// 3 // 不能升级npm npm install npm -g // 不能这么做,否则全局包里面安装上最新的npm,那么fnm切换低版本node的时候,不一定支持这个新版本npm
|
最后,每个人开发环境差异较大,如果能不用全局包,就尽量不用全局包,自然就避免了本文出现的问题。fnm是个好东西,推荐一试。
访客评论