@@ -10,11 +10,11 @@ Shadcn ui 是最近比较火的一个 React 组件库,官方介绍其并非组
10
10
11
11
<!-- truncate-->
12
12
13
- # 使用
13
+ ## 使用
14
14
15
- ## 初始化
15
+ ### 初始化
16
16
17
- shadcn ui 依赖于 tailwindcss,来实现, 所以使用 shadcn ui 的组件需要安装和配置 tailwindcss,这里就不细说了。
17
+ shadcn ui 依赖于 tailwindcss,所以使用 shadcn ui 的组件需要安装和配置 tailwindcss,这里就不细说了。
18
18
19
19
tailwindcss 安装完就可以使用 shadcn ui 提供的 cli 工具来初始化一些配置了:
20
20
@@ -26,9 +26,8 @@ npx shadcn-ui@latest init
26
26
27
27
![ image-20240428212404577] ( ./../public/images/image-20240428212404577.png )
28
28
29
- 执行这一步主要会生成一个` components.json ` 的配置文件,后续添加的时候需要读取这个配置文件的内容。
30
-
31
29
``` json
30
+ // components.json
32
31
{
33
32
"$schema" : " https://ui.shadcn.com/schema.json" ,
34
33
// 组件样式
@@ -53,7 +52,7 @@ npx shadcn-ui@latest init
53
52
}
54
53
```
55
54
56
- ## 添加组件
55
+ ### 添加组件
57
56
58
57
使用 cli 命令添加 shadcn ui 具有的组件,比如添加一个` button ` 组件
59
58
@@ -65,17 +64,17 @@ npx shadcn-ui@latest add button
65
64
66
65
![ shadcn-code] ( ./../public/images/shadcn-code.png )
67
66
68
- ## 更新组件
67
+ ### 更新组件
69
68
70
69
shadcn 的 cli 还有一个` diff ` 命令用于显示组件更新,执行` diff button ` 可以看到其会在终端显示远端和本地存在不同的代码行,通过蓝绿色区分开,说实话,这功能感觉比较鸡肋。
71
70
72
71
![ image-20240428214650945] ( ./../public/images/image-20240428214650945.png )
73
72
74
- ## monorepo
73
+ ## monorepo 支持
75
74
76
75
shadcn ui提供的三个 cli 命令都支持通过` --cwd ` 来指定项目的根目录,也算是支持` monorepo ` 吧。
77
76
78
- # cli解析
77
+ ## cli解析
79
78
80
79
shadcn 的 cli 代码基于 pnpm workspace 的结构,虽然是 monorepo 项目,但 workspace 下只有一个 cli 项目,代码目录结构还是很简洁清晰的。
81
80
@@ -122,7 +121,7 @@ async function main() {
122
121
main ()
123
122
```
124
123
125
- ## init
124
+ ### init
126
125
127
126
` init ` 方法如下,正如` init ` 命令定义的描述那样` initialize your project and install dependencies ` ,其主要工作其实就两步:
128
127
@@ -179,7 +178,7 @@ export const init = new Command()
179
178
})
180
179
```
181
180
182
- ### promptForConfig
181
+ #### promptForConfig
183
182
184
183
` promptForConfig ` 方法源码如下,其主要工作就是三步:
185
184
@@ -254,7 +253,7 @@ export async function getRegistryBaseColors() {
254
253
}
255
254
```
256
255
257
- ### fetchRegistry
256
+ #### fetchRegistry
258
257
259
258
` promptForConfig ` 内部使用的` fetchRegistry ` 方法,默认从` https://ui.shadcn.com ` 域名拉取配置,这个域名也就是shadcn ui 官方文档的域名地址。` https://ui.shadcn.com/registry/styles/index.json ` 获取一份主题配置,对应` components.json ` 的` style `
260
259
@@ -280,7 +279,7 @@ async function fetchRegistry(paths: string[]) {
280
279
}
281
280
```
282
281
283
- ### resolveConfigPaths
282
+ #### resolveConfigPaths
284
283
285
284
` resolveConfigPaths ` 内部使用` tsconfig-paths ` 的` createMatchPath ` 方法来对` tconfig.json ` 中定义的` paths ` 字段进行解析,可以得到一个绝对路径。
286
285
@@ -390,7 +389,7 @@ export declare function createMatchPath(absoluteBaseUrl: string, paths: {
390
389
391
390
所以上面的` resolveImport ` 方法对` @/components ` ,` @/lib/utils ` 这样的相对路径,解析可以得到其绝对路径如` D:\code\tsconfig-path-test\src\components ` 。
392
391
393
- ### runInit
392
+ #### runInit
394
393
395
394
` runInit ` 方法负责生成` components ` ,` utils ` 等目录,以及替换` tailwind.config.ts ` 配置,并安装 shadcn ui 需要的第三方组件库依赖` tailwindcss-animate ` ,` class-variance-authority ` ,` clsx ` 等。
396
395
@@ -479,7 +478,7 @@ export async function runInit(cwd: string, config: Config) {
479
478
}
480
479
```
481
480
482
- ### getPackageManager
481
+ #### getPackageManager
483
482
484
483
` getPackageManager ` 方法获取项目使用的依赖管理工具,这个方法非常实用,万能!
485
484
@@ -518,7 +517,7 @@ export async function getPackageManager(
518
517
}
519
518
```
520
519
521
- ## add
520
+ ### add
522
521
523
522
` add ` 命令的实现也比较简单,其主要实现部分的源码如下,可拆解为以下四步:
524
523
@@ -614,7 +613,7 @@ const add = new Command()
614
613
})
615
614
```
616
615
617
- ### getRegistryIndex
616
+ #### getRegistryIndex
618
617
619
618
` getRegistryIndex ` 会默认从远端地址——https://ui.shadcn.com/registry/index.json加载一个组件`json`,这个`json`包含了 shadcn ui 所有支持的组件信息。
620
619
@@ -665,7 +664,7 @@ export const registryItemSchema = z.object({
665
664
export const registryIndexSchema = z .array (registryItemSchema )
666
665
```
667
666
668
- ### resolveTree
667
+ #### resolveTree
669
668
670
669
在获取到远端注册的所有 shadcn ui 内部组件的信息后,` resolveTree ` 会对用户选择添加的组件进行依赖解析,得到所有需要添加到项目内部的组件信息。
671
670
@@ -708,7 +707,7 @@ export async function resolveTree(
708
707
}
709
708
```
710
709
711
- ### fetchTree
710
+ #### fetchTree
712
711
713
712
在获取所有要添加的组件后,使用` fetchTree ` 从远端加载其源码。
714
713
@@ -753,7 +752,7 @@ export async function fetchTree(
753
752
}
754
753
```
755
754
756
- ### transform
755
+ #### transform
757
756
758
757
在得到组件源码以后,从` components.json ` 中解析配置项` aliases.components ` ,得到项目存放组件的目录路径,然后使用` transform ` 方法对组件源码进行解析,并最终生成组件文件。
759
758
@@ -826,7 +825,7 @@ export async function transform(opts: TransformOpts) {
826
825
}
827
826
```
828
827
829
- ## diff
828
+ ### diff
830
829
831
830
` diff ` 命令内部主要使用了[ ` diff ` ] ( https://github.com/kpdecker/jsdiff ) 对项目的组件代码和远端组件代码进行对比,然后输出到 shell 内,具体实现就不细说了,比较简单。
832
831
@@ -961,40 +960,40 @@ async function buildStyles(registry: Registry) {
961
960
}
962
961
```
963
962
964
- # shadcn 用到的一些 nodejs 工具
963
+ ## shadcn 用到的一些 nodejs 工具
965
964
966
- ## commander
965
+ ### commander
967
966
968
967
注册 nodejs cli 命令以及 cli 参数,以及获取 cli 输入,执行操作等。
969
968
970
- ## prompts
969
+ ### prompts
971
970
972
971
cli 输入交互
973
972
974
- ## zod
973
+ ### zod
975
974
976
975
` zod ` 是一个用于 TypeScript 和 JavaScript 的数据验证库。它允许开发者定义一个模式(schema),这个模式描述了数据应该如何结构化,以及每个字段的类型是什么。可以在 node 和 web 环境下使用。
977
976
978
- ## cosmiconfig
977
+ ### cosmiconfig
979
978
980
979
查找或读取` json ` ,` yml ` 等配置文件
981
980
982
- ## tsconfig-paths
981
+ ### tsconfig-paths
983
982
984
983
解析` tsconfig.json ` 中定义的` paths ` 的模块路径。
985
984
986
- ## chalk
985
+ ### chalk
987
986
988
987
cli 打印颜色文字
989
988
990
- ## ora
989
+ ### ora
991
990
992
991
cli loading 交互效果
993
992
994
- ## node-fetch
993
+ ### node-fetch
995
994
996
995
nodejs 中使用 fetch
997
996
998
- ## tsx
997
+ ### tsx
999
998
1000
999
支持直接在 node 命令行中执行 typescript 文件。
0 commit comments