jiek 1.1.12 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,131 +1,78 @@
1
1
  # Jiek
2
2
 
3
- 为什么没有一个在 `monorepo` 下面足够现代又足够简单的构建工具呢?恭喜你发现了宝藏~
4
-
5
- ## 为什么不使用 X?
6
-
7
- - Q: [`tsup`](https://github.com/egoist/tsup)
8
- - A: `tsup` 基于 esbuild 与 rollup,是他们上层的一个 no-config 构建工具
9
- - 关于类型编译的支持并不足够智能,无法自动找到对应的 `tsconfig.json`,在 `monorepo` 下面会遇到相关的问题
10
- - 虽然它是声称 no-config,但是在多入口,以及其他的复杂情况下的产物时,仍需要编写相关配置
11
- - 偏向于使用 cli 中的相关参数,以及配置文件,不够自然
12
- - `monorepo` 的场景下使用起来进行开发时,在复杂依赖关系的情况下需要管理复杂的构建依赖关系
13
- - 老牌工具,符合时代背景下的相关需求;沉淀时间久,功能相对来说较为完善;生态较为丰富,网络上的资源较多
14
-
15
- - Q: [`unbuild`](https://github.com/unjs/unbuild)
16
- - A: 该工具的底座技术与 `tsup` 也是极为一致,与其不同的便是他的 config 实际上是可以基于 package.json 生成的。
17
- - 该工具与 `tsup` 一样,存在对:「`monorepo` 支持不好」、「不支持 Project Reference」这些问题
18
- - 使用的时候你需要根据模版声明输出,再反向根据约定好的规则去创建相关的入口文件,不够自然,也不够灵活过于死板
19
- - 不过该工具在无配置化上也前进了较大一步,对于一些简单的项目来说,是一个不错的选择
20
-
21
- - Q: [`bunchee`](https://github.com/huozhi/bunchee)
22
- - A: 换成了 `swc` + `rollup`,嗯。
23
- - 同样在 `monorepo` 下有着相关问题,同样没办法处理 Project Reference
24
- - 定义了一定的 exports 产物到输入文件的规则,能实现一定的灵活性,但是编写导出规则时会过于冗长
25
- - 没办法在 monorepo 的复杂依赖关系场景中去减轻开发负担
3
+ | zh-Hans
4
+ | [en](https://github.com/NWYLZW/jiek/blob/master/packages/jiek/.about/en/README.md)
5
+
6
+ [![npm version](https://img.shields.io/npm/v/jiek)](https://npmjs.com/package/jiek)
7
+ [![npm downloads](https://img.shields.io/npm/dm/jiek)](https://npm.chart.dev/jiek)
8
+
9
+ > 基于 `package.json` 元数据并适用于 `Monorepo` 的**轻便**工具库编译管理套件。
10
+
11
+ - [x] 自动推断:基于 `package.json` 的相关字段自动推断出构建规则,减少配置文件的编写,更加轻便与符合标准
12
+ - `exports`:根据入口文件推断构建目标与类型
13
+ - `imports`:定义路径别名,并在构建的时候自动 bundle 进来
14
+ - `type: module`:根据选项智能决定输出文件后缀,不需要考虑 `cjs` 与 `esm` 的适配问题
15
+ - `dependencies`、`peerDependencies`、`optionalDependencies`:自动将符合规则的依赖标记为 `external`
16
+ - `devDependencies`:将标记为开发依赖的 bundle 进对应的最终产物之中
17
+ - [ ] 构建工具:支持多种构建工具,无需纠结于用 swc 还是 esbuild 又或者是 tsc
18
+ - [x] `esbuild`
19
+ - [x] `swc`
20
+ - [ ] `typescript`
21
+ - [x] 工作空间友好:支持在 pnpm 下的工作空间开发范式
22
+ - [ ] 支持更多的 PM
23
+ - [ ] 更好的工作空间任务流
24
+ - [x] 类型定义文件:支持聚合生成类型定义文件
25
+ - [x] 监听模式:适配 rollup 的监听模式
26
+ - [x] 发布适配:支持同构生成 `package.json` 等相关字段
27
+ - [ ] 根据 `package.json` 中的路径自动替换 README.md 中的相对路径链接为对应的网络链接
28
+ - [x] CommonJS:产物兼容正在使用 cjs 的用户
29
+ - [ ] 插件化
30
+ - [ ] Dotenv:支持 dotenv 配置文件
31
+ - [ ] Replacer:支持替换文件内容
26
32
 
27
33
  ## 安装
28
34
 
29
- 目前只支持 pnpm,因为 workspace 的相关机制在 pnpm 的支持是最好的(主要也没时间支持别的工具了)。
30
-
31
35
  ```bash
32
- pnpm install -D jiek
36
+ npm i -D jiek
37
+ # or
38
+ pnpm i -D jiek
39
+ # or
40
+ yarn add -D jiek
33
41
  ```
34
42
 
35
- ## Features
36
-
37
- 有啥好用的?
38
-
39
- - 简化你的导出规则,不需要去写一些能够自动化生成的代码
40
- - 自然而然的对你的输入进行构建,按照统一的规则你可以几乎不用去写多余的配置
41
- - 在构建的时候不再依赖预构建目标的依赖或者是整体的全量构建,每一次构建只需要关注自己的目标
42
- - 预集成了一套完整的构建工具链,自动根据需求激活相关的插件进行工作
43
-
44
- ### build
43
+ ## 快速起步
45
44
 
46
- 写构建脚本一直不是一件简单的事情,那么怎么把一个复杂的事情变简单呢?我们可以回到需求的本身,那就是「定义什么便构建什么」。在这里我们用自然的方式来定义构建产物,而不需要去多写一行多余的代码。
47
-
48
- > 在这里你需要了解足够先进和现代的「[模块管理]()」以及「[导出策略]()」,在这里我们便是基于这俩点达成的一些自然而然的约定来实现的减轻负担。
49
-
50
- 接下来我们可以一步步的来看看我们的构建工具是如何工作的。
51
-
52
- #### 定义入口
53
-
54
- 在这里我们可以简单的对 exports 进行一定的扩展,在这里我们把我们定义在 `package.json` 中的 `exports` 字段可以看作为我们的入口文件。在这里我们简单定义一个入口:
55
-
56
- ```json
57
- {
58
- "exports": "./src/index.ts"
59
- }
60
- ```
45
+ 通过一些简单的方式能又快又轻松的生成需要的产物。
61
46
 
62
- 是不是很简单呢?没感觉?那你得试试其他的工具了,如果你不了解其他的工具,在这里我示范一段其他的工具你需要定义的:
47
+ - 在 `package.json` 中添加入口文件,这里需要设置为原文件路径。
63
48
 
64
- <details>
49
+ 你可以在 Node.js 文档中查看更多对于 [exports](https://nodejs.org/api/packages.html#exports) 的相关内容。
65
50
 
66
51
  ```json
67
52
  {
68
- "type": "module",
69
- "exports": {
70
- "import": {
71
- "types": "./dist/es/index.d.mts",
72
- "default": "./dist/es/index.mjs"
73
- },
74
- "require": {
75
- "types": "./dist/cjs/index.d.ts",
76
- "default": "./dist/cjs/index.js"
77
- }
78
- }
53
+ ...
54
+ "exports": "./src/index.ts",
55
+ ...
79
56
  }
80
57
  ```
81
58
 
82
- </details>
83
-
84
- > 在这里你肯定想问如果你有复杂的导出呢?或者说多个入口呢?在[这里](../pkger/README.md)你可以看到我们的工具的生成规则。
85
-
86
- #### 运行指令
87
-
88
- 假设你有一个 pakcages 下面的包叫 `@monorepo/utils` ,那么你可以这样运行:
89
-
90
- ```shell
91
- jiek build -f utils
92
- ```
93
-
94
- 是不是很简单呢?在这里我们只需要告诉工具我们的包名就可以了,其他的事情我们都不需要关心。
59
+ - 假设你在工作空间下有一个包名字为 `@monorepo/utils` ,那么你可以运行 `jb utils` 来构建这个包。
95
60
 
96
- #### 个性化需求
61
+ - 当你完成了开发的相关步骤后,在发布阶段你可以使用 `jk -f utils publish` 来发布你的包,本工具会自动转化并填充 `package.json` 对应的字段。
97
62
 
98
- 我知道,你肯定想定义一些自己的东西,你可以在你的根目录或者包的根目录下面创建一个 `jiek.config.ts` 文件:
63
+ 你可以添加 `-p/--preview` 参数来预览待发布的 `package.json` 的内容。
99
64
 
100
- ```typescript
101
- import { defineConfig } from 'jiek'
65
+ ## CLI
102
66
 
103
- export default defineConfig({
104
- build: {
105
- output: 'lib'
106
- }
107
- })
67
+ ```text
68
+ Usage: jk [options] [command]
108
69
  ```
109
70
 
110
- #### 幕后的故事
111
-
112
- 一些关于本工具的设计思路和实现细节,不阅读也不会影响各位的使用,感兴趣的各位可以看看。
113
-
114
- - 入口的约定:还没写好
115
- - 插件的抉择:还没写好
116
-
117
- #### 补充内容
118
-
119
- - 关于样式
120
- - 关于类型
121
- - 关于 `monorepo`
122
-
123
- #### 接下来要做的
71
+ ## 为什么不使用 X?
124
72
 
125
- - [ ] 支持更多的 PM
126
- - [ ] 工作空间构建流
127
- - [ ] 依赖分析工具
128
- - 本次构建哪些在 pacakge 中声明的依赖没用用到,可以移除(提供配置关闭该警告)
129
- - 针对构建产物的依赖关系生成关系图(可配置颗粒度为文件或者导出方法)
73
+ 在这里与 `jiek` 类似的工具有:[tsup](https://github.com/egoist/tsup)、[unbuild](https://github.com/unjs/unbuild)、[bunchee](https://github.com/huozhi/bunchee)、[pkgroll](https://github.com/privatenumber/pkgroll)、[tsdown](https://github.com/sxzz/tsdown)。但是他们都有着一些共同问题没有解决,比如说:
130
74
 
131
- ### publish
75
+ - `monorepo` 的支持存在一定的问题,在依赖工作空间其他的包时必须重新编译相关依赖
76
+ - 编写入口文件的规则过于繁琐,不够自然
77
+ - 无法处理 `tsconfig.json` 中的 `Project Reference` 相关问题
78
+ - 根据`conditions`
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from 'node:fs'
3
+ import { createRequire } from 'node:module'
4
+ import { dirname, resolve } from 'node:path'
5
+ import process from 'node:process'
6
+
7
+ process.env.JIEK_IS_ONLY_BUILD = 'true'
8
+
9
+ const __dirname = dirname(import.meta.url.replace('file://', ''))
10
+ if (existsSync(resolve(__dirname, '../.jiek-dev-tag'))) {
11
+ const require = createRequire(import.meta.url)
12
+ require('esbuild-register')
13
+ require('../src/cli-only-build.ts')
14
+ } else {
15
+ import('jiek/cli-only-build')
16
+ }