Skip to content

Commit 32c1447

Browse files
committed
fix: 修复第6章节内容错误
1 parent d70a501 commit 32c1447

File tree

3 files changed

+51
-49
lines changed

3 files changed

+51
-49
lines changed

src/6/6.1.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
## 初始化
55

6-
```tsx
6+
```bash
77
$ git clone --depth 1 [email protected]:npmstudy/your-node-v20-monorepo-project.git my-monorepo
88
Cloning into 'my-monorepo'...
99
remote: Enumerating objects: 52, done.
@@ -16,7 +16,7 @@ Resolving deltas: 100% (2/2), done.
1616

1717
只克隆最新的代码,无更多git commit记录。
1818

19-
```tsx
19+
```bash
2020
$ rm -rf .git/
2121
$ git init
2222
Initialized empty Git repository in /Users/alfred/workspace/npmstudy/my-monorepo/.git/
@@ -117,7 +117,7 @@ pnpm是一个快速、高效且节省空间的包管理工具,适用于大型
117117

118118
安装pnpm
119119

120-
```tsx
120+
```bash
121121
$ npm i -g pnpm
122122

123123
added 1 package in 4s
@@ -128,7 +128,7 @@ added 1 package in 4s
128128

129129
安装依赖
130130

131-
```tsx
131+
```bash
132132
$ pnpm i
133133
Scope: all 3 workspace projects
134134
Lockfile is up to date, resolution step is skipped
@@ -175,7 +175,7 @@ Done in 5.6s
175175

176176
## 目录结构
177177

178-
```tsx
178+
```bash
179179
$ tree . -L 4 -I node_modules
180180
.
181181
├── LICENSE
@@ -227,7 +227,7 @@ $ tree . -L 4 -I node_modules
227227

228228
目录结构
229229

230-
```tsx
230+
```bash
231231
$ tree packages/lib/ -I node_modules
232232
packages/lib/
233233
├── package.json
@@ -263,7 +263,7 @@ Vitest是一个基于Vite的单元测试框架,它具有以下优点:
263263
3. 强大的功能:Vitest支持常见的单元测试功能,包括断言、测试套件、测试组织和测试覆盖率等。它还提供了丰富的扩展性,可以根据项目的需求进行自定义配置和扩展。
264264
4. 社区支持:Vitest是一个开源项目,拥有活跃的社区支持。你可以在GitHub上找到其代码库,并参与讨论、提问问题或贡献代码。
265265

266-
它个快速、简单易用且功能强大的单元测试框架,适用于使用Vite构建的项目。它和Node.js test runner很像,你可以通过阅读文档和示例来了解更多关于Vitest的信息,并开始在你的项目中使用它。
266+
它是个快速、简单易用且功能强大的单元测试框架,适用于使用Vite构建的项目。它和Node.js test runner很像,你可以通过阅读文档和示例来了解更多关于Vitest的信息,并开始在你的项目中使用它。
267267

268268
<aside>
269269
💡 学会一门,其他就会触类旁通,这是学习的好处。
@@ -274,7 +274,7 @@ Vitest是一个基于Vite的单元测试框架,它具有以下优点:
274274

275275
目录
276276

277-
```tsx
277+
```bash
278278
$ tree example/ -I node_modules
279279
example/
280280
├── package.json
@@ -287,7 +287,7 @@ example/
287287

288288
这里以koa为例
289289

290-
```tsx
290+
```js
291291
import Koa from 'koa';
292292
import { lib } from 'lib2';
293293
const app = new Koa();
@@ -301,7 +301,7 @@ app.listen(3000);
301301

302302
执行
303303

304-
```tsx
304+
```bash
305305
$ pnpm example
306306

307307
> your-node-v20-monorepo-project@ example /Users/alfred/workspace/npmstudy/my-monorepo
@@ -334,19 +334,19 @@ $ pnpm example
334334

335335
其实,在这种Node.js Server应用里,也是可以进行测试的,比如使用supertest测试api和页面,甚至如果想极致一点,也可以使用Cypress做e2e测试。
336336

337-
这是从简,并没有加,如果大家感兴趣,可以作为课后练习。
337+
这里从简,并没有加,如果大家感兴趣,可以作为课后练习。
338338

