# Gastby with ESLint, Prettier, Stylelint, Emotion Styled Components, Tailwindcss
basic configs for a new Gatsby build
## Install Prettier & ESLint Dev Dependencies
`npm i -D babel-eslint babel-preset-gatsby eslint eslint-config-airbnb eslint-config-prettier eslint-config-wesbos eslint-plugin-html eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-prettier eslint-plugin-react eslint-plugin-react-hooks prettier`
## Install Tailwind, Emotion, Emotion Styled Components & Twin Macro Dependencies
### Breaking Changes in Emotion 11
Emotion 11 adds breaking changes to `gatsby-plugin-emotion`. Will need to update when fix is merged.
- [Gatsby issue](https://github.com/gatsbyjs/gatsby/pull/27981)
`npm i -S @emotion/core @emotion/styled gatsby-plugin-emotion postcss postcss-import postcss-preset-env tailwindcss twin.macro`
## NVM Config
Create `.nvmrc` in root
- default node
- example: `14.12.0`
## Prettier Configs
Create `.prettierrc` in root
```js
{
"semi": false,
"singleQuote": true,
"trailingComma": "es5"
}
```
Create `.prettierignore` in root
node_modules/
.cache/
## Babel Config
Create `.babelrc` in root
```json
{
"presets": [
[
"babel-preset-gatsby",
{
"targets": {
"browsers": ["> 1%", "last 2 versions", "Firefox ESR"]
}
}
]
]
}
```
## ENV Config (dotenv)
`npm i -S dotenv`
Create `.env` in root
- environment variables, secrets in this file
Config in `gatsby-config.js`
- add to top of file
```js
require('dotenv').config({
path: `.env.GATSBY_CONCURRENT_DOWNLOAD`,
})
// require .env.development or .env.production
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
```
## Create PostCSS Config
Create `postcss.config.js` in root
```js
module.exports = {
plugins: [
require('tailwindcss')('./tailwind.config.js'),
require('postcss-import')({
plugins: [require('stylelint-config-recommended')],
}),
require('postcss-preset-env')({
autoprefixer: { grid: false },
features: {
'nesting-rules': true,
},
browsers: ['> 1%', 'last 2 versions', 'Firefox ESR'],
}),
],
}
```
## Create Tailwind Config
Create `tailwind.config.js` in root
```js
module.exports = {
future: {
// removeDeprecatedGapUtilities: true,
// purgeLayersByDefault: true,
},
purge: [],
theme: {
extend: {
screens: {
sm: '640px',
// => @media (min-width: 640px) { ... }
md: '768px',
// => @media (min-width: 768px) { ... }
lg: '1024px',
// => @media (min-width: 1024px) { ... }
xl: '1280px',
// => @media (min-width: 1280px) { ... }
},
gridAutoColumns: {
'3fr': 'minmax(0, 3fr)',
},
},
},
variants: {},
plugins: [],
}
```
-------------------
# Optional Configs
## SVG in React Components
[Gatsby Plugin React SVG Docs](https://www.gatsbyjs.com/plugins/gatsby-plugin-react-svg/)
`npm i gatsby-plugin-react-svg`
Config in `gatsby-config.js`
```js
{
resolve: 'gatsby-plugin-react-svg',
options: {
rule: {
include: /\.inline\.svg$/
}
}
}
// Use imported SVGs as components
import Something from "./path/something.inline.svg";
;
```
## Install Google Fonts for Gatsby
`npm i gatsby-plugin-google-fonts`
Config in `gatsby-config.js`
```js
{
resolve: `gatsby-plugin-google-fonts`,
options: {
fonts: [
`kufam:wght@600;700;900`, // you can also specify font weights and styles
`poppins:wght@400;500;600`, // you can also specify font weights and styles
`montserrat:wght@400;500;600`, // you can also specify font weights and styles
],
display: 'swap',
},
}
```
## Sourcing Options
### Sourcing from WordPress
- [WordPress Gatsby Sourcing Docs](https://www.gatsbyjs.com/docs/sourcing-from-wordpress/)
- [gatsby-source-wordpress Docs](https://github.com/gatsbyjs/gatsby-source-wordpress-experimental)
- [WordPress Example Starter](https://github.com/TylerBarnes/using-gatsby-source-wordpress-experimental)
### Install Required WP Plugins
Download zip into WP plugins directory
- [WPGraphQL](https://github.com/wp-graphql/wp-graphql)
- [WP Gatsby](https://github.com/gatsbyjs/wp-gatsby)
### Setup Gatsby Config for WP sourcing
`npm i gatsby-source-wordpress-experimental`
Config in `gatsby-config.js`
```js
module.exports = {
...
plugins: [
{
resolve: `gatsby-source-wordpress-experimental`,
options: {
url:
// allows a fallback url if WPGRAPHQL_URL is not set in the env, this may be a local or remote WP instance.
process.env.WPGRAPHQL_URL || `https://localhost/graphql`,
schema: {
// Prefixes all WP Types with "Wp" so "Post and allPost" become "WpPost and allWpPost".
typePrefix: `Wp`,
},
verbose: true,
develop: {
// caches media files outside of Gatsby's default cache an thus allows them to persist through a cache reset.
hardCacheMediaFiles: true,
},
debug: {
graphql: {
writeQueriesToDisk: true,
},
},
type: {
Post: {
limit:
process.env.NODE_ENV === `development`
? // Lets just pull 50 posts in development to make it easy on ourselves (aka. faster).
50
: // and we don't actually need more than 5000 in production for this particular site
5000,
},
},
},
},
]
}
```
## Optional Stylelint for project
### Install Stylelint Recommended Config Dev Dependencies
`npm i -D stylelint-config-recommended`
### Create Stylelint Config
Create `stylelint.config.js` in root
```js
module.exports = {
rules: {
extends: ['stylelint-config-recommended'],
'at-rule-no-unknown': [
true,
{
ignoreAtRules: [
'tailwind',
'apply',
'variants',
'responsive',
'screen',
],
},
],
'declaration-block-trailing-semicolon': null,
'no-descending-specificity': null,
},
}
```