目录

我是如何在electron里安装shadcn-ui框架的

我是如何在electron里安装shadcn ui框架的

https://i-operation.csdnimg.cn/images/cf31225e169b4512917b2e77694eb0a2.pngElectron集成ShadCN UI指南

0. 记录发帖

xxxxxxxxxx —— 2025年9月17日 8:46

1. 安装

shadcn网站:

我的electron项目基于@quick-start/electron@latest生成,因此以下内容也基于这个项目。
https://i-blog.csdnimg.cn/direct/9c4e37d80f414faaa949c79f33f73f23.png

首先来到shadcn的安装教程: ,点击Manual
https://i-blog.csdnimg.cn/direct/f9c1c6ff868044369ec3b8304219db88.png

遵照它的步骤,先安装Tailwind

https://i-blog.csdnimg.cn/direct/fa3a57d300e74e37a93701dadf7316e3.png

cd my-project(你的electron项目根目录)
npm install tailwindcss @tailwindcss/vite

首先安装好 tailwindcss npm包,接着我们来到 electron 项目根目录,找到electron.vite.config.ts (tailwindcss 官网里面说的是 vite.config.ts,但在我们 electron 项目这指的就是electron.vite.config.ts,所以不用担心)
https://i-blog.csdnimg.cn/direct/6d1a271e44d14700887550f5b8130342.png

我们改成以下内容:

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite' //

export default defineConfig({
  main: {
    plugins: [externalizeDepsPlugin()]
  },
  preload: {
    plugins: [externalizeDepsPlugin()]
  },
  renderer: {
    resolve: {
      alias: {
        '@renderer': resolve('src/renderer/src')
      }
    },
    plugins: [react(), tailwindcss()]
  }
})

ok了,到这里,tailwindcss 部分就完成了,我们继续回到shadcn的安装教程里
https://i-blog.csdnimg.cn/direct/4cb3ab3822de405f8d1c1e2028c4eaea.png
下一步我们安装shadcn依赖:

npm install class-variance-authority clsx tailwind-merge lucide-react tw-animate-css

https://i-blog.csdnimg.cn/direct/9fd5052c2d3c4d908eef5ec5434a199d.png
现在我们去配置一下 tsconfig.json 。在我们 electron 项目里,实际要配置
tsconfig.json
tsconfig.web.json
electron.vite.config.ts 这三份文件:
https://i-blog.csdnimg.cn/direct/543362da2d6243769c6afda9a09fb32f.png
首先是 tsconfig.json 文件:

{
  "files": [],
  "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/renderer/src/*"]
    }
  }
}

注意了,虽然shadcn官网的教程指的是 ./*,但我们这里是./src/renderer/src/*。为什么呢?因为我们是 electron,我们的实际前端页面也就在/src/renderer/src/下面,所以必须要这样改。

接下来是 tsconfig.web.json 文件

{
  "extends": "@electron-toolkit/tsconfig/tsconfig.web.json",
  "include": [
    "src/renderer/src/env.d.ts",
    "src/renderer/src/**/*",
    "src/renderer/src/**/*.tsx",
    "src/preload/*.d.ts"
  ],
  "compilerOptions": {
    "composite": true,
    "jsx": "react-jsx",
    "baseUrl": ".",
    "paths": {
      "@renderer/*": [
        "src/renderer/src/*"
      ],
      "@/*": ["./src/renderer/src/*"]
    }
  }
}

最后是 electron.vite.config.ts 文件:

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  main: {
    plugins: [externalizeDepsPlugin()]
  },
  preload: {
    plugins: [externalizeDepsPlugin()]
  },
  renderer: {
    resolve: {
      alias: {
        '@renderer': resolve('src/renderer/src'),
        "@": resolve(__dirname, "./src/renderer/src")
      }
    },
    plugins: [react(), tailwindcss()]
  }
})

ok,现在我们继续下一个步骤
https://i-blog.csdnimg.cn/direct/497fd917525f48d5859d7e8ad60c137a.png
虽然步骤上的style文件是src/styles/globals.css,但实际上我们可以自己灵活点改,下面是原先创建 electron 项目的时候自动生成的模板
https://i-blog.csdnimg.cn/direct/ce115a9fa5e945648eeeaa9dc3d484be.png
我们直接删除所有模板代码(此时运行 npm run dev 就会是一片空白)
https://i-blog.csdnimg.cn/direct/237da6c4342741b1a6c5265bdc23b405.png
https://i-blog.csdnimg.cn/direct/79d7e68923d74d89891acd7e8b6d81bf.png