339339
## 新增模块
340340

341341
如果想新增一个模块,那就通过简单的shell命令就可以了。
342342

343-
```tsx
343+
```bash
344344
$ cp -rf packages/lib packages/lib3
345345
```
346346

347347
查看packages下内容,会发现多了lib3
348348

349-
```tsx
349+
```bash
350350
$ tree packages/ -L 2
351351
packages/
352352
├── lib
@@ -384,7 +384,7 @@ packages/
384384
1. cli解析,推荐使用commander或cac
385385
2. 输入项,推荐使用 [https://www.npmjs.com/package/inquirer](https://www.npmjs.com/package/inquirer)
386386
3. 模版引擎推荐使用handlebars
387-
4. 可以[**download-git-repo](https://www.npmjs.com/package/download-git-repo)** [https://www.npmjs.com/package/dclone](dclone).
387+
4. 可以 **[download-git-repo](https://www.npmjs.com/package/download-git-repo)** [https://www.npmjs.com/package/dclone](dclone).
388388

389389
<aside>
390390
💡 在前端开发中,脚手架是一个用于快速搭建项目结构和提供初始配置的工具。它可以帮助开发者快速创建项目,并集成了一些常用的工具、库和最佳实践。

src/6/6.2.md

+36-34
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@
33

44
<https://github.com/npmstudy/your-node-v20-monorepo-project> 里,我们用到的技术栈如下。
55

6-
```markdown
7-
- [Tsup](https://tsup.egoist.dev/) as a TypeScript universal package.
8-
- [Tsx](https://github.com/esbuild-kit/tsx) as a Node.js enhanced with esbuild to run TypeScript & ESM
9-
- [Tsd](https://github.com/SamVerschueren/tsd) as type test runner
10-
- [Tsdoc](https://tsdoc.org/) as document
11-
- [PNPM](https://pnpm.io/workspaces) as workspace manager and package manager.
12-
- [Vitest](https://vitest.dev/) as a test runner.
13-
- [Size Limit](https://github.com/ai/size-limit) as a size limit plugin.
14-
- [Prettier](https://prettier.io/) as a code formatter.
15-
- [ESLint](https://eslint.org/) as a code linter.
16-
- [NX](https://nx.dev) as cacheable operations.
17-
- [Changesets](https://github.com/changesets/changesets/) as a way to manage changes and releases.
18-
- [c8](https://www.npmjs.com/package/c8) as coverage
19-
- [supertest](https://www.npmjs.com/package/supertest) as server test
20-
- [cypress](https://www.cypress.io/) as e2e test
21-
```
6+
> - [Tsup](https://tsup.egoist.dev/) as a TypeScript universal package.
7+
> - [Tsx](https://github.com/esbuild-kit/tsx) as a Node.js enhanced with esbuild to run TypeScript & ESM
8+
> - [Tsd](https://github.com/SamVerschueren/tsd) as type test runner
9+
> - [Tsdoc](https://tsdoc.org/) as document
10+
> - [PNPM](https://pnpm.io/workspaces) as workspace manager and package manager.
11+
> - [Vitest](https://vitest.dev/) as a test runner.
12+
> - [Size Limit](https://github.com/ai/size-limit) as a size limit plugin.
13+
> - [Prettier](https://prettier.io/) as a code formatter.
14+
> - [ESLint](https://eslint.org/) as a code linter.
15+
> - [NX](https://nx.dev) as cacheable operations.
16+
> - [Changesets](https://github.com/changesets/changesets/) as a way to manage changes and releases.
17+
> - [c8](https://www.npmjs.com/package/c8) as coverage
18+
> - [supertest](https://www.npmjs.com/package/supertest) as server test
19+
> - [cypress](https://www.cypress.io/) as e2e test
2220
2321
运行TS的4个(已讲过)
2422

@@ -46,7 +44,7 @@
4644
4. Prettier
4745
5. Changesets
4846

49-
其中ESLint和Prettier前端同学都熟悉,这里就细讲了
47+
其中ESLint和Prettier前端同学都熟悉,这里就不细讲了
5048

5149
- ESLint是一个用于JavaScript和JSX代码的静态代码分析工具。它可以帮助开发者在编写代码的过程中发现并修复潜在的问题,以确保代码的质量和一致性。
5250
- Prettier是一个代码格式化工具,用于自动格式化代码以保持一致的代码风格。它支持多种编程语言,包括JavaScript、CSS、HTML、JSON等。Prettier可以帮助开发者快速、准确地格式化代码,提高代码的可读性和可维护性。它可以与其他代码检查工具(如ESLint)配合使用,以确保代码的质量和一致性。
@@ -81,15 +79,15 @@ pnpm在2018年发布,作为npm的更快速和更高效的替代品。
8179

8280
pnpm使用的是npm version 2.x类似的树形结构,同时使用.pnpm 以平铺的形式储存着所有的包。这里的.pnpm为虚拟存储目录,该目录通过`<package-name>@<version>`来实现相同模块不同版本之间隔离和复用,由于它只会根据项目中的依赖生成,并不存在提升,所以它不会存在之前提到的**Phantom dependencies**问题!
8381

84-
然后使用Store + Links和文件资源进行关联。简单说pnpm把会包下载到一个公共目录,如果某个依赖在 store 目录中存在了话,那么就会直接从 store 目录里面去 hard-link,避免了二次安装带来的时间消耗,如果依赖在 store 目录里面不存在的话,就会去下载一次。
82+
然后使用Store + Links和文件资源进行关联。简单说pnpm会把包下载到一个公共目录,如果某个依赖在 store 目录中存在了话,那么就会直接从 store 目录里面去 hard-link,避免了二次安装带来的时间消耗,如果依赖在 store 目录里面不存在的话,就会去下载一次。
8583

8684
通过Store + hard link的方式,不仅解决了项目中的NPM doppelgangers问题,项目之间也不存在该问题,从而完美解决了npm3+和yarn中的包重复问题!
8785

8886
![Untitled](img/Untitled%204.png)
8987

9088
pnpm除了安装速度快,节省磁盘空间,避免幽灵依赖等优化,也内置了对monorepo的支持。使用起来比较简单,在项目根目录中新建pnpm-workspace.yaml文件,并声明对应的工作区就好。
9189

92-
```tsx
90+
```bash
9391
$ cat pnpm-workspace.yaml
9492
packages:
9593
- 'example'
@@ -99,11 +97,11 @@ packages:
9997

10098
剩下的就是运行时处理。之前nx run-many解决了monorepo子模块运行的问题。很多时候我们需要在根目录执行某个项目 的构建脚本,需要通过—filter或-F过滤之后,再执行,示例如下。
10199

102-
```tsx
100+
```bash
103101
$ pnpm -F example dev
104102
```
105103

106-
以上都是pnpm的有点,其实pnpm的演进还是比较快的,比如pnpm v7和pnpm v8版本差异还是比较大的,且不完全兼容。但整个社区是比较活跃的,
104+
以上都是pnpm的优点,其实pnpm的演进还是比较快的,比如pnpm v7和pnpm v8版本差异还是比较大的,且不完全兼容。但整个社区是比较活跃的,
107105

108106
<aside>
109107
💡 都说Node.js和前端复杂,其实是背后工程复杂度导致的,如果没有这么多依赖,这么多版本,也不会出现幻影依赖这样的问题。其实,对用的人来说无感的,我就用pnpm v8,像其他社区一样,也没问题的。真正的问题是Node.js和前端变化太快,你在较短时间内,总可能会遇到pnpm v7的代码,甚至互相切换。
@@ -129,7 +127,7 @@ $ pnpm -F example dev
129127

130128
先写一个简单的Koa的Hello world。见app.js
131129

132-
```tsx
130+
```js
133131
import Koa from "koa";
134132
const app = new Koa();
135133

@@ -143,15 +141,15 @@ export default app;
143141

144142
再写一个测试脚本,run.js
145143

146-
```tsx
144+
```js
147145
import app from "./index.js";
148146

149147
app.listen(3000);
150148
```
151149

152150
此时,执行node run.js就可以启动服务了。然后我们看一下测试如何编写。
153151

154-
```tsx
152+
```js
155153
import { expect, test } from "vitest";
156154
import supertest from "supertest";
157155
import app from "./index.js";
@@ -167,7 +165,7 @@ test("koa app", async () => {
167165

168166
这个代码和我们在Node.js v20的test runner里几乎是一模一样的。通过下面命令即可运行测试。
169167

170-
```tsx
168+
```bash
171169
$ npx vitest run
172170

173171
RUN v0.34.6 /Users/alfred/workspace/npmstudy/vitest-with-supertest
@@ -190,13 +188,13 @@ $ npx vitest run
190188

191189
安装
192190

193-
```tsx
191+
```bash
194192
$ npm install cypress --save-dev --registry=https://registry.npmmirror.com
195193
```
196194

197195
通过npx cypress open打开。
198196

199-
```tsx
197+
```bash
200198
$ npx cypress open
201199
It looks like this is your first time using Cypress: 13.3.0
202200

@@ -217,7 +215,7 @@ DevTools listening on ws://127.0.0.1:54097/devtools/browser/dc560ea2-0aad-47a4-9
217215

218216
修改代码,手动执行node run.js启动服务。
219217

220-
```tsx
218+
```js
221219
describe("template spec", () => {
222220
it("passes", () => {
223221
cy.visit("http://127.0.0.1:3000");
@@ -230,7 +228,7 @@ describe("template spec", () => {
230228

231229
为了简化操作,我们把启动服务放到cypress.config.js里。
232230

233-
```tsx
231+
```js
234232
import { defineConfig } from "cypress";
235233
import app from "./index.js";
236234
export default defineConfig({
@@ -248,7 +246,7 @@ export default defineConfig({
248246

249247
此时,执行结果如下。
250248

251-
```tsx
249+
```bash
252250
$ npx cypress run
253251

254252
DevTools listening on ws://127.0.0.1:61755/devtools/browser/0a2f2716-10cb-49b9-a2c9-5163469574e9
@@ -364,7 +362,7 @@ nx 会计算当前执行的 target 的 Hash 作为 cache key,在 target 执行
364362

365363
比如依赖如下。
366364

367-
```tsx
365+
```bash
368366
$ pnpm project-graph
369367

370368
> your-node-v20-monorepo-project@ project-graph /Users/alfred/workspace/npmstudy/your-node-v20-monorepo-project
@@ -379,13 +377,17 @@ nx除了本地换成,其实还支持云服务(remote cache)。即nx.app,
379377

380378
![Untitled](img/Untitled%2015.png)
381379

382-
<https://github.com/npmstudy/your-node-v20-monorepo-project> 项目里,我们其实只用了非常简单的npm nx run-many
380+
<https://github.com/npmstudy/your-node-v20-monoreopo-project> 项目里,我们其实只用了非常简单的npm nx run-many
383381

384-
```tsx
385-
"build": "nx run-many -t build",
382+
```json
383+
{
384+
"scripts": {
385+
"build": "nx run-many -t build",
386386
"build:fast": "nx run-many -t build:fast",
387387
"dev": "nx run-many -t dev",
388388
"test": "nx run-many -t test",
389+
}
390+
}
389391
```
390392

391393
虽然多了一个nx模块,但执行的时候能够利用本地缓存,加快打包、测试速度,已经是非常好的事儿。

src/6/6.3.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
我之所以了解tsd,是因为阅读fastify源码,翻它的package.json:[https://github.com/fastify/fastify/blob/main/package.json#L184](https://github.com/fastify/fastify/blob/main/package.json#L184)
1515

16-
其实还有更加轻量级的<https://github.com/mrazauskas/tsd-lite,我是在翻jest中expect模块的时候找见的,地址[https://github.com/jestjs/jest/blob/main/packages/expect/package.json>](<https://github.com/jestjs/jest/blob/main/packages/expect/package.json)。>
16+
其实还有更加轻量级的<https://github.com/mrazauskas/tsd-lite>,我是在翻jest中expect模块的时候找见的,地址<https://github.com/jestjs/jest/blob/main/packages/expect/package.json>
1717

1818
另外,《开放式协作:开源软件的生产与维护》也是不错的,值得一读。
1919

0 commit comments

Comments
 (0)