熱乎乎的 workspaces 替代 npm link 調(diào)試的新方式

熱乎乎的 workspaces 替代 npm link 調(diào)試的新方式.png

目錄

  • 前言
  • 認(rèn)識 workspaces
  • 如何給模塊安裝依賴
  • 移除依賴
  • 執(zhí)行模塊里面的 scripts
  • monorepo

前言

作為一個前端果录,在工程化的項目里你肯定使用過很多很多的 npm package巍实,不知道你有沒有嘗試開發(fā)過 npm package 或者研究下 npm package 的開發(fā)流程,如果你又經(jīng)驗敞掘,那么你一定很的熟悉 npm-link 這個命令。

我們本地化開發(fā) npm package 不可能每次改了代碼,都發(fā)布到 npm 商場去锉走,所以 npm 提供給我們 npm-link 這個命令用來進行本地化開發(fā)。

但是 npm-link 有個缺點不利于調(diào)試代碼藕届,我們基本上必須開兩個編輯器挪蹭,一個編輯器改開發(fā) package 的代碼,另一個編輯器用來調(diào)試休偶,照此推理嚣潜,我們開發(fā)組件庫幾十個組件,難道要開幾十個窗口椅贱,No,這不科學(xué)只冻。

當(dāng)然我們也可以把開發(fā) package 的代碼目錄拖到調(diào)試目錄中庇麦,來變相模擬 workspaces。

那就要問了喜德,我們最理想開發(fā)目錄是什么樣子的山橄;我們肯定想開發(fā)和調(diào)試在同一個項目下,等開發(fā)調(diào)試完成任何目錄都不用動舍悯,直接發(fā)布就行了航棱,而 npm 的新特性 workspaces 正好滿足。

注意:workspaces 是 npm v7.x 也就是 Node@15.0.0 新增的功能萌衬,所以請保持你的本地環(huán)境版本大于它們饮醇。

認(rèn)識 workspaces

現(xiàn)在假如我們開發(fā)一個 npm package 叫 calculator (計算器),且它只有四個基本的功能——加減乘除秕豫,我們看看在 workspaces 中如何對 calculator 進行調(diào)試朴艰。

  1. 首先創(chuàng)建一個目錄同時初始化一個 package.json:
?  Desktop mkdir calculator && cd calculator && npm init 
  1. 創(chuàng)建加減乘除模塊包

分別執(zhí)行命令(一個一個創(chuàng)建):

$ npm init -w packages/plus -y
$ npm init -w packages/minus -y
$ npm init -w packages/times -y
$ npm init -w packages/divide -y

也可以簡單點,用一條命令:

$ npm init -w packages/plus -w packages/minus -w packages/times -w packages/divide -y

這個時候目錄變成了:

?  calculator tree
.
├── package.json
└── packages
    ├── divide
    │   └── package.json
    ├── minus
    │   └── package.json
    ├── plus
    │   └── package.json
    └── times
        └── package.json

5 directories, 5 files

同時根目錄下的 package.json 新增了 workspaces 字段:

"workspaces": [
    "packages/plus",
    "packages/minus",
    "packages/times",
    "packages/divide"
]

如果我們不想讓 workspaces 字段太多混移,可以改成這樣:

"workspaces": [
    "packages/*"
 ]

workspaces 字段是留給 npm install 來創(chuàng)建軟連接使用的祠墅,下面會講到。

  1. 新增五個文件

新增五個 index.js 文件歌径,目錄現(xiàn)在如下:

?  calculator tree 
.
├── package.json
├── packages
│   ├── divide
│   │   ├── index.js
│   │   └── package.json
│   ├── minus
│   │   ├── index.js
│   │   └── package.json
│   ├── plus
│   │   ├── index.js
│   │   └── package.json
│   └── times
│       ├── index.js
│       └── package.json
└── index.js

5 directories, 10 files

為了支持 ESM 我們手動改寫所有 package.json 新增一個字段:

"type": "module",
  1. 模塊的實現(xiàn)

我們這里給出加法的代碼毁嗦,plus 目錄的 index.js 文件內(nèi)容:

export default (a, b) => a + b;

其他三個函數(shù)同理。

  1. 驗證程序的正確性

我們怎么驗證程序的正確性呢回铛,當(dāng)然是分別調(diào)用四個模塊驗證了狗准,所以 安裝四個模塊克锣,執(zhí)行命令:

npm install

熟悉的 node_modules 文件夾出現(xiàn)了,但是里面的文件夾和常見的卻有所不同驶俊。

通過命令行終端甚至看的更清楚些:

其實就是把 node_modules 這四個文件夾鏈接到了 packages 目錄下對應(yīng)的文件夾娶耍,這是一種軟鏈接技術(shù)(即讓 packages 里面的所有模塊都軟鏈到 node_modules 目錄),就像 Windows 桌面的快捷方式一樣饼酿。注意榕酒,我們更改 packages 文件夾下的文件 node_modules 文件夾自動更新。

