sdjl
V2EX  ›  Node.js

运行环境是 Node12,如何知道用 npm 安装依赖库时应该指定哪个版本号?

  •  
  •   sdjl · Jan 14, 2023 · 5218 views
    This topic created in 1256 days ago, the information mentioned may be changed or developed.

    我对 node 不是很熟悉,微信小程序的云函数运行在 node12.16 上,但是我的开发电脑是 M1 的 Macbook ,本地安装的是 node16.

    我发现,如果我用 npm 安装依赖库时不指定版本号,可能会出现在本地( node16 )正常运行,但上传到云环境(node12.16)后不能正常运行的情况。

    我也想过在本地安装一个 node12 ,但发现在 M1 芯片的 Mac 上安装 node12 很麻烦。

    所以,我想的是如果用 npm install 依赖库的时候,指定适合 node12.16 这个环境的版本号是不是可以解决问题?

    或者,有没有其他更好的办法? 谢谢,我最近刚学用 node ,不是很了解。

    22 replies    2023-01-16 16:10:29 +08:00
    sdjl
        1
    sdjl  
    OP
       Jan 14, 2023
    顺便问一下,运行在 node12 下的网络请求库,哪一个比较合适? request? got? axios? node-fetch?
    theohateonion
        2
    theohateonion  
       Jan 14, 2023   ❤️ 1
    打包上去的云函数因为 package-lock.json 里面指定了 v16 版本 node 的依赖,所以肯定在云函数 12.16 的 runtime 上面跑不起来。最快的做法是用 nvm 保持本地 node 和远端一致,省事不是很折腾。
    theohateonion
        3
    theohateonion  
       Jan 14, 2023
    request 库这种问题请善用 google https://letmegooglethat.com/?q=awesome+node+request
    superrichman
        4
    superrichman  
       Jan 14, 2023 via Android
    直接给云环境升级
    Pastsong
        5
    Pastsong  
       Jan 14, 2023
    node 12 很久就停止支持了,建议升级到 16
    xianyu191031
        6
    xianyu191031  
       Jan 14, 2023
    npm install n -g && n 12.16
    ysc3839
        7
    ysc3839  
       Jan 14, 2023 via Android
    “在 M1 芯片的 Mac 上安装 node12 很麻烦”
    不是有兼容层吗?直接跑 x64 的不行?
    ysc3839
        8
    ysc3839  
       Jan 14, 2023 via Android
    不过其实你装了 12 也没用,npm 安装会自动装最新版的库,如果最新版不兼容旧的 Node.js 那你还是得手动调整版本,一般是去看库的文档,有的库也会把 Node.js 最低要求写在 package.json 里。
    ysc3839
        9
    ysc3839  
       Jan 14, 2023 via Android
    @sdjl 网络请求的话,我没有特殊需求选 fetch ,有特殊需求选 axios 。
    learningman
        10
    learningman  
       Jan 14, 2023
    如果只是想解决
    “上传到云环境(node12.16)后不能正常运行“
    那装个 babel + webpack ,把 target 设成 node12 不就好了吗
    HugoChao
        11
    HugoChao  
       Jan 14, 2023
    使用 nvm 切换本地 node 版本即可
    techmale
        12
    techmale  
       Jan 14, 2023
    基于 `nvm` 的版本控制

    1. 通过 `nvm` 下载(或切换)你需要的版本

    ```bash
    # 下载某个版本
    nvm install 10

    # 临时切换 (当前 shell)
    nvm use 10

    # 设置默认版本
    nvm alias default 16
    ```

    2. 在 `package.json` 中加入你想限定的版本 e.g.

    ```json
    "engines": {
    "npm": ">=8.0.0 <9.0.0",
    "node": ">=16.0.0 <17.0.0"
    },
    ```

    3. 通过配置文件快速切换 (dotfile)

    ```bash
    # 导出当前 Node.js 版本 以供随后使用
    nvm version > .nvmrc

    # 根据 .nvmrc 切换至相应版本
    nvm use
    ```
    sdjl
        13
    sdjl  
    OP
       Jan 14, 2023
    @superrichman "直接给云环境升级"

    升不了吧,这个是腾讯云开发指定的版本。
    sdjl
        14
    sdjl  
    OP
       Jan 14, 2023   ❤️ 1
    @techmale 谢谢,我了解一下
    byp
        15
    byp  
       Jan 14, 2023   ❤️ 1
    本地安装 nvm, 随意切换 node 版本很方便
    sdjl
        16
    sdjl  
    OP
       Jan 14, 2023
    谢谢大家,我尝试在 package.json 文件中添加 "engines": { "node": "12.16" } 看看
    sdjl
        17
    sdjl  
    OP
       Jan 14, 2023
    "engines": { "node": "12.16" } 这个不行。。。
    sdjl
        18
    sdjl  
    OP
       Jan 14, 2023
    我用 brew 装了个 nvm
    然后用 nvm 安装了 node12.16
    安装顺利,没有网上说的麻烦,谢谢大家。
    sdjl
        19
    sdjl  
    OP
       Jan 14, 2023
    @byp “本地安装 nvm, 随意切换 node 版本很方便”

    谢谢,用这个办法解决了。
    wu67
        20
    wu67  
       Jan 14, 2023
    其实 docker 完美解决这种痛点, 爱装什么哪个就哪个, 直接锁死用生产环境的 node 版本, 不用担心自己想用最新的环境造轮子时发现各种蛋疼.
    我们公司的项目就是超过 16.14 就跑不起来, 有个依赖不更新了...暂时又找不到替代, 也没时间去找替代. 入职第二周我就开始折腾出一个 docker 方案了, 唯一的缺点就是跑 docker 费内存...
    DICK23
        21
    DICK23  
       Jan 14, 2023
    nvm install 12 然后运行,另外都已经到 12 了,直接升 16lts 也没啥问题
    sdjl
        22
    sdjl  
    OP
       Jan 16, 2023
    @wu67 @DICK23

    谢谢,我的运行环境是微信小程序云开发,版本号是微信指定的,我改不了,也用不了 docker
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5551 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 06:49 · PVG 14:49 · LAX 23:49 · JFK 02:49
    ♥ Do have faith in what you're doing.