大家在开发过程中是如何管理多个项目不同的 NodeJS 版本的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fancy2020
V2EX    Node.js

大家在开发过程中是如何管理多个项目不同的 NodeJS 版本的?

  •  1
     
  •   fancy2020 2023-10-25 13:47:33 +08:00 9002 次点击
    这是一个创建于 763 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本地会开发多个不同的 NodeJS 项目,每个项目可能需要的 Node 版本不同,有的老项目还在用 10.xx ,有的要求 12.xx/14.xx/16.xx/18.xx 。

    总之,每个项目都需要不同的 Node 版本。很多时候我都是在启动项目遇到报错了才会意识到要切换 Node 版本。

    94 条回复    2023-12-15 10:16:34 +08:00
    tog
        1
    tog  
       2023-10-25 13:49:05 +08:00   6
    nvm 了解下,百度不会吗 兄弟
    Ally
        2
    Ally  
       2023-10-25 13:49:51 +08:00
    fnm
    cF06myaQ57WHKMBv
        3
    cF06myaQ57WHKMBv  
       2023-10-25 13:50:32 +08:00
    nvm ?
    jackytang520
        4
    jackytang520  
       2023-10-25 13:50:49 +08:00
    我用 asdf
    lisongeee
        5
    lisongeee  
       2023-10-25 13:51:16 +08:00   2
    volta
    hsuyeung
        6
    hsuyeung  
       2023-10-25 13:51:24 +08:00
    nvm
    sleepm
        7
    sleepm  
       2023-10-25 13:58:00 +08:00   1
    devenv
    sparkinglemon
        8
    sparkinglemon  
       2023-10-25 14:00:37 +08:00
    fnm
    stinkytofu
        9
    stinkytofu  
       2023-10-25 14:02:32 +08:00
    nvm 肯定是要用的, 还可以配合 conda 定制各种不同的环境, 不同项目必须要隔离开来, 否则真的是头大
    s1mpleOf
        10
    s1mpleOf  
       2023-10-25 14:04:49 +08:00   1
    volta
    Comyn
        11
    Comyn  
       2023-10-25 14:05:06 +08:00
    nvm
    fancy2020
        12
    fancy2020  
    OP
       2023-10-25 14:07:14 +08:00
    抱歉,我描述的不是很清楚。

    nvm, n 这些版本管理工具我是在用的。

    我的问题是:
    1. 这些工具都需要你去手动切换 Node 版本,而不能做到启动一个不同的项目可以自动选择指定版本的 Node 来运行(或者是我不知道?)。

    2. 当你使用一个不兼容的 Node 版本运行项目的时候,只要等到代码报错,才会意识到 Node 版本有问题。
    我知道 package.json 里有个`engines`字段可以指定 Node 版本,但很多项目是没有指定的 https://docs.npmjs.com/cli/v10/configuring-npm/package-json#engines


    之前公司是把 Node 和 NPM 的执行文件直接打包到项目中提交到 git 的,这样可以保证每个人都适用正确的版本来运行项目。
    nodejsexpress
        13
    nodejsexpress  
       2023-10-25 14:10:50 +08:00   1
    把版本切换命令写到 package.json script 里面
    lisongeee
        14
    lisongeee  
       2023-10-25 14:12:01 +08:00   1
    @fancy2020 #12

    > 而不能做到启动一个不同的项目可以自动选择指定版本的

    https://volta.sh/
    fancy2020
        15
    fancy2020  
    OP
       2023-10-25 14:22:09 +08:00
    @lisongeee

    感谢!

    看起来 Volta 确实就是我想要的工具,我研究一下

    Fast: Install and run any JS tool quickly and seamlessly! Volta is built in Rust and ships as a snappy static binary.

    Reliable: Ensure everyone in your project has the same toolswithout interfering with their workflow.

    Universal: No matter the package manager, Node runtime, or OS, one command is all you need: volta install.
    liuzhaowei55
        16
    liuzhaowei55  
       2023-10-25 14:30:14 +08:00 via Android
    根目录添加 .nvmrc 内容为 lts/hydrogen
    nvm 可以自动切换版本
    HuskyYellow
        17
    HuskyYellow  
       2023-10-25 14:30:15 +08:00
    nvm 每个项目配置 .nvmrc 打开终端就可自动切换到指定版本
    https://medium.com/dean-lin/使用-nvm-zsh-script--node-js-版本在不同的案自切-a8362a509440
    Renix
        18
    Renix  
       2023-10-25 14:30:54 +08:00   3


    在每个项目根目录下加一个.nvmrc 文件,指定 node 版本,打开终端自动切换
    mMartin
        19
    mMartin  
       2023-10-25 14:32:20 +08:00
    我觉得可以用 conda 管理环境
    datadump
        20
    datadump  
       2023-10-25 14:32:56 +08:00
    windows:nvm ( volta 不支持 32bit )
    mac:volta
    ultimate42
        21
    ultimate42  
       2023-10-25 14:42:29 +08:00
    我用 fnm 跨平台 项目中创建一个.node-version 文件 里面写个 14/16/18 的版本号就能自动切换 node 版本了
    Chingim
        22
    Chingim  
       2023-10-25 14:42:43 +08:00
    项目根目录放.nvmrc
    cd 进去自动切
    wu67
        23
    wu67  
       2023-10-25 14:52:24 +08:00
    为什么不试试 docker 呢
    xzr97
        24
    xzr97  
       2023-10-25 15:16:40 +08:00
    mac 用 n 指令 window 用 nvm
    renmu
        25
    renmu  
       2023-10-25 15:17:54 +08:00 via Android
    fnm ,支持 win 下自动切换
    can2421
        26
    can2421  
       2023-10-25 16:05:58 +08:00
    试了一下#18 的方法, 不知道为什么执行 nvm use 的时候显示 Invalid version 。看到 https://blog.csdn.net/weixin_49230250/article/details/131771608#nvm%20use%20%E6%97%A0%E6%95%88%E6%9C%80%E7%BB%88%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88 这个可行。
    fancy2020
        27
    fancy2020  
    OP
       2023-10-25 16:18:28 +08:00
    @mMartin
    谢谢,有时间研究一下。

    想要一个侵入性比较小的方案,记的之前写 Python 的时候用 venv 还挺方便的。不知道 Node 有没有类似的
    ganbuliao
        28
    ganbuliao  
       2023-10-25 16:19:07 +08:00
    n
    thtznet
        29
    thtznet  
       2023-10-25 16:22:51 +08:00
    用后端的眼光来看前端的工程化做得真是一言难尽,这种库/框架的多版本共存在后端看来根本就不是问题,前端的生态整得真复杂。
    Corybyte
        30
    Corybyte  
       2023-10-25 16:24:11 +08:00
    有一个 npm install n -g
    lifesimple
        31
    lifesimple  
       2023-10-25 16:36:31 +08:00
    windows nvm
    macos n
    iulo
        32
    iulo  
       2023-10-25 16:38:22 +08:00
    @fancy2020 #15 volta 现在处于没人维护的状态,有段时间没更新了。volta 的想法很好,内部要做很多的 dirty work ,我自己实际用起来和新工具链的配合还有问题,例如 pnpm 目前也没很好的支持,pnpm 本身也无意为 volta 适配。最近我从 volta 迁移出来了,用 fnm 来管理 node ,简单直观
    TsubasaHanekaw
        33
    TsubasaHanekaw  
       2023-10-25 16:42:46 +08:00
    直接放在 wsl 的容器里开发.得了
    fancy2020
        34
    fancy2020  
    OP
       2023-10-25 16:43:55 +08:00
    @iulo

    感谢提醒,看了下确实 Volta 的最近提交已经是 4 月份了。另外,刚才安装简单试了一下,它还是会在 package.json 里添加字段的,对工作中团队使用的话会有点侵入性。

    fnm 看起来也不错,有时间试试
    XiaoyehuaDev
        35
    XiaoyehuaDev  
       2023-10-25 16:46:32 +08:00
    nix flake
    wonderfulcxm
        36
    wonderfulcxm  
       2023-10-25 16:47:50 +08:00
    docker
    Donahue
        37
    Donahue  
       2023-10-25 16:48:57 +08:00
    @thtznet 我也觉得,前端各种黑魔法,各种工具,复杂的不行。
    MonkeyD1
        38
    MonkeyD1  
       2023-10-25 17:08:50 +08:00
    lilei2023
        39
    lilei2023  
       2023-10-25 17:20:13 +08:00
    nvm. n 等等都可以
    darksword21
        40
    darksword21  
    PRO
       2023-10-25 18:36:09 +08:00
    nix flake
    ColdBird
        41
    ColdBird  
       2023-10-25 18:36:59 +08:00
    nvm
    auroraccc
        42
    auroraccc  
       2023-10-25 18:53:35 +08:00
    volta ,不过和 pnpm 配合貌似有些问题
    sn0wdr1am
        43
    sn0wdr1am  
       2023-10-25 20:07:16 +08:00
    beginor
        44
    beginor  
       2023-10-25 21:07:43 +08:00 via Android
    pnpm 也是可以管理 node 的 https://pnpm.io/cli/env
    treblex
        45
    treblex  
       2023-10-25 22:15:58 +08:00 via iPhone
    source .env.sh 可以直接写在 npm 命令里
    yechentide
        46
    yechentide  
       2023-10-25 22:40:26 +08:00
    fnm+1
    zsh2517
        47
    zsh2517  
       2023-10-25 23:53:20 +08:00
    除了楼上提到的那些之外,我说一下我自己的场景。目前 node18, 20 并存,具体用哪个版本写在了 CI 配置文件里面(因为一些原因有些升级不上去 20 ),找 GPT 写了个脚本 读取 CI 配置文件并且运行 nvm use xxx 。然后设置 alias ,叫做 autoenv 。
    进到项目之后
    $ autoenv
    $ npm xxxx
    就可以,习惯之后还挺省事的
    kukat
        48
    kukat  
       2023-10-26 01:22:46 +08:00
    rtx (asdf 的 rust clone )
    one tool to rule them all
    kukat
        49
    kukat  
       2023-10-26 01:24:17 +08:00
    @kukat project based 版本可以 rtx local node@16 在项目根目录生成.tool_version 文件,以后会自动加载
    Bingchunmoli
        50
    Bingchunmoli  
       2023-10-26 01:40:46 +08:00 via Android
    @fancy2020 webstorm 可以,自己的全局管理用的 scoop
    ysmood
        51
    ysmood  
       2023-10-26 02:39:53 +08:00 via Android
    ysmood
        52
    ysmood  
       2023-10-26 02:50:02 +08:00 via Android
    fnm 不愿意支持 engine ,所以写了这个项目

    https://github.com/Schniz/fnm/issues/39
    dcsuibian
        53
    dcsuibian  
       2023-10-26 03:24:33 +08:00
    fnm+.node-version 文件就可以实现
    iamqiwei
        54
    iamqiwei  
       2023-10-26 03:43:26 +08:00
    我的做法是全局的版本一直保持最新,用“export PATH=/D/Node/node-v14.21.1-win-x64:$PATH”给当前会话添加环境变量,就可以指定 node 版本了,缺点就是有时候会忘记加,还要记住不同项目使用的 node 版本,其实用 webstorm 就可以指定项目的 node 版本
    zzerd
        55
    zzerd  
       2023-10-26 06:55:00 +08:00 via Android
    rtx 啊不但 node python golang 等其它的语言版本也能管理
    LokiSharp
        56
    LokiSharp  
       2023-10-26 07:58:31 +08:00 via iPhone
    volta
    yosoroAida
        57
    yosoroAida  
       2023-10-26 08:26:05 +08:00
    nvm
    nijjba
        58
    nijjba  
       2023-10-26 08:30:11 +08:00
    用 asdf 的 nodejs 插件,好像可以自动切换 node 版本,它会自动读 .nvmrc 或 .node-version 文件匹配
    nijjba
        59
    nijjba  
       2023-10-26 08:31:48 +08:00
    vZexc0m
        60
    vZexc0m  
       2023-10-26 08:57:25 +08:00
    直接用 webstorm 就行
    jwz426
        61
    jwz426  
       2023-10-26 09:05:29 +08:00
    如果用 vscode 开发的,可以尝试下 devcontainer 。
    3825995121
        62
    3825995121  
       2023-10-26 09:14:44 +08:00
    当然是 volta 了 rust 写的
    一个项目对应一个 node 版本
    nvm 我用的时候老是出问题 安装的时候 还要删除版本什么的 早都放弃了
    zhyl
        63
    zhyl  
       2023-10-26 09:26:22 +08:00
    fnm env --use-on-cd | source # 根据目录下的配置自动切换 node 版本
    fnm current > .nvmrc
    zackzergzeng
        64
    zackzergzeng  
       2023-10-26 09:35:21 +08:00
    git checkout 后直接做一步 nvm 切换版本吧,husky 有 post-checkout 的钩子可以用
    courtier
        65
    courtier  
       2023-10-26 09:40:12 +08:00 via Android
    如果是需要同时开发跑着好几个不同版本 node 的项目,这种情况的话有没什么办法支持
    例如我同时要跑只支持 node14 16 18 版本的项目
    tool2d
        66
    tool2d  
       2023-10-26 09:55:44 +08:00
    我都是用环境变量隔离的,使用前用脚本拉一下对应的环境变量,没觉得有啥不方便。
    mdn
        67
    mdn  
       2023-10-26 10:00:46 +08:00
    fnm

    .node-version 或 .nvmrc 文件确定项目版本
    gxm44
        68
    gxm44  
       2023-10-26 10:10:09 +08:00
    本地 nvm 开发,然后打成 image
    dc2002007
        69
    dc2002007  
       2023-10-26 10:18:48 +08:00
    有 nvm 又不愿意手动切换,你这个要求是有点高了,要求高,那你就要付出劳动,搞多个版本在 docker 里跑,在本地用 shell 脚本调用不同版本的 npm 路径来执行,gradle 也可以搞,cicd 的 jenkins 发布也是这个道理,前提是你要付出更复杂的劳动,但是如果你只是为了在单机开发调试用,整个团队都这么干,要累死人,所以还有一种方式就是云开发,大家都在云上的 ide 上开发,每个项目选择不同的 ide 去玩,但这些方案都需要付出更多的劳动
    ajan
        70
    ajan  
       2023-10-26 10:18:51 +08:00
    就没人用软链接吗?

    Windows 、Linxu 、macOS 都可以,下载 nodejs 按目录(版本号)存放,

    在 环境变量 或 .bash_profile 中 添加 /dev/nodejs/node.js

    再写个脚本命令来切换;
    ------------------------------------------------------------------

    /dev/nodejs/node.js -> /dev/nodejs/v8.9.4-win-x64
    ......
    /dev/nodejs/v18.12.1-win-x64
    superchijinpeng
        71
    superchijinpeng  
       2023-10-26 10:20:03 +08:00
    volta
    dabai0806
        72
    dabai0806  
       2023-10-26 10:21:25 +08:00
    fnm +1
    mayerer
        73
    mayerer  
       2023-10-26 10:31:20 +08:00   1
    建议你换个提问方式:先把你百度/谷歌/必应到的,或者其他社区其他渠道获取到的解决方案放到主贴内,抛砖引玉式的寻求更优解,大家也可以根据你的当前认知来提供更细致和全面的回答
    MrYELiex
        74
    MrYELiex  
       2023-10-26 10:37:11 +08:00
    fnm
    .node-version 写项目需要的版本
    DingJZ
        75
    DingJZ  
       2023-10-26 10:38:18 +08:00
    咬咬牙升一波,统一一下。之前用 nvm ,jenkins 上的 nvm 插件总出问题,影响构建效率和心情,后来分析了一波统一升了一次,就不用纠结这事了
    eggroll
        76
    eggroll  
       2023-10-26 11:01:11 +08:00
    asdf ,每个项目加配置定版本不用手动切换
    Farewell1987
        77
    Farewell1987  
       2023-10-26 11:08:07 +08:00
    nvm
    或者 webstorm 运行配置指定 node 版本
    Masoud2023
        78
    Masoud2023  
       2023-10-26 13:35:32 +08:00
    你如果非要听点不一样的答案,那就 docker 吧
    slowgen
        79
    slowgen  
       2023-10-26 15:43:35 +08:00
    如果不肯把全部项目升级到统一版本,我一般就是去 https://nodejs.org/en/download 把各个版本的 zip 包下载解压到不同路径,敲命令时使用绝对路径的 node/npm
    tomyail
        80
    tomyail  
       2023-10-26 15:49:02 +08:00
    ```bash
    asdf local nodejs latest:18
    git add .tool-versions
    ```
    qq347891134
        81
    qq347891134  
       2023-10-26 15:57:36 +08:00
    我是 windows 系统,基于 nvm+我自己写的 vscode 插件-vscode-nvmrc ,切换 vscode 实例时插件去读取 nvmrc 文件执行 nvm use ,
    realJamespond
        82
    realJamespond  
       2023-10-26 16:06:14 +08:00
    直接 source
    realJamespond
        83
    realJamespond  
       2023-10-26 16:06:37 +08:00
    直接 source
    export PATH=$NODE_HOME/bin:$PATH
    lingyired
        84
    lingyired  
       2023-10-26 16:15:19 +08:00
    我使用 Quicker 给 cmder 弄了快捷面板,里面有好几个按钮可以快速 cd 到不同项目。
    以上是前提。

    然后我使用的是 nvs ,它可以为每一个 cmder tab 终端实例指定一个 node 版本来运行。


    然后就是刚才说的快捷面板,我就相当于在 cd 之后,再一次执行 nvs use ,一个快捷动作处理两个事情:cd path/project + nvs use
    1t1y1ILnW0x5nt47
        85
    1t1y1ILnW0x5nt47  
       2023-10-26 16:25:36 +08:00
    你想要的官网都介绍过 https://nodejs.org/en/download/package-manager
    shuaiyin
        86
    shuaiyin  
       2023-10-26 18:36:21 +08:00
    webstorm 每个项目都可以设置自己的 nodejs 路径,比较方便。
    jiangzm
        87
    jiangzm  
       2023-10-26 18:59:31 +08:00
    用 nvm 启动项目就可以不用手动切换默认 node 版本

    nvm run 16 app.js
    nvm run 18.0 app.js
    yigecook
        88
    yigecook  
       2023-10-26 20:38:18 +08:00
    你的精力够同时应付几个项目?手动切一下很快呀
    amlee
        89
    amlee  
       2023-10-27 05:00:00 +08:00
    用 dev container
    Dolov
        90
    Dolov  
       2023-10-27 09:46:51 +08:00
    加一个启动前的脚本切换一下呢
    tedding
        91
    tedding  
       2023-10-27 10:21:34 +08:00 via iPhone
    公司项目 node 版本 已经 统一用 volta 管理了 不需要手动切换
    opoet
        92
    opoet  
       2023-10-27 17:38:35 +08:00
    shintendo
        93
    shintendo  
       2023-11-07 11:33:27 +08:00
    @courtier volta 可以,我也是这个需求,所以想换别的没法换
    helloWorldzsj
        94
    helloWorldzsj  
       2023-12-15 10:16:34 +08:00
    @guorenjie 借鉴老哥的思路,写了个 Windows 版本 https://github.com/goodnighteveryone/check-node-version
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     907 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 21:49 PVG 05:49 LAX 13:49 JFK 16:49
    Do have faith in what you're doing.
    ubao msn 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