根目錄下 index.js 文件里調(diào)試加法:

import plus from "plus";

console.log(`1 + 1 = ${plus(1, 1)}`)

其他三個方法類似使用故俐,不再演示想鹰。

如何給模塊安裝依賴

比如除法使用 number-precision 保留精度:

$ npm install number-precision --workspace divide

# 也可簡寫為
$ npm i number-precision -w divide

如果要給所有模塊同時安裝 dayjs 這個依賴:

# 注意 workspaces 這里多個 `s`
$ npm install dayjs --workspaces

# 也可簡寫為
$ npm i dayjs -ws

移除依賴

將 divide 模塊中的 number-precision 依賴移除:

?  calculator npm uninstall number-precision -w divide

執(zhí)行模塊里面的 scripts

假設(shè) divide 模塊包里面的 package.json 文件中 scripts 字段為:

{
  "scripts": {
    "dev": "node index.js"
  }
}

那么可以通過下面的命令啟動 divide 模塊包里面的 dev 腳本

$ npm run dev -w divide

OK,workspaces 的基本使用差不多就是辣么多药版,使用 workspaces 進行開發(fā)調(diào)試只是小菜辑舷,接下來看看 workspaces 真正的核心應(yīng)用。

monorepo

monorepo 即單體倉庫槽片,這里有一份學(xué)習(xí)資料何缓,https://semaphoreci.com/blog/what-is-monorepo

如果你經(jīng)常在 GitHub 上學(xué)習(xí),你會發(fā)現(xiàn)前端很多庫的源碼都是 monorepo 架構(gòu)的还栓,比如說 Vue碌廓、React 等等。

之所以 monorepo 流行就在于剩盒,項目過大管理進入了困難谷婆,如果維護一個單體倉庫太過龐大了,維護多個倉庫又太過繁瑣辽聊,所以 monorepo 出來了纪挎,讓你維護一個倉庫,但是一個倉庫切分為好多個 packages跟匆,這樣便于你維護的同時异袄,部分功能也好切割出去,之前 monorepo 最好的工具是 yarn 贾铝,現(xiàn)在好了 npm 已經(jīng)開始原生支持了隙轻。

總結(jié)

今天,我們學(xué)習(xí)通過 workspaces 替代 npm link 調(diào)試的新方式垢揩,讓你不在飽受切編輯器之苦玖绿,但 workspaces 真正大放異彩的地方,確實和 monorepo 配合使用叁巨,作為流行庫組織代碼的流行方式斑匪。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚀瘸,更是在濱河造成了極大的恐慌狡蝶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮勃,死亡現(xiàn)場離奇詭異贪惹,居然都是意外死亡,警方通過查閱死者的電腦和手機寂嘉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門奏瞬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泉孩,你說我怎么就攤上這事硼端。” “怎么了寓搬?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵珍昨,是天一觀的道長。 經(jīng)常有香客問我句喷,道長镣典,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任唾琼,我火速辦了婚禮骆撇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘父叙。我一直安慰自己,他們只是感情好肴裙,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布趾唱。 她就那樣靜靜地躺著,像睡著了一般蜻懦。 火紅的嫁衣襯著肌膚如雪甜癞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天宛乃,我揣著相機與錄音悠咱,去河邊找鬼。 笑死征炼,一個胖子當(dāng)著我的面吹牛析既,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谆奥,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼眼坏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酸些?” 一聲冷哼從身側(cè)響起宰译,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤檐蚜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沿侈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闯第,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年缀拭,在試婚紗的時候發(fā)現(xiàn)自己被綠了咳短。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡智厌,死狀恐怖诲泌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铣鹏,我是刑警寧澤敷扫,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站诚卸,受9級特大地震影響葵第,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜合溺,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一卒密、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棠赛,春花似錦哮奇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辩涝,卻和暖如春贸伐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怔揩。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工捉邢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人商膊。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓伏伐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晕拆。 傳聞我的和親對象是個殘疾皇子秘案,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 環(huán)境初始化 mkdir npm-log cd npm-log npm init -y 入口文件 自定義依賴模塊:模...
    說叁兩事閱讀 2,124評論 0 0
  • 創(chuàng)建帶有可執(zhí)行文件的包 首先創(chuàng)建可執(zhí)行文件,文件首行要指定當(dāng)前腳本的解釋器#! /usr/bin/env node...
    compus135閱讀 1,279評論 0 0
  • 前言 由于網(wǎng)上很多關(guān)于monorepo的文章分享跟著做都會有很多報錯, 所以想記錄下來... 維護多個倉庫的公共代...
    Moon_f3e1閱讀 14,337評論 1 21
  • 本文轉(zhuǎn)自:Yarn Workspace 使用指南[http://www.reibang.com/p/990afa...
    風(fēng)之化身呀閱讀 1,740評論 0 0
  • 1. npm-shrinkwrap 類似yarn.lock固定包的依賴 以及包內(nèi)部的依賴 2. node-sass...
    別過經(jīng)年閱讀 1,639評論 0 0