Use with ESBuild - Flowbite React
Learn how to install Flowbite React with ESBuild
This guide provides three ways to integrate Flowbite React with ESBuild:
- Quick Start: Create a new project with everything pre-configured
- Add to Existing Project: Add Flowbite React to an existing ESBuild project
- Manual Setup: Set up everything from scratch manually
Quick Start (Recommended)
#
Quick StartThe fastest way to get started is using our project creation CLI, which sets up a new ESBuild project with Flowbite React, Tailwind CSS, and all necessary configurations:
npx create-flowbite-react@latest -t esbuild
This will:
- Create a new ESBuild project
- Install and configure Tailwind CSS
- Set up Flowbite React with all required dependencies
- Configure dark mode support
- Set up example components
Add to Existing Project
#
Add to Existing ProjectIf you already have an ESBuild project and want to add Flowbite React, you can use our initialization CLI:
npx flowbite-react@latest init
This will automatically:
- Install Flowbite React and its dependencies
- Configure Tailwind CSS to include Flowbite React plugin
- Set up necessary configurations
Manual Setup
#
Manual SetupIf you prefer to set everything up manually or need more control over the configuration, follow these steps:
#
1. Create ProjectCreate a new directory and initialize a new project:
mkdir esbuild-react-app
cd esbuild-react-app
npm init -y
Create package.json
file:
{
"name": "esbuild-react-app",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "node esbuild.dev.js",
"build": "node esbuild.build.js"
}
}
Install the required dependencies:
npm install react react-dom
npm install -D @types/react @types/react-dom esbuild typescript tailwindcss @tailwindcss/postcss
Create tsconfig.json
:
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}
Create esbuild.dev.js
:
import { readFile } from "node:fs/promises";
import { createServer } from "node:http";
import tailwindcss from "@tailwindcss/postcss";
import * as esbuild from "esbuild";
import flowbiteReact from "flowbite-react/plugin/esbuild";
import postcss from "postcss";
const clients = new Set();
const cssPlugin = {
name: "css",
setup(build) {
build.onLoad({ filter: /\.css$/ }, async (args) => {
const css = await readFile(args.path, "utf8");
const result = await postcss([tailwindcss]).process(css, {
from: args.path,
map: { inline: true },
});
return {
contents: result.css,
loader: "css",
};
});
},
};
const buildOptions = {
entryPoints: ["src/main.tsx"],
bundle: true,
outdir: "dist",
sourcemap: true,
format: "esm",
loader: {
".tsx": "tsx",
".ts": "tsx",
".jsx": "jsx",
".js": "jsx",
},
plugins: [
cssPlugin,
flowbiteReact(),
{
name: "live-reload",
setup(build) {
build.onEnd(() => {
clients.forEach((client) => client.write("data: update\n\n"));
});
},
},
],
};
const ctx = await esbuild.context(buildOptions);
await ctx.watch();
// Initial build
await ctx.rebuild();
// Simple HTTP server
createServer(async (req, res) => {
const { url } = req;
if (url === "/esbuild") {
return clients.add(
res.writeHead(200, {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
Connection: "keep-alive",
}),
);
}
try {
let path = url === "/" ? "/index.html" : url;
const filePath = path.startsWith("/dist") ? path.slice(1) : `.${path}`;
const content = await readFile(filePath);
const ext = path.split(".").pop();
const contentTypes = {
html: "text/html",
js: "text/javascript",
css: "text/css",
png: "image/png",
jpg: "image/jpeg",
jpeg: "image/jpeg",
gif: "image/gif",
svg: "image/svg+xml",
};
res.writeHead(200, {
"Content-Type": contentTypes[ext] || "text/plain",
});
res.end(content);
} catch (e) {
res.writeHead(404);
res.end("Not found");
}
}).listen(3000);
console.log("Development server running on http://localhost:3000");
Create esbuild.build.js
:
import { readFile } from "node:fs/promises";
import tailwindcss from "@tailwindcss/postcss";
import * as esbuild from "esbuild";
import flowbiteReact from "flowbite-react/plugin/esbuild";
import postcss from "postcss";
const cssPlugin = {
name: "css",
setup(build) {
build.onLoad({ filter: /\.css$/ }, async (args) => {
const css = await readFile(args.path, "utf8");
const result = await postcss([tailwindcss]).process(css, {
from: args.path,
});
return {
contents: result.css,
loader: "css",
};
});
},
};
await esbuild.build({
entryPoints: ["src/main.tsx"],
bundle: true,
minify: true,
sourcemap: true,
outdir: "dist",
format: "esm",
loader: {
".tsx": "tsx",
".ts": "tsx",
".jsx": "jsx",
".js": "jsx",
},
plugins: [cssPlugin, flowbiteReact()],
});
Create index.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>esbuild React App</title>
<link rel="stylesheet" href="/dist/main.css" />
<script type="module" src="/dist/main.js"></script>
<script>
new EventSource("/esbuild").addEventListener("message", () => location.reload());
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Create src/main.tsx
:
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
import "./index.css";
const root = document.getElementById("root");
if (!root) throw new Error("Root element not found");
createRoot(root).render(
<StrictMode>
<App />
</StrictMode>,
);
Create src/App.tsx
:
export default function App() {
return (
<div className="flex min-h-screen items-center justify-center bg-gray-50">
<div className="w-full max-w-md rounded-lg bg-white p-8 shadow-lg">
<h1 className="mb-4 text-3xl font-bold text-gray-900">esbuild + React + Tailwind</h1>
<p className="text-gray-600">
Welcome to your new project! This template is set up with esbuild for blazing-fast builds, React for UI
components, and Tailwind CSS for styling.
</p>
</div>
</div>
);
}
Create src/index.css
:
@import "tailwindcss";
#
2. Install Flowbite ReactInstall Flowbite React:
npx flowbite-react@latest init
This will:
- Install Flowbite React and its dependencies
- Configure Tailwind CSS to include Flowbite React plugin
- Configure Vite to include Flowbite React plugin
#
Try it outNow that you have successfully installed Flowbite React you can start using the components from the library:
// src/App.tsx
import { Button } from "flowbite-react";
export default function App() {
return (
<>
<Button>Click me</Button>
</>
);
}