Previously, we have integrated tailwind and react using webpack. Now we will try to apply it to shared components in monorepo.
.
├── package.json
└── web
├── components
│ ├── babel.config.js
│ ├── package.json
│ ├── postcss.config.js
│ ├── src
│ │ ├── Button.js
│ │ ├── Header.js
│ │ ├── index.css
│ │ ├── index.js
│ │ └── stories
│ ├── tailwind.config.js
│ └── webpack.config.js
└── modules
├── home
│ └── package.json
└── root
├── src
│ ├── App.js
│ └── index.js
└── package.json
clone our previous branch: https://github.com/ynwd/monorepo/tree/storybook
install postcss & tailwind packages
npm i postcss postcss-cli postcss-import postcss-loader tailwindcss autoprefixer autoprefixer cssnano mini-css-extract-plugin -D
Update webpack config
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const devMode = process.env.NODE_ENV !== "production"
module.exports = {
mode: devMode ? "development" : "production",
entry: {
index: { import: "./src/index.js" }
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: "babel-loader",
},
{
test: /\.css$/i,
use: [
devMode ? "style-loader" : MiniCssExtractPlugin.loader,
'css-loader',
"postcss-loader",
],
},
],
},
output: {
filename: "components.bundle.min.js",
library: 'fstrComponents',
libraryTarget: 'umd',
clean: true
},
plugins: [].concat(devMode ? [] : [new MiniCssExtractPlugin()]),
}
Create postcss config
module.exports = {
plugins: [
require('postcss-import'),
require('tailwindcss'),
require('autoprefixer'),
require('cssnano')({
preset: 'default',
}),
],
};
Create tailwind config
module.exports = {
purge: [
'./src/**/*.js',
],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {},
},
variants: {},
plugins: [],
}
Create tailwind entrypoint
/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
Create custom components
/* src/Button.js */
import React from "react"
export const Button = ({ text = "" }) => {
return (
<button className="p-2 pl-5 pr-5 bg-red-500 text-gray-100 text-lg rounded-lg focus:border-4 border-blue-300">
{text}
</button>
)
}
/* src/Header.js */
import React from "react"
export const Header = ({ text = "" }) => {
return (
<div className="bg-blue-300 mx-auto max-w-sm shadow-lg rounded-lg overflow-hidden">
<div className="sm:flex sm:items-center px-6 py-4">
<img className="block h-16 sm:h-24 rounded-full mx-auto mb-4 sm:mb-0 sm:mr-4 sm:ml-0" src="https://avatars.githubusercontent.com/u/10122431?s=400&v=4" alt="" />
<div className="text-center sm:text-left sm:flex-grow">
<div className="mb-4">
<p className="text-xl leading-tight">John Doe</p>
<p className="text-sm leading-tight text-grey-dark"> {text} </p>
</div>
</div>
</div>
</div>
)
}
Update react entry point. We import css file also.
/* src/index.js */
import { Button } from "./Button"
import { Header } from "./Header"
import "./index.css"
export {
Button,
Header
}
Update web/components/package.json
script
{
...
"scripts": {
"build": "NODE_ENV=production webpack",
"build-watch": "webpack --watch",
"test": "echo \"Error: no test specified\" && exit 1",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
},
...
}
Compile
npm run build
Go to app root dir.
cd ../../
And don't forget to link the built package.
npm install
Import react-tailwind components
Update root module entry point. Import generated css from components.
/* web/modules/root/src/index.js */
import React from 'react'
import ReactDOM from 'react-dom'
import "@fstr/components/dist/index.css"
import App from './App'
import reportWebVitals from './reportWebVitals'
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
)
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals()
Update react app
/* web/modules/root/src/App.js */
import { Header, Button } from "@fstr/components"
function App() {
return (
<div>
<Header text="from root" />
<Button text="my button" />
</div>
)
}
export default App
Still in the app root folder, run this to see the changes
npm start -w @fstr/root
You can see the final source code on this branch: https://github.com/ynwd/monorepo/tree/tailwind
Top comments (0)