早早聊面试
npm2 优点: 结构清晰
缺点: 重复依赖
yarn/npm3: 部分扁平
优点: 不会出现重复的包,
缺点: 幽灵依赖: 你可以使用不在 package.JSON 的声明的包 依赖提升: 结构不稳定 依赖树: 打平算法很复杂,所以相对也会占用时间 依然是依赖于 copy-paste 方式,占用磁盘空间的方式
yarn:
1.优点: 1.支持并行下载安装,npm 只能串行 2.支持离线模式,优先从本地缓存中取包代码 3.```yarn set version`````切换版本,效果很向 nvm 4.yarn 2 之后支持 pnpm,效果有点像.pnpm.js 文件 也是能够节省安装时间,磁盘大小
2.缺点:
Pnpm---Performance npm,全局只有一份代码副本(content-adressable store),其他地方都是通过硬链、软链方式,链接过去的。
优点:
能够解决幽灵依赖和依赖提升
结构清晰
所有代码都是通过硬链接、软链方式链接到副本、不需要赋值、性能比较高、占用空间比较小
缺点: 1.软链兼容性并不是特别好,electron,实测部分包会出错 2.patch-package 不方便,全局只有一个副本
高阶: 自我思考
包管理: 在过去通过 script 标签来引入依赖,一直到 node+npm 才让这件事情变得相对优雅,导致应用的复杂度也相应的提升。 通过软链的方式链接到.Pnpm 里面的 node_module
大文件上传方案:
问题: 1.文件大,上传时间就会变得更长,中间会出现很多幺蛾子(服务端负载、网络、超时、浏览器压力) 2.普通 http,就很可能超时,重试成本非常高; 3.上传时间内,用户啥都做不了,最终体验非常差
基础: 1.化整为零:大人物拆解为多个小任务,一方面能够避免单个大任务超时,另一方面
具体方案; 1.切片: file.prototype.slice 2.计算每一个切片的顺序,hash[spark-md5],调用任务接口创建上传任务 a.服务端记录这些任务信息 3.逐个切片发送到服务器 a.服务端接收并转存这些切片,oss b.前端还需要计算上传进度(xhr 的 progress 事件监听进度) 4.所有切片上传完毕之后,再按照索引组合这些分片
优化:
切片: 策略: 数量、大小 file.prototype.stream() => ReaderStream 分流: 分任务 worker stream 2.传输: 1.多个 http 请求(注意并发数量、容易超时)、websocket 提升并发度 2.内容 hash--所谓的秒传 3.使用 jszip 去做压缩(多媒体资源下,效果较弱) 3.断点续传 本地 indexed db(存储切片内容、索引、hash、任务 id 等信息) service worker 暂停功能: 借助 xhr.abort/fetch 的 AbortController 实现暂停
最后更新于
这有帮助吗?