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

前端包管理工具调研

  •  
  •   cxhello · 1 天前 · 4117 次点击
    • npm
    • cnpm
    • pnpm
    • yarn
    • npx

    各位 V 友们,你们在使用包管理工具有什么使用优先级吗?它们的区别是什么?作为一个后端,有时候会做一些前端开发,会纠结这些。虽然是瞎纠结,但还是想听各位 V 友们讲讲。

    第 1 条附言  ·  1 天前
    Mac 开发 fnm + node + pnpm 是不是现在的最佳选择?
    86 条回复    2025-04-03 21:49:37 +08:00
    ice980
        1
    ice980  
       1 天前
    pnpm ,省硬盘空间
    feeloong
        2
    feeloong  
       1 天前
    node>20 pnpm 低于 20 用 cnpm
    Track13
        3
    Track13  
       1 天前
    npm ,硬盘就是大😎
    volantRookie
        4
    volantRookie  
       1 天前   ❤️ 4
    yarn ,不知道为什么,觉得它好用,我不是前端,我是后端
    NoManPlay
        5
    NoManPlay  
       1 天前
    pnpm/yarn,看版本
    huijiewei
        6
    huijiewei  
       1 天前
    pnpm or bun
    Laobai
        7
    Laobai  
       1 天前
    习惯用 yarn 了
    FFFFourwood
        8
    FFFFourwood  
       1 天前 via iPhone
    npm yarn
    imba97
        9
    imba97  
       1 天前
    pnpm

    npx 不是包管理,是执行包脚本的
    imba97
        10
    imba97  
       1 天前
    除了节省空间,pnpm 的 workspace 、patch 管理都挺好用,不用额外安装其他东西
    Torpedo
        11
    Torpedo  
       1 天前
    pnpm 速度快很多。缺点就是改 node_modules 里的代码不太方便
    shintendo
        12
    shintendo  
       1 天前
    npx 跟其它的不是一类东西
    yarn 对现在的 npm 没有明显优势
    cnpm 绝对不要用
    npm 和 pnpm 选一个
    DOGOOD
        13
    DOGOOD  
       1 天前
    用 npm 和 yarn 的遇到幽灵依赖就老实了😏
    wxw752
        14
    wxw752  
       1 天前   ❤️ 2
    作为一个后端,我一般都是挨个试试,不行就删掉那个文件夹再换一个跑...
    Rust2015
        15
    Rust2015  
       1 天前
    @shintendo npx 是脚手架
    shiloh595
        16
    shiloh595  
       1 天前
    不用 pnpm 的都 gck
    monologue520
        17
    monologue520  
       1 天前
    钟爱 npm
    因为比 yarn 和 pnpm 都少了一个字母😏
    shintendo
        18
    shintendo  
       1 天前
    @Rust2015 npx 也不是脚手架……是执行 npm 包脚本的
    Danswerme
        19
    Danswerme  
       1 天前
    pnpm + fnm
    wildnode
        20
    wildnode  
       1 天前
    公司项目 pnpm
    个人项目 bun
    meteor957
        21
    meteor957  
       1 天前 via Android
    volta 代替 fnm
    Menus
        22
    Menus  
       1 天前
    pnpm
    moefishtang
        23
    moefishtang  
       1 天前
    npm
    后面想试试 bun
    mxT52CRuqR6o5
        24
    mxT52CRuqR6o5  
       1 天前
    pnpm 更现代,没有幻影依赖,能用 pnpm 就别考虑别的了吧
    weixiangzhe
        25
    weixiangzhe  
       1 天前
    pnpm 或者 npm
    yarn 我看大家都是 1.22 版本,但是现在已经 4.x 了,对比 npm 10 没啥优势,对 peer-dependences 默认是不处理
    yarn 2.0 以上又没有 node_module 大部分人都不会用
    Cbdy
        26
    Cbdy  
       1 天前
    pnpm
    imNull
        27
    imNull  
       1 天前
    我是后端,一开始用 npm ,后来用 yarn (感觉出现依赖问题相对 npm 少),现在用 pnpm ,install 非常快
    SoulGem
        28
    SoulGem  
       23 小时 16 分钟前 via iPhone
    yarn
    wangtian2020
        29
    wangtian2020  
       23 小时 14 分钟前
    npm 没什么问题,如果你遇到特定的问题就换其他的包管理器,遇不到 npm 就行了
    l4ever
        30
    l4ever  
       15 小时 10 分钟前
    npm, 主要是自带直接用, 方便.
    Akuta
        31
    Akuta  
       14 小时 58 分钟前
    稳定实用选 pnpm ,拥抱新技术选 bun
    Avedge
        32
    Avedge  
       14 小时 41 分钟前
    yarn 或者 npm
    caiqichang
        33
    caiqichang  
       14 小时 37 分钟前
    npm
    P.S. npm 和 npx 不算同一个吗
    kinghly
        34
    kinghly  
       14 小时 28 分钟前 via Android
    pnpm
    lyxxxh2
        35
    lyxxxh2  
       14 小时 26 分钟前
    npm: 我一直用这个,因为是默认,既然是默认,稳定性总比其他好吧。
    npm: 以前没代理才用他,有些包还是有网络问题的。后面一直代理,省心省事,速度可能还更快(用的 40 ¥/月的机场)。
    pnpm: 只是听说过,似乎是 vue3 之后才有的
    yarn: 用过几次,我都不知道他和 npm 区别。
    npx: 需要多个 node 版本,才需要用。
    thinkwei2012
        36
    thinkwei2012  
       14 小时 19 分钟前
    老项目 npm/yarn

    新项目 pnpm 省硬盘

    不知道是不是错觉,感觉 yarn 在一些项目里兼容性比较强?反正有几个老项目使用 npm 安装就一堆报错,删掉 node_modules 使用 yarn 安装就可以……
    acthtml
        37
    acthtml  
       14 小时 18 分钟前
    都用过,现在只用 npm 。

    原因是不折腾、硬盘大、命令用不了几次。
    shaozelin030405
        38
    shaozelin030405  
       14 小时 15 分钟前
    npm 、pnpm
    sdrpsps
        39
    sdrpsps  
       14 小时 5 分钟前
    pnpm 或 bun
    abc1310054026
        40
    abc1310054026  
       14 小时 2 分钟前
    人生苦短,npm 。
    lemonfishTBS
        41
    lemonfishTBS  
       14 小时 0 分钟前
    porn 和 hub
    sakae010
        42
    sakae010  
       13 小时 58 分钟前
    fnm+pnpm or bun
    um1ng
        43
    um1ng  
       13 小时 53 分钟前
    yarn / pnpm ,每个项目会配置对应的 packageManager ,配合开启 corepack 使用
    youyouzi
        44
    youyouzi  
       13 小时 52 分钟前
    npm 主打就是一个不折腾
    GuoJikun
        45
    GuoJikun  
       13 小时 51 分钟前
    用 pnpm 吧! pnpm 本身还可以管理 nodejs 版本,这样可以舍弃 fnm 了
    sjhhjx0122
        46
    sjhhjx0122  
       13 小时 50 分钟前
    人生苦短,pnpm
    chenzw2
        47
    chenzw2  
       13 小时 49 分钟前
    fnm 比 nvm 好用吗?
    lerry
        48
    lerry  
       13 小时 47 分钟前
    bun 一把梭
    montaro2017
        49
    montaro2017  
       13 小时 46 分钟前
    yarn
    9956
        50
    9956  
       13 小时 45 分钟前
    目前在用 bun 、volta
    TimPeake
        51
    TimPeake  
       13 小时 14 分钟前
    老项目/第三方模版框架 npm ,新项目毫无疑问 pnpm
    jspatrick
        52
    jspatrick  
       13 小时 13 分钟前
    yarn@1, pnpm
    ColdBird
        53
    ColdBird  
       13 小时 12 分钟前
    yarn/pnpm
    aprilandjan
        54
    aprilandjan  
       13 小时 8 分钟前 via iPhone
    没有人觉得 pnpm 在键盘位置上的分布感觉敲起来很费力吗😓
    sn0wdr1am
        55
    sn0wdr1am  
       13 小时 8 分钟前
    pnpm
    bzw875
        56
    bzw875  
       12 小时 47 分钟前
    pnpm 虽然省空间,但是 yarn 更好用
    qrobot
        57
    qrobot  
       12 小时 30 分钟前
    1. npm - 简单高效, 保持最新版本, 支持 workspace 也能解决一些对等依赖的问题, 前提是要保持 node 最新版本才好用
    2. cnpm - 只是为了解决国内代理的问题, 这没必要了把?
    3. pnpm - 为了解决 node_modules 占用磁盘的问题, 同样也有 workspace 等等一些功能, 中规中矩
    4. yarn - 历史上最好用的包管理工具, 独特的 Plug'n'Play 模式, 并且完全解决 node_modules 所有的缺点. 缺点是不兼容目前大部分的国产框架, 例如 dumi 等等, 并且使用起来复杂, 需要安装额外的工具, 学习成本高


    要是我, 可能 yarn 的 Plug'n'Play 最为第一公民
    gorvey
        58
    gorvey  
       12 小时 21 分钟前
    新项目 pnpm
    老项目 yarn ,谁用谁知道,跑老项目版本问题能卡你好几天,换成 yarn 一次成功
    auroraccc
        59
    auroraccc  
       12 小时 4 分钟前
    @aprilandjan 改个别名,官方文档推荐改成 pn
    EgoTao
        60
    EgoTao  
       12 小时 0 分钟前
    赞成大多数人说的,低版本/老项目就 yarn ,node 版本比较新就 pnpm 。 如果只选一个,那我推荐 yarn
    9ki
        61
    9ki  
       10 小时 26 分钟前
    自己玩 pnpm

    公司项目 yarn/npm 这俩基本都会用,vue 偏向 npm ,react 偏向 yarn
    qxqsxbd
        62
    qxqsxbd  
       10 小时 21 分钟前
    npx 不是包管理器(它是包管理器的管理器),然后 yarn 最习惯,不为别的,敲这四个字母手指在键盘上移动的最少
    skiy
        63
    skiy  
       10 小时 3 分钟前
    bun 呢?
    shunia
        64
    shunia  
       9 小时 49 分钟前   ❤️ 1
    @qrobot #57 不是,你说了这么多缺点,那是怎么得出来它是历史上最好用的包管理工具的结论的?

    另外 pnpm 老早就支持 PnP 了,但是目前我还真没见多少人给出这个模式到底解决了什么问题,产生了什么独特的优势,甚至其实就像你说的,它反而还很容易产生新的问题。

    再一个我司 10 年前就重度使用 yarn 了,讲真,用了几年后真的不想再用了。yarn 的报错体系非常糟糕,兼容性在彼时也问题多多,出现的一些诡异问题,在社区是很难得到有效支持的,彼时 yarn 的理念导致了很多功能需要你自行处理,社区对此也很无奈。

    直到 pnpm 出来之后,我才发现社区也能做出好的包管理器,功能上它愿意往前多走一步,从社区的角度来说他们也没有什么非常苛刻的离奇的理念,来阻止或者说避免去开发某一个功能。和 yarn 比,yarn 已经显得裹脚布了。

    再一个 yarn 最大的问题是从 classic 到 v2 的变更,花费了过长的时间,同时还约等于交出了一张白卷。除了 PnP 基本没有交出什么像样的产品特性。

    你现在去看 yarn 对 PnP 的介绍,你都没法理解它说的几点优点到底哪里算是优点。甚至介绍文档的最后还要极力劝解你:哎呀我们这个 PnP 真的不复杂,没事的,你试试吧。真的就让人很无语。
    shunia
        65
    shunia  
       9 小时 48 分钟前
    @skiy #63 bun 支持的特性有缺失,不建议投入生产。
    gxvsko
        66
    gxvsko  
       9 小时 36 分钟前
    yarn pnp 零安装 模式,硬盘不值钱
    zhsama
        67
    zhsama  
       9 小时 33 分钟前
    pnpm / bun
    shiny
        68
    shiny  
       9 小时 33 分钟前
    bun only
    hafuhafu
        69
    hafuhafu  
       9 小时 32 分钟前
    npm pnpm
    zld150
        70
    zld150  
       9 小时 0 分钟前
    @Torpedo 打补丁
    qrobot
        71
    qrobot  
       8 小时 52 分钟前
    @shunia #64 yarn 的 pnp 是一个跨时代意义的变化, 至少 yarn 2 (2020 年 1 月), 之后 pnpm(202 年 9 月) 才加入了 PnP 进行支持. Yarn 解决一个最大的问题就是文件碎片的问题, 过多的 node_modules 包会导致庞大的文件碎片, 操作系统在处理这些文件碎片的时候, 这无疑性能损失是非常巨大的.

    我自己做的新框架就是采用 Plug'n'Play 作为第一公民, 解决了我很多问题, 例如常见的 peerDependencies 的问题, resolutions 问题, 我很早就开始使用 npm, 如果不是因为 npm 怠惰, 连基本的 workspace 和 overrides 都没有.


    至于我说的 "不兼容目前大部分的国产框架", 这本身不是 Yarn 的错误, 而是其他框架没有进行适配, 人不可能一成不变把?


    为了让 Yarn 的 Plug'n'Play 作为第一公民, 我重写 umi, 以及 dumi 还有 father 等构建工具, 将 esmodule 和 Plug'n'Play 作为第一公民我觉得是非常必要的, 前端在发展最终 esmodule 和 pnp 这是必然的结局, 或许几年后 yarn 可能推动 npm 做出改变, 然后 npm 默认就支持 pnp 也没准



    参照地址

    - https://yarnpkg.com/blog/release/2.0
    - https://github.com/pnpm/pnpm/pull/2908
    qrobot
        72
    qrobot  
       8 小时 49 分钟前
    @shunia #64 我别的工具使用的少, 目前常用的就是 npm/yarn, 新项目用 yarn, 老项目用 npm. yarn 稳定可靠, 至少不会出现 10 年前的项目, 十年后就跑不起来, 也至少不会经常在内网环境各种依赖下载的问题. 也不会遇到类似于 fakerjs 这种供应链攻击
    mlhiter955
        73
    mlhiter955  
       8 小时 39 分钟前
    不用想那么多,轻度用户就用 npm ,重度用户就用 pnpm
    shunia
        74
    shunia  
       8 小时 34 分钟前
    @qrobot #71
    首先你把 pnpm 完全过滤掉了,根本没提及,说明你没用过?那么什么所谓把 yarn 当作一等公民的比较就是不公平的。

    其次请帮忙解释一下 pnp 究竟是如何解决各种 dependecies 相关的问题的,以及它是如何避免操作系统处理文件碎片的问题的。第一个依赖相关的问题,即便是在解决这类问题最激进的 pnpm 项目里,也没有完全解决相关的所有问题。第二个文件碎片的问题,我不知道是你表达错误还是怎样,我不理解的是文件总数不变的情况下,它怎么解决了这个性能损失的。pnpm 增加了硬链接,肯定增加了额外的性能损耗,但是有数据支撑 PnP 比 pnpm 的硬链接提升了多少性能吗?提升的是什么样的性能?在多大的项目里会产生决定性的变化?

    即便 npm 哪一天默认支持 PnP ,那也只是一个特性而已,就好比 pnpm 支持 worksapce 的时候也只是一个特性,没有什么所谓的公民一说,其他更上层的工具链在当时也能做好 workspace 管理,反而是 pnpm 的 workspace 确实做的很好,所以下游的上层工具才纷纷接入和支持此一特性。yarn 的 PnP 呢,我的天老爷,提出来多少年了,哪个项目建议你用 PnP 模式运行了?

    最后,yarn 的稳定可靠是依赖于 dependencies 本身不作妖,不是 yarn 的功劳。老项目跑不起来只有一种可能,依赖链断裂,这种情况,yarn 处理不了,npm 、pnpm 也处理不了,不存在 yarn 能做好这件事这么一说。你可能没跑过 10 年前的项目,不好意思我跑过,yarn 也搞不定。你对这个问题的理解我觉得有问题。

    请多使用事实来说明问题。比如我就知道 pnpm 是很早就支持了 PnP 的,差那两年有没有可能是因为 PnP 作为一个特性并没有被完善的定义?或者说至少它完全不是像你说的所谓“独特的”特性。
    nicenight
        75
    nicenight  
       8 小时 25 分钟前
    pnpm 党+1 ,另外要注意 win 和 linux 环境中运行会有一点差别,比如文件名大小写
    UnluckyNinja
        76
    UnluckyNinja  
       7 小时 53 分钟前 via Android
    monorepo 首选 pnpm ,其他家都还没实现 catalogs 功能吧,等于目前 pnpm 独占,缺点是默认全部重新获取包信息,哪怕前后脚。
    bun 是默认离线,快很多,但我一直没找到 bun 怎么启用非扁平 node_modules 结构。此外 bun 不作为包管理器也可以作为运行时使用(不过生产还是不太稳定,1.2.5 遇到了个发布包登陆 npm 无效的 bug )
    SergeGao
        77
    SergeGao  
       7 小时 49 分钟前
    不用选,用 pnpm 就行了,可以理解为别的几个(除了 npx )都是已经/即将被淘汰的包管理解决方案,ps:npx 和别的几个不是一个维度的东西
    uni
        78
    uni  
       7 小时 1 分钟前
    全部不用,只用 bun
    meteora0tkvo
        79
    meteora0tkvo  
       7 小时 0 分钟前
    一些老的依赖只能用 yarn ,用 pnpm 多多少少会有点问题
    zhoushuo
        80
    zhoushuo  
       6 小时 51 分钟前
    pnpm
    qrobot
        81
    qrobot  
       6 小时 30 分钟前
    @shunia #71


    如果是 Yarn 安装的项目, 则 100 年以后 仍然可以用 Yarn 进启动, 哪怕是互联网已经完全断开, 或者说没有任何第三方 npm 的镜像库, 以及 npm 库 Yarn 一样可以启动, 这样就极大的避免了 100 年以后的项目无法启动的问题

    你是没有使用 Yarn 的 Zero-installs 来安装项目, 何谈 10 年后进行启动? Yarn 的 Zero-installs 就是为了解决你所谓的 10 年后无法启动的问题

    其次 Yarn 重写 node_modules 加载的方式, 这些不用考虑肯定提升了性能

    以前的目录是

    - a
    - esm
    - packages.json
    - b
    - esm
    - packages.json

    这样的接口, 是可以可以展开的文件夹

    而现在变成了

    [email protected]
    [email protected]


    至于性能提高多少, 相信你只要是用过电脑的都知道 copy 一个 1g 的文件, 和 copy 一个一共 1g 的散文件的文件速度.

    优化的效率就在这个地方, 因此所以需要添加 `.pnp.cjs` 和 `.pnp.loader.mjs`来解决这个问题, 应该 node 本身不支持.


    pnpm 只是软连接, 这并没有解决什么问题, 而 yarn 是彻底重构 npm 这是本质区别.


    yarn 不合适初学者, 因为会有很多问题. 这些初学者的问题都解决了, 那么你将会打开一个新的世界, 至少无论压缩体积,还是删除效率还是安装效率至少加快了百分之八十, 甚至一些对等依赖的问题也直接提示给我了.

    Yarn 安全可靠速度快, 没有哪个包管理器目前能做到 Yarn 的这些功能.

    当然大多数人不会在乎现在的项目是否 10 年能启动起来

    参照链接

    - https://yarnpkg.com/features/caching
    qrobot
        82
    qrobot  
       6 小时 27 分钟前
    @shunia #74 为什么把 Yarn 作为第一公民, 因为 Yarn 的 PnP 这一定是未来, 所谓的其他项目不支持,这是改变必须要尽力的过程, 总不能为升级需要变化, 所以一直使用 JDK 8 ? 改变就是好事, 积极拥抱改变才是正道
    qrobot
        83
    qrobot  
       6 小时 22 分钟前
    @shunia #74 这个是真实的性能测试结果


    https://yarnpkg.com/features/performances
    Lemonadeccc
        84
    Lemonadeccc  
       2 小时 48 分钟前
    工作没得选用的 yarn ,自己 pnpm
    mitoop
        85
    mitoop  
       2 小时 38 分钟前
    pnpm 和 bun 优先 bun
    houshuu
        86
    houshuu  
       1 小时 57 分钟前
    直接 pnpm 就行,现在兼容性,速度,易用性的集大成选择。

    pnpm 用官方的安装方式安装之后,也能直接管理 node 环境,不需要装 volta ,fnm 之类的了。
    pnpm 还有一个好处就是大部分教程都有 npm 的命令,终端敲个 p ,然后你就直接复制贴上执行就好,其他包管理你经常还得自己替换命令,累的要死。安装时有脚本执行提示,安全性上也吸收了 deno 的优点。

    上个月尝试切换到 bun ,bun 做包管理器可能还行,但很多 node 的 binary 用 bun 执行直接报错,必须要让 bun 去调用 node 执行。兼容性问题还是挺大的,私下用用还行,上生产那还是太远了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2276 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:47 · PVG 23:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.