安利下 fnm(Fast Node Manager)

2023-04-19 03:39:43 +08:00
 dcsuibian

最近遇到了一个问题,有一个项目用 Node.js 14 可以正常运行,用 Node.js 18 就不行。而我写 blog 用的 Hexo 又推荐使用较新的 Nodejs 版本。因此重新去研究了下目前的 Node.js 管理工具,目前共有nvmnvsnfnm这四款(其实算上nvm for windows是五款),选择了fnm

首先,跨平台支持,三大操作系统全支持。我个人有一台高性能台式 pc 、一台 mbp ,所以非常希望能在不同的平台上用同样的命令。而nvmn都是只支持 mac/linux 的,nvm fow windows的命令也跟nvm的不一样,只是借了个名字。而 fnm 则可以用同样的方式使用。

其次,支持.node-version.nvmrc,可以自动切换版本。

如图所示,我默认使用的是 Node.js 18 ,而切换到项目目录后可以自动切换成 Node.js 14 ,非常好用。(不过再 cd 到外面不会改变 Node.js 版本,除非遇到新的.node-version.nvmrc)这个我在 windows 上也试过了,可行。而nvm for windows 似乎由于实现机制的问题,不支持.nvmrc,需要手动切换,而且切换时会需要两次 UAC 确认。

第三,安装方便。fnm 整体就只有单个可执行文件。

安装总共就两步。

  1. 下载解压,并将目录添加到PATH环境变量中

  2. 根据 readme 中的Shell Setup修改下 profile 文件。

第四,速度快(用 Rust 编写),简单。

个人其实对速度倒是不在乎,毕竟切换频率不会很高,但快一点也没坏处。而且 fnm 整体确实简单,除了安装外,本身的体积也非常小,命令也非常简单。

另外,其实我也试过不使用 Node.js 版本管理工具,直接使用绝对路径。

结果如图所示,node 本身还是正常的,但 npm 就不太正常了。

4964 次点击
所在节点    程序员
38 条回复
acdfjelxe
2023-04-19 15:45:49 +08:00
貌似记得 nvm 在 fish 上的支持也不太好, fnm 咋样?
zqguo
2023-04-19 15:48:00 +08:00
我发现这些工作对 win 都不太友好
zqguo
2023-04-19 15:48:34 +08:00
工具
cooooler
2023-04-19 17:06:46 +08:00
fnm 每次重新打开终端都是默认那个 node 版本,不是上次选择的版本,这个有点难受
devtiange
2023-04-19 22:38:15 +08:00
zzhzero
2023-04-20 00:28:36 +08:00
这个使用需要管理员权限么
96368a
2023-04-20 10:52:11 +08:00
我用的 pnpm,自带 node 版本管理,例如 [pnpm env use --global 16]( https://pnpm.io/zh/cli/env)
skxs067
2023-04-20 11:11:59 +08:00
pnpm +1 ,自带版本管理
jqtmviyu
2023-04-20 14:31:20 +08:00
一直都是用 n 手动切换.

fnm, volta, asdf 我等几天后看看还有几个.
zzzzaaa
309 天前
请问 shell 里面代理已开启 那个是使用了什么工具
dcsuibian
309 天前
@zzzzaaa 没有啥工具,写了个 shell 函数设置下环境变量而已
jqtmviyu
237 天前
楼主对于 fnm 切换版本时, 全局安装的 npm 包有什么好的方法不

最新升级才发现 `npm i -g`的包是安装在特定版本的链接里

升级 node 到最新的 lts 如果忘记迁移全局包, 把旧的 lts 删了, 记录就没了.

翻了下 issue, 只有这种导出再安装的方法.

```
fnm_upgrade () {
fnm exec --using=$1 npm ls --global --json \
| jq -r '.dependencies | to_entries[] | .key+"@"+.value.version' \
| xargs npm i -g
}
```
Serif
222 天前
@jqtmviyu #32 如果我的理解無誤, 你是用 fnm 管理所有 Node 版本? 建議自己維護 LTS 最新版, `fnm default system`, 只用 fnm 管理舊版本
jqtmviyu
222 天前
@Serif #33 感谢, 我太执着用一个工具解决所有问题了. 让 brew 管理 node lts
shintendo
185 天前
volta 缺点很多,但目前还是离不开,比如我可以同时运行两个基于不同 node 版本的项目,这个 fnm 做不到吧?
wjx0912
177 天前
@shintendo
fnm works with .node-version and .nvmrc files
hankli
114 天前
试试这个哈哈哈,https://github.com/version-fox/vfox

> 如图所示,我默认使用的是 Node.js 18 ,而切换到项目目录后可以自动切换成 Node.js 14 ,非常好用。(不过再 cd 到外面不会改变 Node.js 版本,除非遇到新的.node-version 或.nvmrc )这个我在 windows 上也试过了,可行。而 nvm for windows 似乎由于实现机制的问题,不支持.nvmrc ,需要手动切换,而且切换时会需要两次 UAC 确认。

你说的这个问题 VersionFox 全部都有解决. cd 到外面会自动切换到全局或者特定版本(如果存在. tool-versions), nvm for windows 不支持是因为他采用的软链接的解决方案, 无解!
hankli
114 天前
@wjx0912
https://github.com/version-fox/vfox
你说的这个可以使用 vfox 的 Session 模式, 两个 Shell 互不影响, 所以你可以做到同时运行两个不同 node 版本的项目

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933615

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX