尝试使用 Vite + React + Tailwind CSS 创建一个 UI 库
这篇文章是2023年百事可乐圣诞倒数日历的第五天。
现在在参与的项目中,我们讨论了创建一个UI库,并尝试使用npm进行发布!
这篇文章将分享环境搭建的步骤。
本文中掲載的一部分代码已在GitHub仓库中公开。
请确定读者
-
- React * Vite * Tailwind CSSを使ったUIライブラリを実装したい方
- 自作のコンポーネントをパッケージで配信してみたい方
技术堆栈
本文中所使用的主要技术栈如下所列。
-
- React
-
- Vite
-
- TypeScript
- Tailwind CSS
1. 起初建立
使用以下命令,使用Vite的react-ts模板创建项目。
yarn create vite . --template react-ts
安装软件包
因为缺少 yarn.lock 文件而出现错误,所以正在创建一个空文件。
touch yarn.lock
yarn
2. 引入Tailwind CSS
因为我想要使用tailwind进行样式设置,所以需要安装该软件包。
yarn add -D tailwindcss postcss autoprefixer
使用以下命令向项目引入Tailwind.
yarn tailwindcss init -p
可以将生成的postcss.config.js的内容迁移到vite.config.ts中。
修改 tailwind.config.js。
您可以在这种情况下添加任何前缀,例如tw_,请根据需要进行设置。
由于有类型,可以进行补全、在编辑器中显示错误信息等等,所以我决定将其转换为.ts文件。
import type { Config } from "tailwindcss";
export default {
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
theme: {
extend: {},
},
plugins: [],
} satisfies Config;
在项目初始构建时,通过src/index.css生成的文件,加载tailwind的CSS。
请参考官方文件以获取更详细信息。
源代码/索引.css
@tailwind base;
@tailwind components;
@tailwind utilities;
3. 修复构建设置周边。
Vite 配置文件 vite.config.ts。
由于在2中删除了postcss.config.js文件,因此将其记述在这里。
css: {
postcss: {
plugins: [tailwindcss, autoprefixer]
}
}
以后还会添加建设周围的内容
build: {
lib: {
entry: resolve(__dirname, "src/index.ts"),
name: formattedName,
formats: ["es", "umd"],
fileName: (format) => `${formattedName}.${format}.js`,
},
}
最终,代码变为以下的样子。
/// <reference types="vitest">
import { resolve } from "path";
import react from "@vitejs/plugin-react";
import autoprefixer from "autoprefixer";
import tailwindcss from "tailwindcss";
import { defineConfig } from "vite";
import dts from "vite-plugin-dts";
import { name } from "./package.json";
const formattedName = name.match(/[^/]+$/)?.[0] ?? name;
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
react(),
dts({
insertTypesEntry: true,
}),
],
css: {
postcss: {
plugins: [tailwindcss, autoprefixer],
},
},
build: {
lib: {
entry: resolve(__dirname, "src/index.ts"),
name: formattedName,
formats: ["es", "umd"],
fileName: (format) => `${formattedName}.${format}.js`,
},
rollupOptions: {
external: ["react", "react/jsx-runtime", "react-dom", "tailwindcss"],
output: {
globals: {
react: "React",
"react/jsx-runtime": "react/jsx-runtime",
"react-dom": "ReactDOM",
tailwindcss: "tailwindcss",
},
},
},
},
});
如果在此时无法加载路径并出现错误,请使用以下命令添加类型信息来解决。
yarn add -D @types/node
tsconfig.json的中文释义是” TypeScript配置文件”。
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"allowSyntheticDefaultImports": true,
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"allowJs": false,
"esModuleInterop": false,
"moduleResolution": "Node"
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
tsconfig.node.json 的释义是什么?
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts", "package.json"]
}
7. 修改 package.json
将以下有关入口点设置的配置添加到package.json中。
"main": "./dist/yhi-component-lib.umd.js",
"module": "./dist/yhi-component-lib.es.js",
"types": "./dist/index.d.ts",
"license": "MIT",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/yhi-component-lib.es.js",
"require": "./dist/yhi-component-lib.umd.js"
},
"./dist/style.css": "./dist/style.css"
},
"files": [
"dist"
],
将脚本中添加构建命令
"scripts": {
// ...
// ↓追加
"build": "tsc && vite build",
// ...
},
增加组件
在src下创建一个组件
为了将组件汇总到一个目录中,我创建了components文件夹并将其下的组件整理到一起。
src/components/Button/Button.tsx 组件的中文释义
import { ButtonProps } from "./type";
export const Button = (props: ButtonProps) => {
return <button {...props} className="bg-blue-500 hover:bg-blue-600 px-5 py-2 rounded-lg text-sm text-white " />;
};
src/components/Button/type.ts的内容可以用以下方式来表达:
src/components/Button/type.ts文件
import { ComponentProps } from "react";
export type ButtonProps = Pick<ComponentProps<"button">, "children" | "onClick">;
src/components/Button/index.ts 的中文本地化的一种翻译选项如下:src/components/Button/index.ts 的中文本地化只需要一个选项。
export * from "./Button";
在src目录下,将使用CSS创建的组件导出。
src/index.ts的内容如下,请用中文进行原生重述。只需要一种选项:
– src/index.ts文件的内容如下。
– 下面是src/index.ts的内容。
import "./index.css";
export * from "./components";
8. 建设
请使用以下命令执行软件包的构建:
yarn build
如果在dist文件夹下生成了文件,那就算成功了。
9. 包裹发布
如果尚未完成登录npm,请输入验证信息。
yarn npm login
您可以使用以下命令将软件包发布到npm。
npm publish
10. 进行动作确认
可以按照以下方式使用创建的组件。
import { Button } from "yhi-component-lib"
export const SamplePage = () => {
return (
<div>
<Button>ボタンA</Button>
<Button>ボタンB</Button>
<Button>ボタンC</Button>
</div>
)
}
这次一定要记得在构建时引入CSS文件(我忘了,导致样式无法生效,浪费了一整天)。
我认为将下面输出的CSS导入语句放入包含在整个页面加载样式中会更好。
@import "yhi-component-lib/dist/style.css"
结束
实际上,除了这篇文章的内容之外,我们还在做以下类似的事情,如果能在某个地方写出这些内容就好了。
-
- Storybookの導入
-
- Vitestでテスト実行
-
- GitHub Actions上でnpmのパッケージ公開自動化
- Hygenを導入してコンポーネント作成をある程度自動化
明天早上由筋肉系设计师朝妻负责!请尽情期待!!!!
参考文章·典藏库
-
- https://miyauchi.dev/ja/posts/lib-vite-tailwindcss/
- https://github.com/IgnacioNMiranda/vite-component-library-template