FNM折腾笔记

提醒:本文发布于 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版本号的数组变量
node_versions=(14.21.3) // 黑名单

function fnm() {
local command=$1
local node_version=$2

# 要注意的是,执行完fnm use 14.21.3之后, .npmrc的文件会被修改,导致下次重新打开终端 进入默认Node版本时,安装全局包会到非预期文件夹
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
# 如果版本号不在数组中,则设置prefix为默认值, 如果输入的是 fnm Use 14 ,也会执行到这里,npm root -g会 公共路径,但是实际执行自己的npm全局包
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
# echo '执行原始fnm命令...'
# npm config set prefix="/Users/k/.npm_global"
# npm config set cache='/Users/k/.npm_global_cache'
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是个好东西,推荐一试。

访客评论