V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dcsuibian
V2EX  ›  程序员

安利下 fnm(Fast Node Manager)

  •  1
     
  •   dcsuibian · 2023-04-19 03:39:43 +08:00 · 5926 次点击
    这是一个创建于 582 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到了一个问题,有一个项目用 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,可以自动切换版本。

    image-20230419030511391

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

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

    image-20230419031448232

    安装总共就两步。

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

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

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

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

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

    Xnip2023-04-19_01-40-53

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

    第 1 条附言  ·  2023-05-12 21:36:23 +08:00

    image-20230419030511391

    image-20230419031448232

    Xnip2023-04-19_01-40-53

    40 条回复    2024-09-29 21:56:08 +08:00
    cydysm
        1
    cydysm  
       2023-04-19 04:13:54 +08:00 via iPhone
    我也在半年前换到了 fnm 了
    ysc3839
        2
    ysc3839  
       2023-04-19 04:23:46 +08:00 via Android
    我目前也在用 fnm 。我在 Windows 上命令行环境是使用 MSYS2+zsh ,nvm 好像不支持 MSYS2 ,在 WSL1 上性能也非常差。nvm for windows 之前 1.1.9 版本和 1.1.10 隔了近一年才更新,同时不支持 zsh 的 Tab 补全,命令语法也和别的不统一。“n”好像是依赖 Node.js 的?所以最佳选择就是 fnm 了,跨平台、支持 zsh 。
    ochatokori
        3
    ochatokori  
       2023-04-19 08:58:16 +08:00 via Android
    旧系统装了 nvm 懒得换了,新系统都换 fnm 了
    gzf6
        4
    gzf6  
       2023-04-19 09:12:05 +08:00 via Android
    volta
    yzld2002
        5
    yzld2002  
       2023-04-19 09:14:28 +08:00
    fnm 还有个好处是可以方便地在 M1 的 mac 上安装 x86 版本的 node
    clijiac
        6
    clijiac  
       2023-04-19 09:28:52 +08:00
    一直用的 nvs, 试试这个
    way2explore2
        7
    way2explore2  
       2023-04-19 09:50:33 +08:00
    是,确实很不错,用了一年多了,最直观的感受就是,比 nvm 快!
    lovedoing
        8
    lovedoing  
       2023-04-19 10:25:30 +08:00
    不支持安装 arm64 版本的 node 14
    lasy
        9
    lasy  
       2023-04-19 10:59:25 +08:00
    volta +1 ,和 fnm 一样,同样是 rust 写的。volta 除了可以管理 node 版本,还可以管理包管理器版本,限制使用的包管理器等等,功能更加强大
    houshuu
        10
    houshuu  
       2023-04-19 11:13:16 +08:00 via iPhone
    可以试试 volta
    xujiahui
        11
    xujiahui  
       2023-04-19 11:40:29 +08:00
    在用 volta ,但是不知道怎么删除已安装 node 历史版本
    zp324511
        12
    zp324511  
       2023-04-19 12:09:53 +08:00
    之前一直用 Nodist
    kkocdko
        13
    kkocdko  
       2023-04-19 12:32:22 +08:00
    看了下确实挺不错。不过我也推荐楼主尝试一下将项目迁移到最新版本 Node.js 。一般来说造成不兼容也就那么几个原因,废弃的 API 或者 NAPI ,可能使用 NAN binding 等等,一般来说解决起来并不麻烦,我已经迁移了有那么几次了 hhhhh
    Hyoban
        14
    Hyoban  
       2023-04-19 12:48:31 +08:00
    volta 不支持 corepack
    MAGA2022
        15
    MAGA2022  
       2023-04-19 12:59:58 +08:00
    asdf 好用
    cosmain
        16
    cosmain  
       2023-04-19 13:33:36 +08:00
    @lovedoing
    > 不支持安装 arm64 版本的 node 14
    我看 arm64 18/19 是可以的,老版本不支持?
    zhzy
        17
    zhzy  
       2023-04-19 13:55:44 +08:00
    之前用过一段时间是挺不错的,可惜和 nushell 兼容有点问题
    lovedoing
        18
    lovedoing  
       2023-04-19 14:04:58 +08:00
    @cosmain #16 好像 16 以下的用 nvm ,fnm 之类的安装都是 x86 版本,但是 brew 安装的 node@14 是 arm64 版本的
    mcfog
        19
    mcfog  
       2023-04-19 14:36:57 +08:00
    复议 asdf ,对市面上所有此类工具形成降维打击
    lzgshsj
        20
    lzgshsj  
       2023-04-19 15:37:07 +08:00
    volta +n
    acdfjelxe
        21
    acdfjelxe  
       2023-04-19 15:45:49 +08:00
    貌似记得 nvm 在 fish 上的支持也不太好, fnm 咋样?
    zqguo
        22
    zqguo  
       2023-04-19 15:48:00 +08:00
    我发现这些工作对 win 都不太友好
    zqguo
        23
    zqguo  
       2023-04-19 15:48:34 +08:00
    工具
    cooooler
        24
    cooooler  
       2023-04-19 17:06:46 +08:00
    fnm 每次重新打开终端都是默认那个 node 版本,不是上次选择的版本,这个有点难受
    devtiange
        25
    devtiange  
       2023-04-19 22:38:15 +08:00
    zzhzero
        26
    zzhzero  
       2023-04-20 00:28:36 +08:00
    这个使用需要管理员权限么
    96368a
        27
    96368a  
       2023-04-20 10:52:11 +08:00
    我用的 pnpm,自带 node 版本管理,例如 [pnpm env use --global 16]( https://pnpm.io/zh/cli/env)
    skxs067
        28
    skxs067  
       2023-04-20 11:11:59 +08:00 via Android
    pnpm +1 ,自带版本管理
    jqtmviyu
        29
    jqtmviyu  
       2023-04-20 14:31:20 +08:00
    一直都是用 n 手动切换.

    fnm, volta, asdf 我等几天后看看还有几个.
    zzzzaaa
        30
    zzzzaaa  
       2023-07-06 10:29:05 +08:00
    请问 shell 里面代理已开启 那个是使用了什么工具
    dcsuibian
        31
    dcsuibian  
    OP
       2023-07-06 12:39:54 +08:00
    @zzzzaaa 没有啥工具,写了个 shell 函数设置下环境变量而已
    jqtmviyu
        32
    jqtmviyu  
       2023-09-15 17:37:41 +08:00
    楼主对于 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
        33
    Serif  
       2023-09-30 22:01:30 +08:00   ❤️ 1
    @jqtmviyu #32 如果我的理解無誤, 你是用 fnm 管理所有 Node 版本? 建議自己維護 LTS 最新版, `fnm default system`, 只用 fnm 管理舊版本
    jqtmviyu
        34
    jqtmviyu  
       2023-10-01 08:54:17 +08:00
    @Serif #33 感谢, 我太执着用一个工具解决所有问题了. 让 brew 管理 node lts
    shintendo
        35
    shintendo  
       2023-11-07 11:23:57 +08:00
    volta 缺点很多,但目前还是离不开,比如我可以同时运行两个基于不同 node 版本的项目,这个 fnm 做不到吧?
    wjx0912
        36
    wjx0912  
       2023-11-15 16:12:31 +08:00
    @shintendo
    fnm works with .node-version and .nvmrc files
    hankli
        37
    hankli  
       309 天前
    试试这个哈哈哈,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
        38
    hankli  
       309 天前
    @wjx0912
    https://github.com/version-fox/vfox
    你说的这个可以使用 vfox 的 Session 模式, 两个 Shell 互不影响, 所以你可以做到同时运行两个不同 node 版本的项目
    gesse
        39
    gesse  
       163 天前
    @jqtmviyu
    volta 完美解决全局安装的工具包(如:typescript 、vuepress 等)在切换 node 版本需要重新安装的问题。
    gesse
        40
    gesse  
       53 天前
    @xujiahui
    在用 volta ,但是不知道怎么删除已安装 node 历史版本
    ---
    which node ,然后到相关目录手动删除相应版本的文件夹,node 和 package manager 都是这样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1049 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:10 · PVG 03:10 · LAX 11:10 · JFK 14:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.