lerna: 最佳实践
最近在工作中使用了
lerna
进行前端包的管理,效率提升了很多。所以打算总结一下最近几个月使用lerna的一些心得。有那些不足的地方,请包涵。
该篇文章主要包括在使用lerna的一些注意事项,和使用过程中与其他工具的整合,最终形成的一个最佳实践。
package的指的是一个可以通过npm包管理工具发布的一种目录结构,翻译过来感觉不太适合,所以就用package来说明吧。
前端开发package面临的问题
在最初开开发package的时候,还属于一种刀耕火种的阶段。没有什么自动化的工具。发布package的时候,都是手动修改版本号。如果packages数量不多还可以接受。但是当数量逐渐增多的时候,且这些packages之间还有依赖关系的时候,对开发人员来说,就很痛苦了。工作不仅繁琐,而且需要用掉不少时间。
举个例子,如果你要维护两个package。分别为module-1,module-2。 下面是这两个package的依赖关系。
/module-1 package.json
{"name": "module-1","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \\"Error: no test specified\\" && exit 1"},"keywords": \[\],"author": "","license": "ISC","dependencies": {"module-2": "^1.0.0"}}
复制代码
/ module-2 package.json
{"name": "module-2","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \\"Error: no test specified\\" && exit 1"},"keywords": \[\],"author": "","license": "ISC"}
复制代码
在这样的环境下,module-1是依赖module-2的。如果module-2有修改,需要发布。那么你的工作有这些。
- 修改module-2版本号,发布。
- 修改module-1的依赖关系,修改module-1的版本号,发布。
这还仅仅只有两个package,如果依赖关系更复杂,大家可以想想发布的工作量有多大。
什么是lerna?为什么要使用lerna?
lerna到底是什么呢?lerna官网上是这样描述的。
A tool for managing JavaScript projects with multiple packages.
这个介绍可以说很清晰了,引入lerna后,上面提到的问题不仅迎刃而解,更为开发人员提供了一种管理多packages javascript项目的方式。
- 自动解决packages之间的依赖关系
- 通过
git
检测文件改动,自动发布 - 根据
git
提交记录,自动生成CHANGELOG
使用lerna的基本工作流
环境配置
- Git 在一个lerna工程里,是通过git来进行代码管理的。所以你首先要确保本地有正确的git环境。 如果需要多人协作开发,请先创建正确的git中心仓库的链接。 因此需要你了解基本的git操作,在此不再赘述。
- npm仓库 无论你管理的package是要发布到官网还是公司的私有服务器上,都需要正确的仓库地址和用户名。 你可运行下方的命令来检查,本地的npm
registry
地址是否正确。
npm config ls
复制代码
- lerna 你需要全局安装lerna工具。
npm install lerna -g
复制代码
初始化一个lerna工程
在这个例子中,我将在我本地
d:/
根目录下初始化一个lerna工程。
- 在
d:/
下创建一个空的文件夹,命名为lerna-demo
mkdir lerna-demo
复制代码
- 初始化 通过cmd进入相关目录,进行初始化
cd d:/lerna-demo
lerna init
复制代码
执行成功后,目录下将会生成这样的目录结构。
- packages(目录)- lerna.json(配置文件)- package.json(工程描述文件)
复制代码
- 添加一个测试package
默认情况下,package是放在
packages
目录下的。
// 进入packages目录
cd d:/lerna-demo/packages
// 创建一个packge目录
mkdir module-1
// 进入module-1 package目录
cd module-1
// 初始化一个package
npm init -y
复制代码
执行完毕,工程下的目录结构如下
--packages--module-1package.json
--lerna.json
--package.json复制代码
- 安装各packages依赖 这一步操作,官网上是这样描述的。
Bootstrap the packages in the current Lerna repo. Installs all of their dependencies and links any cross-dependencies.
cd d:/lerna-demo
lerna bootstrap
复制代码
在现在的测试package中,module-1是没有任何依赖的,因此为了更加接近真实情况。你可已在module-1的package.json
文件中添加一些第三方库的依赖。 这样的话,当你执行完该条命令后,你会发现module-1的依赖已经安装上了。
- 发布 在发布的时候,就需要
git
工具的配合了。 所以在发布之前,请确认此时该lerna工程是否已经连接到git的远程仓库。你可以执行下面的命令进行查看。
git remote -v
// print log
origin git@github.com:LittleBreak/lerna-best-practices.git (fetch)
origin git@github.com:LittleBreak/lerna-best-practices.git (push)
复制代码
本篇文章的代码托管在Github上。因此会显示此远程链接信息。 如果你还没有与远程仓库链接,请首先在github创建一个空的仓库,然后根据相关提示信息,进行链接。
lerna publish
复制代码
执行这条命令,你就可以根据cmd中的提示,一步步的发布packges了。
实际上在执行该条命令的时候,lerna会做很多的工作。
- Run the equivalent of `lerna updated` to determine which packages need to be published.- If necessary, increment the `version` key in `lerna.json`.- Update the `package.json` of all updated packages to their new versions.- Update all dependencies of the updated packages with the new versions, specified with a [caret (^)](https://docs.npmjs.com/files/package.json#dependencies).- Create a new git commit and tag for the new version.- Publish updated packages to npm.
复制代码
到这里为止,就是一个最简单的lerna的工作流了。但是lerna还有更多的功能等待你去发掘。 lerna有两种工作模式,Independent mode和Fixed/Locked mode,在这里介绍可能会对初学者造成困扰,但因为实在太重要了,还是有必要提一下的。 lerna的默认模式是Fixed/Locked mode,在这种模式下,实际上lerna是把工程当作一个整体来对待。每次发布packges,都是全量发布,无论是否修改。但是在Independent mode下,lerna会配合Git
,检查文件变动,只发布有改动的packge。
lerna最佳实践
为了能够使lerna发挥最大的作用,根据这段时间使用lerna
的经验,总结出一个最佳实践。下面是一些特性。
- 采用Independent模式
- 根据
Git
提交信息,自动生成changelog - eslint规则检查
- prettier自动格式化代码
- 提交代码,代码检查hook
- 遵循semver版本规范
大家应该也可以看出来,在开发这种工程的过程的,最为重要的一点就是规范。因为应用场景各种各样,你必须保证发布的packge是规范的,代码是规范的,一切都是有迹可循的。这点我认为是非常重要的。 github代码
工具整合
在这里引入的工具都是为了解决一个问题,就是工程和代码的规范问题。
- husky
- lint-staged
- prettier
- eslint
原文地址:https://juejin.im/post/5a989fb451882555731b88c2
lerna: 最佳实践相关推荐
- 基于 Lerna 管理 packages 的 Monorepo 项目最佳实践
对于维护过多个package的同学来说,都会遇到一个选择题,这些package是放在一个仓库里维护还是放在多个仓库里单独维护,本文通过一个示例讲述了如何基于Lerna管理多个package,并和其它工 ...
- 编写高性能Java代码的最佳实践
编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...
- 提示和技巧:光线跟踪最佳实践
提示和技巧:光线跟踪最佳实践 Tips and Tricks: Ray Tracing Best Practices 本文介绍了在游戏和其他实时图形应用程序中实现光线跟踪的最佳实践.我们尽可能简短地介 ...
- SQL Server 最佳实践分析器使用小结
Best Practices Analyzer Tool for Microsoft SQL Server 2000是Microsoft SQL Server开发团队开发的一个数据库管理工具,可以让你 ...
- 使用ADO.NET 的最佳实践(zz)
数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档) 发布日期: 4/1/2004 | 更新日期: 4/1/2004 摘要:编写 Microsoft ADO.NET 代码的最佳实践, ...
- 何崚谈阿里巴巴前端性能优化最佳实践
转载:http://www.infoq.com/cn/interviews/hl-alibaba-front-end-performance-optimization 大家好,我现在在阿里巴巴园区采访 ...
- 卡片式设计的最佳实践分享
2017-02-17 三达不留点gpj CocoaChina 卡片本质上是一个简单的信息容器,信息量有限,但设计干净整洁.现如今,在保证界面具有优秀可用性的同时,卡片式的设计甚至成为了平衡界面美学的默 ...
- GMTC 大前端时代前端监控的最佳实践
摘要: 今天我分享的内容分成三个部分: 第一部分是"大前端时代前端监控新的变化", 讲述这些年来,前端监控一些新的视角以及最前沿的一些思考. 第二部分"前端监控的最佳实践 ...
- eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析...
Guide: eBCC性能分析最佳实践(0) - 开启性能分析新篇章 eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析 eBCC性能分析最佳实践(2) - ...
最新文章
- python3.8.0shell_Python 3.8.0 正式发布 更新内容
- R语言:如何快速生成许多差异明显的颜色?
- 计算机考研学长学什么,研究生学长浅谈考研心得
- JAVA Collection笔记(2012/9/19)
- mysql select 反选_JQuery实现全选、全不选和反选功能
- Linux——查看系统的日志的一些实用操作
- java中来获取UUID
- 批量导数据之利器-load data[2016-07-11]
- druid mysql 乱码_2017.02.21 Mysql 字符集 乱码 排错过程
- Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
- 有锚点的链接页面刷新的问题
- 装了冰点还原如何修改计算机ip,如何改变冰点还原企业控制台的IP地址
- 深度卷积神经网络及各种改进
- transmac装黑苹果_黑苹果安装教程
- 下行法求最小割集案例_最小割集求法 -
- 公司要求我提供竞业协议证明材料,而新公司和我原公司存在竞争关系,且我已经入职,请问如何规避违约风险?
- 34岁程序员面试谈薪资被砍5K,网友:这么降不如在家睡觉
- 印刷ERP解决方案推荐
- 1024程序员节:技术大神齐聚直播间,等你来互动!
- 关于对接支付接口遇到的问题(微信和支付宝)
热门文章
- 使用@supports完美兼容CSS属性
- SUPPORTS, REQUIRED ,REQUIRES_NEW的区别
- php pop3 gmail,Gmail pop3 smtp 设置
- Keil MDK高级调试——Event Recorder
- 配置和维护ad服务器,ad域服务器硬件配置
- 基于vue 的h5微信分享
- Conda base环境被破坏,还原方法,亲测有效
- 全国计算机考试选择题要求,全国计算机等级考试MSOffice选择题必考(27页)-原创力文档...
- java directdraw_《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记
- java socket工具类