Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cxhello
V2EX  ›  Node.js

前端包管理工具调研

  •  
  •   cxhello · 10 天前 · 5419 次点击
    • npm
    • cnpm
    • pnpm
    • yarn
    • npx

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

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

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

    新项目 pnpm 省硬盘

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

    原因是不折腾、硬盘大、命令用不了几次。
    shaozelin030405
        38
    shaozelin030405  
       9 天前
    npm 、pnpm
    sdrpsps
        39
    sdrpsps  
       9 天前
    pnpm 或 bun
    abc1310054026
        40
    abc1310054026  
       9 天前
    人生苦短,npm 。
    lemonfishTBS
        41
    lemonfishTBS  
       9 天前
    porn 和 hub
    sakae010
        42
    sakae010  
       9 天前
    fnm+pnpm or bun
    um1ng
        43
    um1ng  
       9 天前
    yarn / pnpm ,每个项目会配置对应的 packageManager ,配合开启 corepack 使用
    youyouzi
        44
    youyouzi  
       9 天前
    npm 主打就是一个不折腾
    GuoJikun
        45
    GuoJikun  
       9 天前
    用 pnpm 吧! pnpm 本身还可以管理 nodejs 版本,这样可以舍弃 fnm 了
    sjhhjx0122
        46
    sjhhjx0122  
       9 天前
    人生苦短,pnpm
    chenzw2
        47
    chenzw2  
       9 天前
    fnm 比 nvm 好用吗?
    lerry
        48
    lerry  
       9 天前
    bun 一把梭
    montaro2017
        49
    montaro2017  
       9 天前
    yarn
    9956
        50
    9956  
       9 天前
    目前在用 bun 、volta
    TimPeake
        51
    TimPeake  
       9 天前
    老项目/第三方模版框架 npm ,新项目毫无疑问 pnpm
    jspatrick
        52
    jspatrick  
       9 天前
    yarn@1, pnpm
    ColdBird
        53
    ColdBird  
       9 天前
    yarn/pnpm
    aprilandjan
        54
    aprilandjan  
       9 天前 via iPhone
    没有人觉得 pnpm 在键盘位置上的分布感觉敲起来很费力吗😓
    sn0wdr1am
        55
    sn0wdr1am  
       9 天前
    pnpm
    bzw875
        56
    bzw875  
       9 天前
    pnpm 虽然省空间,但是 yarn 更好用
    qrobot
        57
    qrobot  
       9 天前
    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  
       9 天前
    新项目 pnpm
    老项目 yarn ,谁用谁知道,跑老项目版本问题能卡你好几天,换成 yarn 一次成功
    auroraccc
        59
    auroraccc  
       9 天前
    @aprilandjan 改个别名,官方文档推荐改成 pn
    EgoTao
        60
    EgoTao  
       9 天前
    赞成大多数人说的,低版本/老项目就 yarn ,node 版本比较新就 pnpm 。 如果只选一个,那我推荐 yarn
    9ki
        61
    9ki  
       9 天前
    自己玩 pnpm

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

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

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

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

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

    你现在去看 yarn 对 PnP 的介绍,你都没法理解它说的几点优点到底哪里算是优点。甚至介绍文档的最后还要极力劝解你:哎呀我们这个 PnP 真的不复杂,没事的,你试试吧。真的就让人很无语。
    shunia
        65
    shunia  
       9 天前
    @skiy #63 bun 支持的特性有缺失,不建议投入生产。
    gxvsko
        66
    gxvsko  
       9 天前
    yarn pnp 零安装 模式,硬盘不值钱
    zhsama
        67
    zhsama  
       9 天前
    pnpm / bun
    shiny
        68
    shiny  
       9 天前
    bun only
    hafuhafu
        69
    hafuhafu  
       9 天前
    npm pnpm
    zld150
        70
    zld150  
       9 天前
    @Torpedo 打补丁
    qrobot
        71
    qrobot  
       9 天前
    @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  
       9 天前
    @shunia #64 我别的工具使用的少, 目前常用的就是 npm/yarn, 新项目用 yarn, 老项目用 npm. yarn 稳定可靠, 至少不会出现 10 年前的项目, 十年后就跑不起来, 也至少不会经常在内网环境各种依赖下载的问题. 也不会遇到类似于 fakerjs 这种供应链攻击
    mlhiter955
        73
    mlhiter955  
       9 天前
    不用想那么多,轻度用户就用 npm ,重度用户就用 pnpm
    shunia
        74
    shunia  
       9 天前
    @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  
       9 天前
    pnpm 党+1 ,另外要注意 win 和 linux 环境中运行会有一点差别,比如文件名大小写
    UnluckyNinja
        76
    UnluckyNinja  
       9 天前 via Android
    monorepo 首选 pnpm ,其他家都还没实现 catalogs 功能吧,等于目前 pnpm 独占,缺点是默认全部重新获取包信息,哪怕前后脚。
    bun 是默认离线,快很多,但我一直没找到 bun 怎么启用非扁平 node_modules 结构。此外 bun 不作为包管理器也可以作为运行时使用(不过生产还是不太稳定,1.2.5 遇到了个发布包登陆 npm 无效的 bug )
    SergeGao
        77
    SergeGao  
       9 天前
    不用选,用 pnpm 就行了,可以理解为别的几个(除了 npx )都是已经/即将被淘汰的包管理解决方案,ps:npx 和别的几个不是一个维度的东西
    uni
        78
    uni  
       9 天前
    全部不用,只用 bun
    meteora0tkvo
        79
    meteora0tkvo  
       9 天前
    一些老的依赖只能用 yarn ,用 pnpm 多多少少会有点问题
    zhoushuo
        80
    zhoushuo  
       9 天前
    pnpm
    qrobot
        81
    qrobot  
       9 天前
    @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  
       9 天前
    @shunia #74 为什么把 Yarn 作为第一公民, 因为 Yarn 的 PnP 这一定是未来, 所谓的其他项目不支持,这是改变必须要尽力的过程, 总不能为升级需要变化, 所以一直使用 JDK 8 ? 改变就是好事, 积极拥抱改变才是正道
    qrobot
        83
    qrobot  
       9 天前
    @shunia #74 这个是真实的性能测试结果


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

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

    上个月尝试切换到 bun ,bun 做包管理器可能还行,但很多 node 的 binary 用 bun 执行直接报错,必须要让 bun 去调用 node 执行。兼容性问题还是挺大的,私下用用还行,上生产那还是太远了。
    erguotou521
        87
    erguotou521  
       8 天前 via Android
    现在 p 都不喜欢了,都是用 b
    gurachin
        88
    gurachin  
       8 天前
    pnpm 当下最先进的包管理器。bun 私下用用得了
    shunia
        89
    shunia  
       5 天前
    @qrobot #83 感谢你的认真回复。
    几个问题:
    1. pnpm 是硬链接而不是软链接,性能损失肯定有,但是很小,基本可以忽略那种。
    2. 打成 zip 或者任何压缩包以后,我不能理解性能怎么可能变好,难道说压缩包不需要 io 的吗?压缩和解压缩就不消耗性能吗?
    3. 你发的 performance 的图表上,如果我眼睛没花,好像都是 pnpm 最快?是最底下的最快吧,别是我理解错了。
    qrobot
        90
    qrobot  
       5 天前
    @shunia 你看下面的说明. performance 图标上 pnpm 是最快的, 但是下面文字里面也有说明


    Yarn 在 add 和 remove 命令的时候, 速度比 pnpm 快

    Yarn 在新机器上的时候 install 慢于 pnpm , 因为要执行一系列的安全检查

    打包成为 zip 只是为了优化系统对零碎的文件的处理效率, 这个为什么性能变好, 就看各个磁盘怎么处理了.

    例如 FAT16,FAT32,NTFS,exFAT 等 window 下的磁盘格式肯定效率 zip 比 node_modules 好, 在说了作为一个库, 这样是不是也方便迁移?
    qrobot
        91
    qrobot  
       5 天前
    @shunia 你要细看 Yarn 做的事情, 还有 Yarn 的 performance 你就会发现 Yarn 的速度会比 pnpm 快, 看 performance 并不是仅仅只是看结果的. 你想想 Yarn 做了多少事情, 如果你仅仅只是使用类似于 npm 这种 install 的功能, 就没必要用 Yarn 了, 相当于核弹打文字, 如果你需要使用 Yarn 的一些复杂的特性, 例如 zero installs 来保证依赖的可靠性, 这个时候你才会发现 node_module 和 zip 的巨大区别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2289 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:06 · PVG 00:06 · LAX 09:06 · JFK 12:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.