<p style="text-align: center;"><a href="/misc/goto?guid=4958992220058155744" title="非死book"><img alt="非死book发布JavaScript包管理器Yarn 1.0" src="https://simg.open-open.com/show/7335b414f3b8f2f6a943cf004cf9ef11.gif" /></a></p> <p>非死book 在官方网站上<a href="/misc/goto?guid=4959010736261728583">正式发布</a>了 JavaScript 包管理器 Yarn 1.0。在从 Yarn 诞生之日起至今的 11 个月时间里,Yarn 拥有了大批的追随者。GitHub 上有 175,000 个项目在使用 Yarn,许多大大小小的公司和广大开源社区也在使用 Yarn,每个月通过 Yarn 下载的包数量接近 30 亿个。Yarn 为广大用户节省了大量的时间。推ter 和微软说他们的包安装速度因此提升了 5 倍,<a href="/misc/goto?guid=4959010736370537311">Expo</a>、<a href="/misc/goto?guid=4959010736472279491">Kenzan</a> 和 <a href="/misc/goto?guid=4959010736570266920">Sentry</a> 表示性能和稳定性的提升加快了他们的代码交付速度。Yarn 现在已经成为主流持续集成平台的预安装项,如 <a href="/misc/goto?guid=4959010736666587610">CircleCI</a>、<a href="/misc/goto?guid=4959010736768469873">Travis CI</a> 和 <a href="/misc/goto?guid=4959010736869156899">AppVeyor</a>。</p> <p>Yarn 在 非死book 内部也得到了广泛的采用,包括 非死book 主应用、Instagram、Oculus 和 WhatsApp。Yarn 具有极佳的伸缩性,可以支持成千上万个直接或间接的包依赖。Yarn 的设计初衷就是要保证、稳定性、弹性和高性能。基于这些原则,Yarn 1.0 带来了更多的新特性,希望能够帮助 Yarn 社区更快地发展,构建更好的项目。</p> <p><strong>Yarn 1.0 新特性</strong></p> <p><strong>1. Yarn 工作区(workspace)</strong></p> <p>单体仓库(mono repository)模式(方便跨项目共享代码,同时避免依赖同步问题)如今已经被大型的科技公司所采用,也正逐渐蔓延到开源社区和一些小型公司。为了让人们更方便地采用该模式,Yarn 增加了一个新特性——工作区。工作区可以自动从多个 package.json 中收集所有的依赖,然后一次性把它们安装完毕。项目根目录下会生成 yarn.lock 来锁住这些文件。如果多个工作区之间存在依赖,Yarn 会为它们创建链接,这样所有的项目就可以共享最新的代码。</p> <p><strong>2. yarn.lock 自动合并</strong></p> <p style="text-align:center"><img alt="非死book发布JavaScript包管理器Yarn 1.0" src="https://simg.open-open.com/show/2701e6aba47cde59f45ede1740f08ba1.gif" /></p> <p>多个开发者在开发同一个项目时,有可能会更新包依赖,导致 yarn.lock 文件出现冲突。如果只有一两个冲突,那么完全可以通过手动来解决,但如果冲突数量众多,解决冲突就会变成一件很麻烦的事情。Yarn 为此提供了自动合并 yarn.lock 文件的功能。通过运行 yarn install 命令可以触发合并动作,如果合并成功,新的 yarn.lock 就会被保存到磁盘上。</p> <p><strong>3. 可选择依赖版本(selective version resolution)</strong></p> <p>有时候,你的项目间接依赖了其他项目的包,而这些依赖包有了新版本,你急需使用依赖包的新功能。这个时候你要么等待其他项目更新这些依赖包,要么给其他项目拉一个分支,然后更新依赖包。但这些都不是最理想的方式。Yarn 提供了可选择依赖版本的新特性,通过在 package.json 文件里定义 resolutions 字段来告诉 Yarn 该使用哪个版本的依赖包。下图就是一个通过该特性限定使用某个 async 模块版本的例子。</p> <p style="text-align:center"><img alt="非死book发布JavaScript包管理器Yarn 1.0" src="https://simg.open-open.com/show/55eb7bc08e8b55591a8284e2d7a124f9.jpg" /></p> <p>需要指出的是,该特性完全由社区设计和实现,<a href="/misc/goto?guid=4959010736964331466">Victor Noël</a>提交了 <a href="/misc/goto?guid=4959010737071142972">RFC</a> 和<a href="/misc/goto?guid=4959010737155867014">验收测试</a>,并由 <a href="/misc/goto?guid=4959010737254387165">Kaylie Kwon</a> 负责实现。</p> <p><strong>问题修复和其他方面的改进</strong></p> <ul> <li>更好的交互式升级体验</li> <li>更快的文件完整性检查</li> <li>提供了一个独立的 yarn.lock 文件解析模块</li> <li>Yarn 版本的一致性保证</li> </ul> <p><strong>社区的参与情况</strong></p> <p>项目在启动后就引入了 RFC 流程,鼓励社区参与项目的讨论。有很多特性都来自社区的贡献,仅在 2017 年,就有超过 40 位贡献者为 Yarn 贡献了他们的力量。</p> <p><strong>未来的计划</strong></p> <p>发布一个新包通常需要创建变更日志、执行版本语义、同步相关项目的版本,还需要手动或通过脚本完成其他很多步骤。如果 Yarn 能够为包发布者完成这些事情那岂不妙哉?另外,在添加或升级新包时,包的安全性也是一个很重要的考虑点。Yarn 将会在包安全方面扮演一个重要的角色,Yarn 将会与 npm 合作,将双因子认证带到 Yarn 上。</p> <p>来自: <a href="/misc/goto?guid=4959010737353405976" id="link_source2">InfoQ</a></p>