主頁 > 前端設計 > lerna管理前端packages的最佳實踐

lerna管理前端packages的最佳實踐

2020-09-12 17:16:15 前端設計

背景

對于維護過多個package的同學來說,都會遇到一個選擇:這些package是放在一個倉庫里維護還是放在多個倉庫里單獨維護,數量較少的時候,多個倉庫維護不會有太大問題,但是當package數量逐漸增多時,一些問題逐漸暴露出來:

  1. package之間相互依賴,開發人員需要在本地手動執行npm link,維護版本號的更替;
  2. issue難以統一追蹤,管理,因為其分散在獨立的repo里;
  3. 每一個package都包含獨立的node_modules,而且大部分都包含babel,webpack等開發時依賴,安裝耗時冗余并且占用過多空間,

什么是lerna

lerna到底是什么呢?lerna官網上是這樣描述的

用于管理具有多個包的JavaScript專案的工具,
這個介紹可以說很清晰了,引入lerna后,上面提到的問題不僅迎刃而解,更為開發人員提供了一種管理多packages javascript專案的方式,
一、自動解決packages之間的依賴關系,
二、通過git 檢測檔案改動,自動發布,
三、根據git 提交記錄,自動生成CHANGELOG

常用命令

全域安裝lerna

lerna 我們需要全域安裝lerna工具,

$ npm i -g lerna
# 或
$ yarn global add lerna

為所有專案安裝依賴,類似于npm/yarn i

$ lerna bootstrap

提交對專案的更新

運行該命令會執行如下的步驟

  1. 運行lerna updated來決定哪一個包需要被publish
  2. 如果有必要,將會更新lerna.json中的version
  3. 將所有更新過的的包中的package.json的version欄位更新
  4. 將所有更新過的包中的依賴更新
  5. 為新版本創建一個git commit或tag
  6. 將包publish到npm上
$ lerna publish # 用于發布更新
$ lerna publish --skip-git # 不會創建git commit或tag
$ lerna publish --skip-npm # 不會把包publish到npm上

使用lerna 初始化專案

$ lerna init # 固定模式(Fixed mode)默認為固定模式,packages下的所有包共用一個版本號(version)
$ lerna init --independent # 獨立模式(Independent mode),每一個包有一個獨立的版本號

為packages檔案夾下的package安裝依賴

$ lerna add <package>[@version] [--dev] # 命令簽名
# 例如
$ lerna add module-1 --scope=module-2 # 將 module-1 安裝到 module-2
$ lerna add module-1 --scope=module-2 --dev # 將 module-1 安裝到 module-2 的 devDependencies 下
$ lerna add module-1 # 將 module-1 安裝到除 module-1 以外的所有模塊
$ lerna add babel-core # 將 babel-core 安裝到所有模塊

卸載依賴

$ lerna exec -- <command> [..args] # 在所有包中運行該命令

# 例如
$ lerna exec --scope=npm-list  yarn remove listr # 將 npm-list 包下的 listr 卸載
$ lerna exec -- yarn remove listr # 將所有包下的 listr 卸載

檢查對包是否發生過變更(前提是git代碼已經提交)

$ lerna updated
# 或
$ lerna diff
  • 顯示packages下的各個package的name
$ lerna ls

在這里插入圖片描述

  • 清理node_modules
$ lerna clean

lerna run

運行npm script,可以指定具體的package,

$ lerna run <script> -- [..args] # 在所有包下運行指定

# 例如
$ lerna run test # 運行所有包的 test 命令
$ lerna run build # 運行所有包的 build 命令
$ lerna run --parallel watch # 觀看所有包并在更改時發報,流式處理前綴輸出

$ lerna run --scope my-component test # 運行 my-component 模塊下的 test

lerna.json決議

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": [
        "ignored-file",
        "*.md"
      ]
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]      
    }
  },
  "packages": ["packages/*"]
}

version:當前庫的版本
npmClient: 允許指定命令使用的client, 默認是 npm, 可以設定成 yarn
command.publish.ignoreChanges:可以指定那些目錄或者檔案的變更不會被publish
command.bootstrap.ignore:指定不受 bootstrap 命令影響的包
command.bootstrap.npmClientArgs:指定默認傳給 lerna bootstrap 命令的引數
command.bootstrap.scope:指定那些包會受 lerna bootstrap 命令影響
packages:指定包所在的目錄

環境配置

  • Git 在一個lerna工程里,是通過git來進行代碼管理的,所以你首先要確保本地有正確的git環境, 如果需要多人協作開發,請先創建正確的git中心倉庫的鏈接, 因此需要你了解基本的git操作,在此不再贅述,
  • npm倉庫 無論你管理的package是要發布到官網還是公司的私有服務器上,都需要正確的倉庫地址和用戶名, 你可運行下方的命令來檢查,本地的npm registry地址是否正確,
$ npm config ls
lerna 我們需要全域安裝lerna工具
$ npm i -g lerna
# 或
$ yarn global add lerna
初始化一個lerna工程

在這個例子中,我將在我本地d:/jobs 根目錄下初始化一個lerna工程,1、在d:/jobs下創建一個空的檔案夾,命名為lerna-demo

$ mkdir lerna-demo
初始化 通過cmd進入相關目錄,進行初始化
$ cd d:/jobs/lerna-demo
$ lerna init

執行成功后,目錄下將會生成這樣的目錄結構,

- packages(目錄)
- lerna.json(組態檔)
- package.json(工程描述檔案)

3、添加一個測驗package
默認情況下,package是放在packages目錄下的,

# 進入packages目錄
cd d:/jobs/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

4、安裝各packages依賴 這一步操作,官網上是這樣描述的
在當前的Lerna倉庫中引導包,安裝所有依賴項并鏈接任何交叉依賴項,

$ cd d:/lerna-demo
$ lerna bootstrap

在現在的測驗package中,module-1是沒有任何依賴的,因此為了更加接近真實情況,你可已在module-1的package.json檔案中添加一些第三方庫的依賴, 這樣的話,當你執行完該條命令后,你會發現module-1的依賴已經安裝上了,

5、發布 在發布的時候,就需要git工具的配合了, 所以在發布之前,請確認此時該lerna工程是否已經連接到git的遠程倉庫,你可以執行下面的命令進行查看

git remote -v
// print log
origin  [email protected]:meitianyitan/docm.git (fetch)
origin  [email protected]:meitianyitan/docm.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是規范的,代碼是規范的,一切都是有跡可循的,這點我認為是非常重要的,

bug

lerna 3.16.4中的一個bug
在這里插入圖片描述
Enter a custom version? 輸入項如果直接enter的話會報錯

查看更多

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/15659.html

標籤:其他

上一篇:IDEA debug提示Connected to the target VM, address: '127.0.0.1:xxxxx', transport: 'socke

下一篇:Java例外 | Intellij IDEA 2019.2.2配置Maven3.6.2打開Maven專案出現 Unable to import Maven project

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more