安利下 fnm(Fast Node Manager) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dcsuibian
V2EX    程序员

安利下 fnm(Fast Node Manager)

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

    最近遇到了一个问题,有一个项目用 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 快!
    JsonNode
        8
    JsonNode  
       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
    jawilx
        11
    jawilx  
       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 兼容有点问题
    JsonNode
        18
    JsonNode  
       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  
       2024-01-17 17:06:57 +08:00
    试试这个哈哈哈,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  
       2024-01-17 17:09:55 +08:00
    @wjx0912
    https://github.com/version-fox/vfox
    你说的这个可以使用 vfox 的 Session 模式, 两个 Shell 互不影响, 所以你可以做到同时运行两个不同 node 版本的项目
    gesse
        39
    gesse  
       2024-06-11 07:54:40 +08:00
    @jqtmviyu
    volta 完美解决全局安装的工具包(如:typescript 、vuepress 等)在切换 node 版本需要重新安装的问题。
    gesse
        40
    gesse  
       2024-09-29 21:56:08 +08:00
    @xujiahui
    在用 volta ,但是不知道怎么删除已安装 node 历史版本
    ---
    which node ,然后到相关目录手动删除相应版本的文件夹,node 和 package manager 都是这样的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2784 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:49 PVG 22:49 LAX 07:49 JFK 10:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86