V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
unco020511
V2EX  ›  前端开发

前端新手关于包依赖的疑问

  •  
  •   unco020511 · 12 天前 · 1824 次点击

    楼主原来是做服务端和 Android 的,包依赖管理都是 gradle/maven,最近团队需要开始接触前端,但我有个疑问,为啥前端的依赖都是类似 "dependencies": {"vue": "^3.0.11"}这样写,这样似乎就没有锁定一个具体版本,执行 install 时会自动去 npm 仓库下载最新的版本(同一个大版本内)

    • 不锁定版本如果新的版本 API 变更或者存在 bug 那怎么办?
    • 不锁定版本的话,本地和部署也可能拉取到不同的依赖版本?感觉这样会有坑?
    • 当然也可能我的理解不对
    第 1 条附言  ·  12 天前

    感觉大家的解答,懂了一些

    • lock文件就是解决版本问题的

    lock文件的机制我去详细了解下

    • 一个大版本内不会更改api或者引入bug

    我理解这只是一个美好的约定,三方库的作者不一定会遵守这个约定

    • npm ci可以解决部分问题

    确实可以解决本地能跑,持续集成/自动化环境不能跑的问题

    33 条回复    2024-04-22 09:57:48 +08:00
    yzw716305797
        1
    yzw716305797  
       12 天前
    1. 一般不会有 bug ,不一般的时候也挺多
    2. 会有坑,偶尔会出现本地和线上不一致的情况

    把前面的 ^去掉,版本就会锁死,但是也不是完全没问题了,因为依赖的依赖,也可能会出问题
    clevercats
        2
    clevercats  
       12 天前
    指定版本"^3.0.11" , 这里面不加^就行了
    coldmonkeybit
        3
    coldmonkeybit  
       12 天前
    只要 lock 文件是同一份,就不会出现拉取到不同的依赖版本的情况吧
    duanxianze
        4
    duanxianze  
       12 天前
    和 gradle/maven,写法差不多啊,^+等正则写法,我映像中包括 python,ruby,php,rust 不都是这样的?直接写数字就是指定了
    unco020511
        5
    unco020511  
    OP
       12 天前
    @yzw716305797 去掉可以锁定版本我倒是知道.既然锁定版本会有坑,为啥大家都这样写呢?我遇到好几个项目好像都是加^.不是特别理解,因为在用 maven 时,都是固定版本的
    unco020511
        6
    unco020511  
    OP
       12 天前
    @duanxianze 包管理工具应该都有提供类似的机制,但好像大家的习惯(或者说约定)差异很大?比如 Android 开发基本没见过不指定具体版本的情况,前端就很多^这样写,想知道为什么会存在这个差异呢
    sibusana
        7
    sibusana  
       12 天前
    @unco020511 如果项目内有 lock 文件,比如 pnpm-lock.yaml 。如果安装之后 lock 文件没有产生修改,可以认为依赖没有变化
    lingxiaoli
        8
    lingxiaoli  
       12 天前
    同一个大版本不存在 break change 都是兼容的
    ztxcccc
        9
    ztxcccc  
       12 天前
    lock 文件可以固定版本和下载地址,但是假设说有人用了个私有的地址+偷偷替换掉远程文件,也是有可能的
    xwwsxp
        10
    xwwsxp  
       12 天前
    @duanxianze 它是通过 npm 的 pageage-json.lock 文件来锁定版本的;只要将这个提交到远程 Git 仓库就可以了,也能得到类似 Maven 的方式;但是,前端毕竟属于娱乐圈,开玩笑,升级比较快,很多前端喜欢最新的东西。
    unco020511
        11
    unco020511  
    OP
       12 天前
    @lingxiaoli 这确实是一个「约定」,但也只是一个「约定」
    murmur
        12
    murmur  
       12 天前
    一般我们是把 node_modules 打包保存,直接发给别人,一劳永逸的解决问题
    laobobo
        13
    laobobo  
       12 天前
    有一个 lock 文件,就是用来锁定的
    NerbraskaGuy
        14
    NerbraskaGuy  
       12 天前
    package-lock.json 不就是做这个用的么,package.json 里面锁定直接依赖的包版本,但是如果又依赖其他的包的话可能会出问题,尤其是越大型的项目互相依赖越复杂
    laobobo
        15
    laobobo  
       12 天前
    @murmur 我擦,牛啊
    wu67
        16
    wu67  
       12 天前
    "vue": "3.0.11" 只装这个版本, 精确到补丁版本号
    "vue": "~3.0.11" 可以装 3.0.* 的最新版本
    "vue": "^3.0.11" 可以装 3.* 的最新版本

    或者你把 package-lock.json 或者 yarn-lock.json 一起提供.

    或者极端一点, 连 node_modules 打包给别人, 但是部分包如果跨平台芯片就没法用了, 例如苹果 m 系列和 window intel...
    wu67
        17
    wu67  
       12 天前
    一般来讲, 经常维护的项目, 用^完全没问题, 出事解决就行. 实在担心就逐步锁定范围.
    wangtian2020
        18
    wangtian2020  
       12 天前
    凉拌,就算锁了版本,别人开发用的浏览器、系统版本、nodejs 不一样也有可能出问题
    我就是喜欢安装新版本,出了问题再改回来,一般不出
    renmu
        19
    renmu  
       12 天前 via Android
    npm ci 可以使用 lock 文件安装,npm i 是不会的
    dongtingyue
        20
    dongtingyue  
       12 天前
    好心提醒,使用 volta 之类的管理 node ,npm 版本。要不然还是有坑。前端是大坑。
    unco020511
        21
    unco020511  
    OP
       12 天前
    @dongtingyue 我是使用 nvm 来管理 node 版本的,然后每个 node 版本会自带一个 npm 版本,不同项目会指定 node 版本,这样应该就没啥坑吧?
    unco020511
        22
    unco020511  
    OP
       12 天前
    @wangtian2020 这样倒是也行
    AoEiuV020JP
        23
    AoEiuV020JP  
       12 天前
    node 对版本号有规定,少数不合群的也可以特殊处理,多数还是愿意按规矩来,
    Java 这边一开始就没管,版本号可以是任意字符串,大家也都是这么做的, 所以一般都是指定特定版本,有特殊需求也有特定语法可以指定比如 gradle 的加号+,
    lisongeee
        24
    lisongeee  
       12 天前
    你说的这个问题在 pnpm 已经得到解决,pnpm 现在默认安装就是固定版本,然后使用 lock 文件去锁次级依赖
    Wxh16144
        25
    Wxh16144  
       12 天前
    都说了 Lock 文件我就不补充了,另外看到 package.json 一些符号可能不太熟悉可以试试 https://semver.npmjs.com/ 参考。
    madao199
        26
    madao199  
       12 天前
    --frozen-lockfile 就能解决了 前提是你要和同事沟通好
    leokun
        27
    leokun  
       12 天前
    没有 lock 文件的话,无论如何都不可能锁定版本,因为你的直接依赖有自己的依赖,它会自动更新小版本,这是饱受诟病的问题
    jchnxu
        28
    jchnxu  
       12 天前
    @yzw716305797 哈哈哈笑死了
    unclebb
        29
    unclebb  
       12 天前 via iPhone
    默认所有包维护者都理解版本规则,这样默认大版本升级可以及时修复 bug 和获取特性更新,然而现实很残酷,只能 lock 或者强行指定版本。

    不过如果项目一直迭代问题也不大,有问题也会及时发现,如果是一个陈年项目突然诈尸,那就很惨烈了,别问我怎么知道的。
    rabbbit
        30
    rabbbit  
       12 天前
    全部锁版本和全部不锁都可能会踩坑,
    最讨厌的是 npm 新添加 package 他也会去更新其他的 package ,
    个人的解决方案是用户数多的、常用的不锁,很久没更新、版本小于 1.0.0 、用户量小的 package 锁版本。
    Torpedo
        31
    Torpedo  
       12 天前
    你一眼就看出来了问题。lock 确实在这个场景缓解了这个问题。
    此外还有 nodejs 那个不太靠谱的找 lib 的方式。都被 lock 文件掩盖了
    TsubasaHanekaw
        32
    TsubasaHanekaw  
       11 天前
    我之前直接放在容器里,install 好之后打包整个容器外发
    unco020511
        33
    unco020511  
    OP
       9 天前
    @TsubasaHanekaw 这也是个思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2025 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:13 · PVG 09:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.