现在我们继续,把 shadcn的global.css 里的代码复制到 assets 目录的 main.css 里:
https://i-blog.csdnimg.cn/direct/3e4168086ec64fe9a9f931a66dc40314.png
https://i-blog.csdnimg.cn/direct/e17d923eda184a17b40070e3b5737196.png
下一步我们添加一个helper文件:
https://i-blog.csdnimg.cn/direct/6df16bc30b504bedb09106304d69ef0a.png
https://i-blog.csdnimg.cn/direct/d8fdf23b14aa4c89838fd0882b1cec90.png
下一步我们创建 components.json 文件(“components” 名字不能改)
https://i-blog.csdnimg.cn/direct/f58184c288a44e70a33dd45e29f664ce.png
这个文件我们在 electron 根目录下创建
https://i-blog.csdnimg.cn/direct/12349410a3684784be9cdc0dcbc3df37.png

{
  "$schema": "https://ui.shadcn.com/schema.json",
  "style": "new-york",
  "rsc": false,
  "tsx": true,
  "tailwind": {
    "config": "",
    "css": "src/renderer/src/assets/main.css",
    "baseColor": "neutral",
    "cssVariables": true,
    "prefix": ""
  },
  "aliases": {
    "components": "@/components",
    "utils": "@/lib/utils",
    "ui": "@/components/ui",
    "lib": "@/lib",
    "hooks": "@/hooks"
  },
  "iconLibrary": "lucide"
}

注意,我修改了 tailwind->css 的内容,因为我们刚刚写的css代码的文件名是 assets/main.css ,而教程里指的是 styles/globals.css

OK,此时,我们就已经成功安装好shadcn了

2. 试试安装一个shadcn组件

此时运行 npm run dev,发现程序里什么都是空白的
https://i-blog.csdnimg.cn/direct/3f24376cd3764bdea620ead8f071a7b0.png
现在我们随便添加一个shadcn组件来测试下,添加过程是这样的

我们来到shadcn的组件库去,找到你自己需要的组件。我这里举个例子,用Dialog
https://i-blog.csdnimg.cn/direct/5acd0f0dcce94d709d51851b44a6cbaa.png
https://i-blog.csdnimg.cn/direct/388593add8c941bb98ad172fd86e1873.png
https://i-blog.csdnimg.cn/direct/df5d9229182549f0972b5a7dd4f452ec.png
下面有一个组件安装命令,我们就是通过这个命令来安装组件的

npx shadcn@latest add dialog

https://i-blog.csdnimg.cn/direct/c47bb5830e5c47f2bd6c16e9871c1488.png

可以看到,当我们用命令安装好组件之后,src目录下瞬间多出了个components目录,里面还有我们所创建的dialog组件的tsx文件

https://i-blog.csdnimg.cn/direct/6bc2624382994455932e8ce2d3f3d844.png
我们复制样例代码到App.tsx中,看看效果怎么样
(这个样例代码还用到了button input label,我们同理一个个用命令行安装即可)
https://i-blog.csdnimg.cn/direct/0d9f2110b108460f9028b6c053a905ba.png

import { Button } from "@/components/ui/button"
import {
  Dialog,
  DialogClose,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"

export function DialogDemo() {
  return (
    <Dialog>
      <form>
        <DialogTrigger asChild>
          <Button variant="outline">Open Dialog</Button>
        </DialogTrigger>
        <DialogContent className="sm:max-w-[425px]">
          <DialogHeader>
            <DialogTitle>Edit profile</DialogTitle>
            <DialogDescription>
              Make changes to your profile here. Click save when you&apos;re
              done.
            </DialogDescription>
          </DialogHeader>
          <div className="grid gap-4">
            <div className="grid gap-3">
              <Label htmlFor="name-1">Name</Label>
              <Input id="name-1" name="name" defaultValue="Pedro Duarte" />
            </div>
            <div className="grid gap-3">
              <Label htmlFor="username-1">Username</Label>
              <Input id="username-1" name="username" defaultValue="@peduarte" />
            </div>
          </div>
          <DialogFooter>
            <DialogClose asChild>
              <Button variant="outline">Cancel</Button>
            </DialogClose>
            <Button type="submit">Save changes</Button>
          </DialogFooter>
        </DialogContent>
      </form>
    </Dialog>
  )
}


function App(): React.JSX.Element {

  return (
    <>
      <DialogDemo></DialogDemo>
    </>
  )
}

export default App

https://i-blog.csdnimg.cn/direct/2e0ab9f6c02f44b7a8ee005e84c175b1.png
https://i-blog.csdnimg.cn/direct/6622c2d00f27440687e53d9e008ce226.png
测试成功,这就是shadcn!