最近在工作中使用了 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",
"dependencies": {
"module-2": "^1.0.0"
}
}
//module-2 package.json
{
"name": "module-2",
"version": "1.0.0",
}

在这样的环境下,module-1 是依赖 module-2 的。如果 module-2 有修改,需要发布。那么你的工作有这些。

  1. 修改 module-2 版本号,发布。
  2. 修改 module-1 的依赖关系,修改 module-1 的版本号,发布。

这还仅仅只有两个 package,如果依赖关系更复杂,大家可以想想发布的工作量有多大。

什么是lerna?为什么要使用lerna?

lerna 到底是什么呢?lerna 官网上是这样描述的。

A tool for managing JavaScript projects with multiple packages.

这个介绍可以说很清晰了,引入lerna后,上面提到的问题不仅迎刃而解,更为开发人员提供了一种管理多 packages javascript 项目的方式。

  1. 自动解决packages之间的依赖关系
  2. 通过 git 检测文件改动,自动发布
  3. 根据 git 提交记录,自动生成 CHANGELOG

使用lerna的基本工作流

环境配置

  • Git 在一个 lerna 工程里,是通过 git 来进行代码管理的。所以你首先要确保本地有正确的 git 环境。 如果需要多人协作开发,请先创建正确的 git 中心仓库的链接。 因此需要你了解基本的 git 操作,在此不再赘述。
  • npm 仓库 无论你管理的 package 是要发布到官网还是公司的私有服务器上,都需要正确的仓库地址和用户名。 你可运行下方的命令来检查,本地的 npm registry 地址是否正确。
npm config ls
  • lerna 你需要全局安装 lerna 工具。
npm install lerna -g

初始化一个lerna工程

在这个例子中,我将在我本地根目录下初始化一个lerna工程。

  1. 创建一个空的文件夹,命名为 lerna-demo
mkdir lerna-demo
  1. 初始化
cd lerna-demo
lerna init

执行成功后,目录下将会生成这样的目录结构。

- packages(目录)
- lerna.json(配置文件)
- package.json(工程描述文件)
  1. 添加一个测试package

默认情况下,package是放在 packages 目录下的。

// 进入packages目录
cd lerna-demo/packages
// 创建一个packge目录
mkdir module-1
// 进入module-1 package目录
cd module-1
// 初始化一个package
npm init -y

执行完毕,工程下的目录结构如下

--packages
--module-1
package.json
--lerna.json
--package.json
  1. 安装各 packages 依赖 这一步操作,官网上是这样描述的。

Bootstrap the packages in the current Lerna repo. Installs all of their dependencies and links any cross-dependencies.

cd lerna-demo
lerna bootstrap

在现在的测试 package 中,module-1 是没有任何依赖的,因此为了更加接近真实情况。你可已在 module-1 的package.json 文件中添加一些第三方库的依赖。 这样的话,当你执行完该条命令后,你会发现 module-1 的依赖已经安装上了。

  1. 发布 在发布的时候,就需要 git 工具的配合了。 所以在发布之前,请确认此时该 lerna 工程是否已经连接到git 的远程仓库。你可以执行下面的命令进行查看。
git remote -v
// print log
origin git@github.com/iNuanfeng/lerna-demo.git (fetch)
origin git@github.com/iNuanfeng/lerna-demo.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 的经验,总结出一个最佳实践。下面是一些特性。

  1. 采用 Independent 模式
  2. 根据 Git 提交信息,自动生成 changelog
  3. eslint 规则检查
  4. prettier 自动格式化代码
  5. 提交代码,代码检查 hook
  6. 遵循 semver 版本规范

大家应该也可以看出来,在开发这种工程的过程的,最为重要的一点就是规范。因为应用场景各种各样,你必须保证发布的 packge 是规范的,代码是规范的,一切都是有迹可循的。这点我认为是非常重要的。github代码

lerna管理前端模块实践的更多相关文章

  1. 基于 Lerna 管理 packages 的 Monorepo 项目最佳实践

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/NlOn7er0ixY1HO40dq5Gag作者:孔垂亮 目录 一.背景二.Monorepo vs M ...

  2. JS模块规范 前端模块管理器

    一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...

  3. 前端模块与CMS结合

    前端模块与CMS结合 在<FIS官方技术群>经常看到一些讨论,这次是 前端组件化与CMS的相关讨论,主要观点来自群里 漂流瓶(张云龙前辈). CMS是运营人员直接操作,我们往往需求各种各样 ...

  4. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  5. 转 -Filebeat + Redis 管理 LOG日志实践

    Filebeat + Redis 管理 LOG日志实践 小赵营 关注 2019.01.06 17:52* 字数 1648 阅读 24评论 0喜欢 2 引用 转载 请注明出处 某早上,领导怒吼声远远传来 ...

  6. webpack前言:前端模块系统的演进

    前端开发和其他开发工作的主要区别,首先是前端是基于多语言.多层次的编码和组织工作,其次前端产品的交付是基于浏览器,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源 ...

  7. 理解前端模块概念:CommonJs与ES6Module

    前言 现代前端开发每时每刻都和模块打交道.例如,在项目中引入一个插件,或者实现一个供全局使用组件的JS文件.这些都可以称为模块. 在设计程序结构时,不可能把所有代码都放在一起.更为友好的组织方式时按照 ...

  8. 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程

    项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...

  9. 使用bower管理前端依赖

    bower,类似于npm.maven等后端管理构建工具一样,bower可以用来管理前端浏览器依赖,关于bower详细介绍参考官网:https://bower.io/ bower init命令:初始化项 ...

随机推荐

  1. 5.Storm-集群配置及任务提交

  2. 动态加载dll的实现+远线程注入

    1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...

  3. 针对python字符串有哪些操作呢?本文详解!

    1.1 字符串字符串就是一系列字符.在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号.1.2 一些对字符串的操作(1)使用方法修改字符串的大小写name = " ...

  4. C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...

  5. 使用 mysqld_safe 启动 mysqld 服务

    目录 mysqld_safe 介绍 启动 停止 mysqld_safe 介绍 mysqld_safe is the recommended way to start a mysqld server o ...

  6. Django在Linux上uwsgi 与nginx的问题与解决

    1.出现只有weclome to nginx 多半是是nginx的配置文件没有修改,把他的路由注释掉. 我是修改错文件夹了,一直在自己下载而非运行的文件夹修改 2.出现502 出现了多次502这里一一 ...

  7. sping ioc 源码分析(一)-- register(componentClasses) 方法

    一.测试环境的搭建: public class Apple { } @Component public class MyComponet { } public class MyCondition im ...

  8. Centos-网络下载文件-wget

    wget 指定URL从网络上下载某个文件,需要网络连接 相关选项 -nc 不覆盖同名文件 -q    安静下载,无输出 -v    显示下载详情 -O   指定保存目录或重命名下载文件名 -c 断点续 ...

  9. LeetCode刷题总结-DFS、BFS和回溯法篇

    本文总结LeetCode上有关深度优先搜索(DFS).广度优先搜索(BFS)和回溯法的算法题,推荐刷题总数为13道.具体考点分析如下图: 一.深度优先搜索 1.字符匹配问题 题号:301. 删除无效的 ...

  10. 国产化之路-安装达梦DM8数据库

    专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...