热乎乎的 workspaces 替代 npm link 调试的新方式

热乎乎的 workspaces 替代 npm link 调试的新方式.png

目录

  • 前言
  • 认识 workspaces
  • 如何给模块安装依赖
  • 移除依赖
  • 执行模块里面的 scripts
  • monorepo

前言

作为一个前端,在工程化的项目里你肯定使用过很多很多的 npm package,不知道你有没有尝试开发过 npm package 或者研究下 npm package 的开发流程,如果你又经验,那么你一定很的熟悉 npm-link 这个命令。

我们本地化开发 npm package 不可能每次改了代码,都发布到 npm 商场去,所以 npm 提供给我们 npm-link 这个命令用来进行本地化开发。

但是 npm-link 有个缺点不利于调试代码,我们基本上必须开两个编辑器,一个编辑器改开发 package 的代码,另一个编辑器用来调试,照此推理,我们开发组件库几十个组件,难道要开几十个窗口,No,这不科学。

当然我们也可以把开发 package 的代码目录拖到调试目录中,来变相模拟 workspaces。

那就要问了,我们最理想开发目录是什么样子的;我们肯定想开发和调试在同一个项目下,等开发调试完成任何目录都不用动,直接发布就行了,而 npm 的新特性 workspaces 正好满足。

注意:workspaces 是 npm v7.x 也就是 Node@15.0.0 新增的功能,所以请保持你的本地环境版本大于它们

认识 workspaces

现在假如我们开发一个 npm package 叫 calculator (计算器),且它只有四个基本的功能——加减乘除,我们看看在 workspaces 中如何对 calculator 进行调试。

  1. 首先创建一个目录同时初始化一个 package.json:
➜  Desktop mkdir calculator && cd calculator && npm init 
  1. 创建加减乘除模块包

分别执行命令(一个一个创建):

$ 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 来创建软连接使用的,下面会讲到。

  1. 新增五个文件

新增五个 index.js 文件,目录现在如下:

➜  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. 模块的实现

我们这里给出加法的代码,plus 目录的 index.js 文件内容:

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

其他三个函数同理。

  1. 验证程序的正确性

我们怎么验证程序的正确性呢,当然是分别调用四个模块验证了,所以 安装四个模块,执行命令:

npm install

熟悉的 node_modules 文件夹出现了,但是里面的文件夹和常见的却有所不同。

通过命令行终端甚至看的更清楚些:

其实就是把 node_modules 这四个文件夹链接到了 packages 目录下对应的文件夹,这是一种软链接技术(即让 packages 里面的所有模块都软链到 node_modules 目录),就像 Windows 桌面的快捷方式一样。注意,我们更改 packages 文件夹下的文件 node_modules 文件夹自动更新。

根目录下 index.js 文件里调试加法:

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

执行模块里面的 scripts

假设 divide 模块包里面的 package.json 文件中 scripts 字段为:

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

那么可以通过下面的命令启动 divide 模块包里面的 dev 脚本

$ npm run dev -w divide

OK,workspaces 的基本使用差不多就是辣么多,使用 workspaces 进行开发调试只是小菜,接下来看看 workspaces 真正的核心应用。

monorepo

monorepo 即单体仓库,这里有一份学习资料,https://semaphoreci.com/blog/what-is-monorepo

如果你经常在 GitHub 上学习,你会发现前端很多库的源码都是 monorepo 架构的,比如说 Vue、React 等等。

之所以 monorepo 流行就在于,项目过大管理进入了困难,如果维护一个单体仓库太过庞大了,维护多个仓库又太过繁琐,所以 monorepo 出来了,让你维护一个仓库,但是一个仓库切分为好多个 packages,这样便于你维护的同时,部分功能也好切割出去,之前 monorepo 最好的工具是 yarn ,现在好了 npm 已经开始原生支持了。

总结

今天,我们学习通过 workspaces 替代 npm link 调试的新方式,让你不在饱受切编辑器之苦,但 workspaces 真正大放异彩的地方,确实和 monorepo 配合使用,作为流行库组织代码的流行方式。

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • 环境初始化 mkdir npm-log cd npm-log npm init -y 入口文件 自定义依赖模块:模...
    说叁两事阅读 2,103评论 0 0
  • 创建带有可执行文件的包 首先创建可执行文件,文件首行要指定当前脚本的解释器#! /usr/bin/env node...
    compus135阅读 1,263评论 0 0
  • 前言 由于网上很多关于monorepo的文章分享跟着做都会有很多报错, 所以想记录下来... 维护多个仓库的公共代...
    Moon_f3e1阅读 14,235评论 1 21
  • 本文转自:Yarn Workspace 使用指南[https://www.jianshu.com/p/990afa...
    风之化身呀阅读 1,715评论 0 0
  • 1. npm-shrinkwrap 类似yarn.lock固定包的依赖 以及包内部的依赖 2. node-sass...
    别过经年阅读 1,620评论 0 0