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

关于前端 node 多版本你是如何解决的,还有您是本地开发还是远程开发

  •  
  •   jenson47 · 2024-07-20 12:33:48 +08:00 · 7954 次点击
    这是一个创建于 412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    随着不同年代的项目,由于依赖的限制,有些支持的 node 版本比较低,有些又需要比较高。

    目前网上大家的解决方案:

    1. window nvm 多版本管理
    2. n

    如果我想要同时开多个项目的话,就比较麻烦,而且每次都得来回切换。 目前的我的开发都尽量避免在本地环境开发,毕竟没有几个公司能给你 64GB 的内存

    Docker 解决 Node 多版本问题

    优点:

    1. 再也不需要手动去切
    2. 将需求通过 Dockerfile 写好,后续只需要构建,构建的命令写成 shell ,比如我通过 Makefile
    3. 通过目录挂载解决模块缓存问题
    4. 由于在口罩期间,刚好可以结合远程开发

    缺点:

    1. 运行时得调用 docker 命令
    2. 还得配置一堆变量挂载,映射端口
    3. 尤其是后面的有些项目都不去认这个 PORT 环境变量了,得自行修改调整

    经过我这两年的项目实践,我将docker node 多版本操作进行了整理

    1. 将操作 docker 的命令这些封装成 shell
    2. 环境变量 刚好放到 .env.development中,比如后端 ip 域名,暴露端口等
    3. 运行,直接运行 shell 脚本,当然为了让脚本更简洁,我将常用的命令封装成 Makefile

    具体实例请查看:https://github.com/miss55/docker-node/blob/main/README-zh.md#%E4%BE%8B%E5%AD%90

    配合 vscode 的 Remote 扩展 进行远程开发

    搜索 vscode 扩展,关键字: Remote Development ,看着自己的需求添加相应的扩展即可

    具体教程可以参考vscode 官网的教程

    简单教程:

    1. 新开一个 vscode [ ctrl + shift + n ]
    2. 连接到服务器 [ ctrl + shift + p ] + [ connect to host ]
    3. 如果还没配置,则选择 Add New SSH Hosts 去添加即可
    4. 连接成功后,如果没有选择项目目录,则可以自行选择
    第 1 条附言  ·  2024-07-23 21:33:20 +08:00

    大伙的解决方案 总结:

    前三是用的最多的

    1. fnm + win 界面用nvm-desktop
    2. nvm + .nvmrc
    3. volta
    4. Jetbrains WebStorm 可选node
    5. vfox
    6. mise
    7. 手动临时变更环境变量
    8. 虚拟机
    62 条回复    2024-07-30 14:49:42 +08:00
    BG7ZAG
        1
    BG7ZAG  
       2024-07-20 12:36:59 +08:00   ❤️ 2
    命令行用 fnm
    win 界面用[nvm-desktop]( https://github.com/1111mp/nvm-desktop)
    amlee
        2
    amlee  
       2024-07-20 12:42:02 +08:00   ❤️ 1
    docker 不是有 devcontainer 么
    jiuzhougege
        3
    jiuzhougege  
       2024-07-20 12:51:09 +08:00
    nvm 香,就是不同项目需要的 pnpm 需要显式指定
    qiqw
        4
    qiqw  
       2024-07-20 13:01:07 +08:00   ❤️ 1
    volta
    angrylid
        5
    angrylid  
       2024-07-20 13:03:35 +08:00   ❤️ 1
    我用的 fnm ,不过这东西有个问题,就是有时候已经切到了新的 LTS ,但是 VSCode 的 Debugger 依然认为 path 里面的版本是 10 ,版本过旧无法 auto attach ,必须 Command + Q 强行重启
    foam
        6
    foam  
       2024-07-20 13:05:31 +08:00 via Android   ❤️ 1
    开发阶段 nvm 完全没烦恼,不同项目放置一个自己的 nvmrc 文件,打开的时候 nvm use 。然后都能保持不同的 node 版本互不干扰。比 docker 好用多了。
    lingyired
        7
    lingyired  
       2024-07-20 13:10:26 +08:00
    用的 nvs ,nvs 的 node 版本环境只在当前 cmd 窗口有效。也就是可以多个 cmd 同时使用多个 node 不同的版本。

    然后使用 Quicker 绑定了很多命令,每次打开 cmder ,就使用 Quicker 的单个快捷键输入多个命令,分别是:

    cd /path/to/project

    nvs use node/x.y.z/x64

    这样就进入刚项目的同时切换到对应的 node 版本了,这个 node 版本只在当前 cmd 窗口有效。
    wyl986
        8
    wyl986  
       2024-07-20 13:24:13 +08:00
    用 vagrant 上虚拟机 homestead ,在 ubuntu 里面装 nvm ,nvm 会把 node/npm/yarn/pnpm/pm2 这些装到 /root/.nvm/${version}/node/bin 下面,启动项目的时候指定一下用的哪个 npm/yarn/pnpm 就可以了(你可以在 package.json 里面指明),这样可以实现同时运行多个版本的 node

    虽然是虚拟机,但是是命令行的,性能完全够的,一点也不卡
    smilingsun
        9
    smilingsun  
       2024-07-20 13:26:59 +08:00 via Android
    Devbox 或者 nix shell ?
    blurethdao
        10
    blurethdao  
       2024-07-20 13:38:50 +08:00 via iPhone
    一般不会有太多 node 版本装两个 wsl 就够用了
    aofall
        11
    aofall  
       2024-07-20 13:38:54 +08:00
    我用的 Jetbrains WebStorm 开发的,可以在工程配置中自由选择 Node 解释器版本,平时一般用不上 nvm 来切换版本
    sunshower
        12
    sunshower  
       2024-07-20 13:51:06 +08:00
    volta+1
    asdjgfr
        13
    asdjgfr  
       2024-07-20 13:54:01 +08:00
    volta ,目前在 windows 上和 linux 上都没遇到什么问题
    jenson47
        14
    jenson47  
    OP
       2024-07-20 13:55:47 +08:00
    @amlee Remote Development 套件确实有,不过有时候我就懒得重复配置,我希望在一个地方配置,其他地方就不关心。所以我专注放到 .env.development 配置
    yangg
        15
    yangg  
       2024-07-20 15:30:45 +08:00
    本地开发 volta ,最能避免 lz 的手动切换问题
    body007
        16
    body007  
       2024-07-20 15:37:16 +08:00   ❤️ 1
    我用 vfox
    mashpolo
        17
    mashpolo  
       2024-07-20 15:43:29 +08:00
    用的 mise 来管理 node ,python ,go 等多版本的问题
    nzbin
        18
    nzbin  
       2024-07-20 15:48:32 +08:00
    nvm ,本地开发,8G 内存,来回切换确实麻烦点,但是也能接受
    dcsuibian
        19
    dcsuibian  
       2024-07-20 15:56:51 +08:00
    fnm ,也就是 Fast Node Manager 。这个很好用,可以在项目文件夹下面放一个.node-version 文件,这样 cd 进去时就自动切换到对应的版本了。
    waiaan
        20
    waiaan  
       2024-07-20 16:55:50 +08:00
    volta+1
    darksword21
        21
    darksword21  
    PRO
       2024-07-20 17:07:38 +08:00 via iPhone
    nix
    emacs tramp
    faimin
        22
    faimin  
       2024-07-20 17:44:51 +08:00
    volta +1
    8E9aYW8oj31rnbOK
        23
    8E9aYW8oj31rnbOK  
       2024-07-20 18:30:09 +08:00
    我一直用虚拟机...
    Belmode
        24
    Belmode  
       2024-07-20 18:48:52 +08:00
    手动临时变更环境变量
    otakustay
        25
    otakustay  
       2024-07-20 18:56:04 +08:00
    有.nvmrc 不就会自动切版本了吗
    jenson47
        26
    jenson47  
    OP
       2024-07-20 19:20:55 +08:00
    @foam
    @lingyired @otakustay 确实是我对 nvm 研究没那么深入,之前在 window 上出现切换需要权限问题,后面就放弃多版本切换,恰好当时还比较喜欢完 docker 就想着直接丢到 docker 上,如此以来需要什么依赖跟宿主机就没关系了,在一定程度上保证宿主机的干净
    IAmAnonymous
        27
    IAmAnonymous  
       2024-07-20 19:29:32 +08:00
    node 小白问个问题,我引入一个库 npm install 之后
    162 vulnerabilities (1 low, 92 moderate, 66 high, 3 critical)

    然后 npm audit fix --force
    IAmAnonymous
        28
    IAmAnonymous  
       2024-07-20 19:30:07 +08:00
    node 小白问个问题,我引入一个库 npm install 之后
    162 vulnerabilities (1 low, 92 moderate, 66 high, 3 critical)

    然后 npm audit fix --force

    变成
    8 vulnerabilities (2 moderate, 6 high)

    应该怎么解决
    zbowen66
        29
    zbowen66  
       2024-07-20 20:19:00 +08:00
    @angrylid #5 不是有个命令叫 reload window 吗,可以试试
    n18255447846
        30
    n18255447846  
       2024-07-20 20:33:36 +08:00
    用 prebuilt binaries 不就行了,把 node 命令换成绝对路径,想要哪个用哪个,
    n18255447846
        31
    n18255447846  
       2024-07-20 20:39:55 +08:00
    @IAmAnonymous npm 常规操作,能跑没什么好解决的,无非就是一些包过时了或有一些安全问题被扫到了。

    非要解决就升级风险包到 latest ,不过升级是一件费力不讨好的事。另外如果最新的包还有安全问题,就换个。
    IAmAnonymous
        32
    IAmAnonymous  
       2024-07-20 21:04:19 +08:00
    @n18255447846 其实只要能跑,不用管这个 vulnerabilities 是 low ,mediate, high, critical 是吗?谢谢
    mabelrussell
        33
    mabelrussell  
       2024-07-20 22:31:08 +08:00
    asdf
    14
        34
    14  
       2024-07-20 22:40:18 +08:00   ❤️ 1
    我是用 nvm ,在不同项目放不同的 .nvmrc 文件,.nvmrc 文件声明版本号,cd 到任意目录 nvm use 就能跑。
    然后在 packages.json 声明 engines 指定版本,这样忘记 nvm use 执行 npm 相关命令会报错。
    PrtScScrLk
        35
    PrtScScrLk  
       2024-07-20 22:42:49 +08:00
    @14 感觉是个不错的方式,从 14 到现在的 20 ,版本问题其实挺头疼的,现在启动项目都要问一嘴用什么版本。显式的配置文件去声明版本是一个很好的方式呀哈哈哈
    FightPig
        36
    FightPig  
       2024-07-20 22:43:26 +08:00
    一直用的 nvm ,以前觉得挺卡的,后来换成 fish 后觉得还行
    yagamil
        37
    yagamil  
       2024-07-20 23:04:06 +08:00
    目前的我的开发都尽量避免在本地环境开发,毕竟没有几个公司能给你 64GB 的内存。

    远程开发我感觉还更加不爽。。。本地台式机器 64GB ,很容易呀。
    bxh8640123
        38
    bxh8640123  
       2024-07-20 23:05:35 +08:00 via Android
    nvm + nvmrc + zsh vvm auto use
    Cbdy
        39
    Cbdy  
       2024-07-20 23:13:13 +08:00
    直接把 node 安装到项目目录不就可以了吗?几行 shell 脚本的事儿
    可以参考 gradle 的 toolchains
    Heymans
        40
    Heymans  
       2024-07-20 23:13:17 +08:00
    可以使用 vscode 的 dev container, 结合 docker 使用
    amlee
        41
    amlee  
       2024-07-20 23:33:13 +08:00   ❤️ 1
    @14 为了方便,还以在 scripts 中加一个 predev 或 prestart 执行 nvm use
    Retas
        42
    Retas  
       2024-07-20 23:43:10 +08:00
    nvm + 项目根目录 .nvmrc 声明版本 + shell 脚本检查当前目录 .nvmrc 文件自动切换 node 版本,个人体感最佳。接手新项目先问清 node 版本,狠狠地塞一个 .nvmrc 文件后面就全自动切换了
    supuwoerc
        43
    supuwoerc  
       2024-07-21 00:02:40 +08:00
    volta
    yoshiyuki
        44
    yoshiyuki  
       2024-07-21 00:38:43 +08:00
    用 nvm 装到系统路径里,不同项目内使用 webstorm 的 run config 来选定对应版本,要运行命令的时候就从图形化界面点一下 run
    ysc3839
        45
    ysc3839  
       2024-07-21 00:46:52 +08:00
    我选择用 fnm ,包括 Windows 也用
    paradox8599
        46
    paradox8599  
       2024-07-21 01:20:34 +08:00 via Android
    目前用的 vfox ,有多平台和多语言支持,不止 nodejs
    n18255447846
        47
    n18255447846  
       2024-07-21 01:38:18 +08:00
    @IAmAnonymous 是的。node 包只要装成功了没输出 ERR 报错就能跑,npm 其实有个选项可以关闭 audit
    IAmAnonymous
        48
    IAmAnonymous  
       2024-07-21 02:02:00 +08:00
    @n18255447846 哦哦,谢谢
    mgcnrx11
        49
    mgcnrx11  
       2024-07-21 10:45:08 +08:00
    在使用 nvm 管理 nodejs 的版本之后,会发现 包管理器 的版本用 corepack 来做管理就会出现问题。在用 nvm 之后,npm 的版本会跟随 nodejs 版本切换而切换,但是 corepack 安装的 pnpm 缺无法自动切换了。

    导致的结果是可能会用上了不兼容的 nodejs 和 pnpm 版本。不知道有什么好的实践方式?

    能想到的是通过环境变量 COREPACK_HOME 来隔离不同的 corepack 安装路径
    ByteCat
        50
    ByteCat  
       2024-07-21 11:18:27 +08:00
    以前用 nvm ,现在换 fnm 了,很好用。包管理器用 corepack 来管理
    zb1141920796
        51
    zb1141920796  
       2024-07-21 12:45:56 +08:00
    @ByteCat corepack 是只要安装一个版本的吗?例如 pnpm ,我 node 切换不同的版本,Pnpm 的支持版本也是会变的吧,我现在 nvm 说是每切换一个 node 版本,pnpm 这些都是需要重新安装的
    ByteCat
        52
    ByteCat  
       2024-07-21 13:21:42 +08:00
    @zb1141920796 我现在的用法是安装一个系统级 nodejs-lts ,这个可以通过包管理器比如 Windows 上的 scoop 来管理更新,然后用这个 node-lts 的 corepack 来使用 pnpm 或者 yarn 之类的,然后用 fnm 管理不同版本的 node 版本。
    thevita
        53
    thevita  
       2024-07-21 16:30:26 +08:00
    asdf
    GuguDan
        54
    GuguDan  
       2024-07-22 09:13:20 +08:00
    pnpm env use x.x.x -g
    miniaoes
        55
    miniaoes  
       2024-07-22 10:13:59 +08:00
    volta ,node 版本锁死在 package.json 里会自动切换
    hi2hi
        56
    hi2hi  
       2024-07-22 10:52:31 +08:00
    我目前是纯 node 在虚拟机里面写;小程序这种需要本地 UI 的,本地写; windows 下还是 nvm 切换。尽可能保证统一的 node 版本。
    LunaSeki
        57
    LunaSeki  
       2024-07-22 11:03:57 +08:00
    用 vlota 显式 pin 一下对于多项目不同版本的场景比较方便
    ydfk
        58
    ydfk  
       2024-07-22 11:26:16 +08:00
    volta+1
    多项目管理非常方便
    remember5
        59
    remember5  
       2024-07-22 15:49:06 +08:00
    nvm 转到 vfox 了
    shintendo
        60
    shintendo  
       2024-07-22 17:52:50 +08:00
    volta 暴打所有手动切版本和 CD 切版本
    unco020511
        61
    unco020511  
       2024-07-23 10:42:41 +08:00
    我给你一个思路,同样的问题,gradle 的解决方案是 Gradle Wrapper,理论上应该有一个 node Wrapper 来自动处理这个事情
    giserman001
        62
    giserman001  
       2024-07-30 14:49:42 +08:00
    @foam win 切换不了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2263 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:07 · PVG 00:07 · LAX 09:07 · JFK 12:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.