Start by using the razzle starter kit
npx create-razzle-app my-app
.gitignore
package.json
razzle.config.js
public
src
| client.jsx (client.js)
| configure-store.js
| index.js
| logger.js
| server.js
| ui
| _document.jsx (app.js)
| routes.jsx
| components
| pages
| Home
| index.js
Nameing rules
- All react components are CamalCase and starts with Capitial
- All else are snake-case and all lower case
npx install-peerdeps --dev eslint-config-airbnb
Setup eslintrc
{
"extends": "airbnb",
"plugins": [
"jest",
"import"
],
"env": {
"jest/globals": true,
"browser": true,
"node": true
},
"rules": {
"arrow-body-style": "off",
"class-methods-use-this": "off",
"comma-dangle": ["error", "never"],
"global-require": "off",
"import/default": "warn",
"import/named": "error",
"import/prefer-default-export": "warn",
"react/jsx-props-no-spreading": "off",
"no-alert": "error",
"no-bitwise": "off",
"no-console": "error",
"no-underscore-dangle": "off",
"padded-blocks": "error",
"semi": ["error", "never"],
"quotes": ["error", "single"]
}
}
setup jest Add setup-jest folder in root (file mock-request-animation-frame.js)
global.requestAnimationFrame = function(callback) {
setTimeout(callback, 0)
}
const path = require('path')
module.exports = {
rootDir: './src',
collectCoverage: true,
coverageDirectory: '<rootDir>/../coverage',
coverageThreshold: {
global: {
branches: 0,
functions: 0,
lines: 0,
statements: 0
}
},
collectCoverageFrom: [
'**/*.{js,jsx}'
],
transform: {
'^.+\\.jsx?$': 'babel-jest'
},
setupFiles: [
path.resolve('setup-jest/mock-request-animation-frame.js')
],
coveragePathIgnorePatterns: [
'/node_modules/',
'/coverage/',
'logger.js'
],
testMatch: ['**/__tests__/**/*.js?(x)', '**/?(*.)(spec|test).js?(x)']
}
setup npm scripts
"lint:deps": "npx updated",
"lint:js": "npx eslint src",
"lint:ec": "npx editorconfig-checker -exclude '(node_modules|\\.git|build|public).*' .",
"lint": "npx npm-run-all -p lint:*",
"test": "npm run lint && npm run unit && npm audit --audit-level=moderate",
"unit": "jest",
Using styled-components and styled-system
npm i styled-components styled-system
With styled-components, need to do some magic to make it work well with SSR https://www.styled-components.com/docs/advanced#server-side-rendering
Need to also modify client.jsx hydrate method
() => {
// [ReHydratation](https://github.com/cssinjs/jss/blob/master/docs/ssr.md)
const jssStyles = document.getElementById('jss-ssr')
if (jssStyles && jssStyles.parentNode) {
jssStyles.parentNode.removeChild(jssStyles)
}
}