V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fancy2020
V2EX  ›  Node.js

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

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

    本地会开发多个不同的 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
    ljtfdt
        3
    ljtfdt  
       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 tools—without 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
    guorenjie
        18
    guorenjie  
       2023-10-25 14:30:54 +08:00   ❤️ 3


    在每个项目根目录下加一个.nvmrc 文件,指定 node 版本,打开终端自动切换
    mMartin
        19
    mMartin  
       2023-10-25 14:32:20 +08:00
    我觉得可以用 conda 管理环境
    wjx0912
        20
    wjx0912  
       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 看起来也不错,有时间试试
    xipuxiaoyehua
        35
    xipuxiaoyehua  
       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  
       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 ,每个项目加配置定版本不用手动切换
    Xenotaros
        77
    Xenotaros  
       2023-10-26 11:08:07 +08:00
    nvm
    或者 webstorm 运行配置指定 node 版本
    Masoud2023
        78
    Masoud2023  
       2023-10-26 13:35:32 +08:00
    你如果非要听点不一样的答案,那就 docker 吧
    shuimugan
        79
    shuimugan  
       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  
       349 天前
    @guorenjie 借鉴老哥的思路,写了个 Windows 版本 https://github.com/goodnighteveryone/check-node-version
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 11:16 · PVG 19:16 · LAX 03:16 · JFK 06:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.