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

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

  •  
  •   unco020511 · 222 天前 · 2424 次点击
    这是一个创建于 222 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    • npm ci可以解决部分问题

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

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

    把前面的 ^去掉,版本就会锁死,但是也不是完全没问题了,因为依赖的依赖,也可能会出问题
    clevercats
        2
    clevercats  
       222 天前
    指定版本"^3.0.11" , 这里面不加^就行了
    coldmonkeybit
        3
    coldmonkeybit  
       222 天前
    只要 lock 文件是同一份,就不会出现拉取到不同的依赖版本的情况吧
    duanxianze
        4
    duanxianze  
       222 天前
    和 gradle/maven,写法差不多啊,^+等正则写法,我映像中包括 python,ruby,php,rust 不都是这样的?直接写数字就是指定了
    unco020511
        5
    unco020511  
    OP
       222 天前
    @yzw716305797 去掉可以锁定版本我倒是知道.既然锁定版本会有坑,为啥大家都这样写呢?我遇到好几个项目好像都是加^.不是特别理解,因为在用 maven 时,都是固定版本的
    unco020511
        6
    unco020511  
    OP
       222 天前
    @duanxianze 包管理工具应该都有提供类似的机制,但好像大家的习惯(或者说约定)差异很大?比如 Android 开发基本没见过不指定具体版本的情况,前端就很多^这样写,想知道为什么会存在这个差异呢
    sibusana
        7
    sibusana  
       222 天前
    @unco020511 如果项目内有 lock 文件,比如 pnpm-lock.yaml 。如果安装之后 lock 文件没有产生修改,可以认为依赖没有变化
    lingxiaoli
        8
    lingxiaoli  
       222 天前
    同一个大版本不存在 break change 都是兼容的
    ztxcccc
        9
    ztxcccc  
       222 天前
    lock 文件可以固定版本和下载地址,但是假设说有人用了个私有的地址+偷偷替换掉远程文件,也是有可能的
    xwwsxp
        10
    xwwsxp  
       222 天前
    @duanxianze 它是通过 npm 的 pageage-json.lock 文件来锁定版本的;只要将这个提交到远程 Git 仓库就可以了,也能得到类似 Maven 的方式;但是,前端毕竟属于娱乐圈,开玩笑,升级比较快,很多前端喜欢最新的东西。
    unco020511
        11
    unco020511  
    OP
       222 天前
    @lingxiaoli 这确实是一个「约定」,但也只是一个「约定」
    murmur
        12
    murmur  
       222 天前
    一般我们是把 node_modules 打包保存,直接发给别人,一劳永逸的解决问题
    laobobo
        13
    laobobo  
       222 天前
    有一个 lock 文件,就是用来锁定的
    NerbraskaGuy
        14
    NerbraskaGuy  
       222 天前
    package-lock.json 不就是做这个用的么,package.json 里面锁定直接依赖的包版本,但是如果又依赖其他的包的话可能会出问题,尤其是越大型的项目互相依赖越复杂
    laobobo
        15
    laobobo  
       222 天前
    @murmur 我擦,牛啊
    wu67
        16
    wu67  
       222 天前
    "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  
       222 天前
    一般来讲, 经常维护的项目, 用^完全没问题, 出事解决就行. 实在担心就逐步锁定范围.
    wangtian2020
        18
    wangtian2020  
       222 天前
    凉拌,就算锁了版本,别人开发用的浏览器、系统版本、nodejs 不一样也有可能出问题
    我就是喜欢安装新版本,出了问题再改回来,一般不出
    renmu
        19
    renmu  
       222 天前 via Android
    npm ci 可以使用 lock 文件安装,npm i 是不会的
    dongtingyue
        20
    dongtingyue  
       222 天前
    好心提醒,使用 volta 之类的管理 node ,npm 版本。要不然还是有坑。前端是大坑。
    unco020511
        21
    unco020511  
    OP
       222 天前
    @dongtingyue 我是使用 nvm 来管理 node 版本的,然后每个 node 版本会自带一个 npm 版本,不同项目会指定 node 版本,这样应该就没啥坑吧?
    unco020511
        22
    unco020511  
    OP
       222 天前
    @wangtian2020 这样倒是也行
    AoEiuV020JP
        23
    AoEiuV020JP  
       222 天前
    node 对版本号有规定,少数不合群的也可以特殊处理,多数还是愿意按规矩来,
    Java 这边一开始就没管,版本号可以是任意字符串,大家也都是这么做的, 所以一般都是指定特定版本,有特殊需求也有特定语法可以指定比如 gradle 的加号+,
    lisongeee
        24
    lisongeee  
       222 天前
    你说的这个问题在 pnpm 已经得到解决,pnpm 现在默认安装就是固定版本,然后使用 lock 文件去锁次级依赖
    Wxh16144
        25
    Wxh16144  
       222 天前
    都说了 Lock 文件我就不补充了,另外看到 package.json 一些符号可能不太熟悉可以试试 https://semver.npmjs.com/ 参考。
    madao199
        26
    madao199  
       222 天前
    --frozen-lockfile 就能解决了 前提是你要和同事沟通好
    leokun
        27
    leokun  
       221 天前
    没有 lock 文件的话,无论如何都不可能锁定版本,因为你的直接依赖有自己的依赖,它会自动更新小版本,这是饱受诟病的问题
    jchnxu
        28
    jchnxu  
       221 天前
    @yzw716305797 哈哈哈笑死了
    unclebb
        29
    unclebb  
       221 天前 via iPhone
    默认所有包维护者都理解版本规则,这样默认大版本升级可以及时修复 bug 和获取特性更新,然而现实很残酷,只能 lock 或者强行指定版本。

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