{"data":{"markdownRemark":{"frontmatter":{"title":"Steps to setup TailwindCSS with Create React App using POSTCSS","date":"January 2019"},"timeToRead":3,"html":"<p>Originally posted on <a href=\"https://medium.com/@ajitid/steps-to-setup-tailwind-with-react-using-postcss-66147b93f5f4\">Medium</a></p>\n<p>Other blog/Medium posts directly tell you to eject from create-react-app, but that’s not needed. Also they don’t discuss about production setup, that’s why I have written this post.</p>\n<p>TLDR: You can directly pull the <a href=\"https://github.com/ajitid/cra-postcss-tailwind\">setup from here</a>.</p>\n<ol>\n<li>\n<p>Make a React app using create-react-app</p>\n</li>\n<li>\n<p>Install Tailwind and PostCSS CLI with</p>\n</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i -D tailwindcss postcss-cli</code></pre></div>\n<ol start=\"3\">\n<li>\n<p>Make a Tailwind config using <code class=\"language-text\">npx tailwind init</code> or <code class=\"language-text\">./node_modules/.bin/tailwind init</code>. This command creates tailwind.js at root of your project. NPX comes installed alongwith NodeJS and NPM.</p>\n</li>\n<li>\n<p>Now create postcss.config.js file at root of your project and write the following</p>\n</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> tailwindcss <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'tailwindcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token function\">tailwindcss</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./tailwind.js'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol start=\"5\">\n<li>In src/ create tailwind-own.css and write this</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@tailwind</span> preflight<span class=\"token punctuation\">;</span></span>\n<span class=\"token atrule\"><span class=\"token rule\">@tailwind</span> components<span class=\"token punctuation\">;</span></span>\n<span class=\"token atrule\"><span class=\"token rule\">@tailwind</span> utilities<span class=\"token punctuation\">;</span></span></code></pre></div>\n<ol start=\"6\">\n<li>Import “./tailwind.css” (not “./tailwind-own.css”) in your index.js. As code with <code class=\"language-text\">@tailwind</code> in tailwind-own.css is not valid CSS, we will use POSTCSS to transform this tailwind-own.css to valid CSS in tailwind.css which will then be imported and used by React app.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token string\">'./tailwind.css'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ol start=\"7\">\n<li>Change your <code class=\"language-text\">scripts</code> of package.json to include command which runs POSTCSS in watch mode. In the code below, <code class=\"language-text\">start:tw</code> takes in src/tailwind-own.css and outputs src/tailwind.css which contains valid CSS, and as you have imported tailwind.css in your index.js, you will get all Tailwind utility classes. <code class=\"language-text\">-w</code> in <code class=\"language-text\">start:tw</code> enables watch mode, so it will watch for any changes in tailwind-own.css and will remake tailwind.css accordingly.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"start:tw\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"postcss ./src/tailwind-own.css -o ./src/tailwind.css -w\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"start\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-scripts start\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-scripts build\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-scripts test --env=jsdom\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"eject\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"react-scripts eject\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></code></pre></div>\n<ol start=\"8\">\n<li>Now run your app. You will need two different commands, one to start up POSTCSS in watch mode using <code class=\"language-text\">start:tw</code> and and other to run React app as usual.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run start:tw</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> start</code></pre></div>\n<ol start=\"9\">\n<li>Use any of Tailwind’s utility classes and it’ll work! 🎉</li>\n</ol>\n<h2>Setup for production</h2>\n<p>Try running <code class=\"language-text\">npm run build</code>. You’ll see 35KB+ of CSS being generated even if you have used two classes or so.</p>\n<p>We will use PurgeCSS to strip all unused CSS. Install it with</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i -D @fullhuman/postcss-purgecss</code></pre></div>\n<p>Now change your postcss.config.js which you had created to include code which removes unused CSS for production.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> tailwindcss <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'tailwindcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> purgecss <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@fullhuman/postcss-purgecss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token function\">tailwindcss</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./tailwind.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NODE_ENV</span><span class=\"token operator\">===</span><span class=\"token string\">\"production\"</span> <span class=\"token operator\">&amp;&amp;</span>  <span class=\"token function\">purgecss</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      content<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'./src/**/*.js'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      css<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'./src/**/*.css'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">content</code> denotes the places where you have used CSS classes.</p>\n<p>Also add this line in “scripts” of your package.json</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"build:tw\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"postcss ./src/tailwind-own.css -o ./src/tailwind.css --env production\"</span></code></pre></div>\n<p>Now to build it for production, we first need to run</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run build:tw</code></pre></div>\n<p>which creates stripped tailwind.css and then we will run</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run build</code></pre></div>\n<p>to get out our production files.</p>\n<p>Now look at CSS bundle size. It will be a few KBs or so. Nice.</p>\n<p>As said at starting of this post, if you don’t want to setup all this you can go to <a href=\"https://github.com/ajitid/cra-postcss-tailwind\">this repo</a> and download React app which has all this pre-configured.</p>"}},"pageContext":{"id":"2a3c3092-9bc1-5b32-8234-2a61831a2cf2"}}