Next.js Notes
Configuring eslint for Next.js projects
Install ESLint
npm i eslint babel-eslint --save-devor, with
Yarnyarn add eslint babel-eslint -DInstall ESLint plugin
npx install-peerdeps --dev eslint-config-airbnb- This installs peerdependencies bundled together, namely executing this command:
npm i -D eslint-config-airbnb eslint eslint-plugin-jsx-a11y eslint-plugin-import eslint-plugin-react eslint-plugin-react-hooksor, with
Yarnyarn add -D eslint-config-airbnb eslint eslint-plugin-jsx-a11y eslint-plugin-import eslint-plugin-react eslint-plugin-react-hooksInstall prettier plugin (optional, so that prettier doesn't mess up with linting)
npm i eslint-config-prettier eslint-plugin-prettier --save-devor, with
Yarnyarn add eslint-config-prettier eslint-plugin-prettier -DDev dependencies should now look similar to this:
{ "devDependencies": { "babel-eslint": "^10.1.0", "eslint": "^6.8.0", "eslint-config-airbnb": "^18.1.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-import": "^2.20.2", "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-prettier": "^3.1.3", "eslint-plugin-react": "^7.20.0", "eslint-plugin-react-hooks": "^2.5.1" } }Create a
.eslintrcfile with this configuration:{ "env": { "browser": true, "commonjs": true, "es6": true, "node": true }, "parser": "babel-eslint", "extends": [ "eslint:recommended", "airbnb", "airbnb/hooks", "plugin:react/recommended", "plugin:import/errors", "plugin:import/warnings", "plugin:jsx-a11y/recommended", // "plugin:react-hooks/recommended", // always put prettier at last // Delete if prettier plugin not installed in step 3 "prettier" ], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" }, "parserOptions": { "ecmaFeatures": { "jsx": true // enable linting for jsx files }, "ecmaVersion": 11, "sourceType": "module" }, "settings": { "react": { "version": "detect" } }, "plugins": ["react", "react-hooks"], "rules": { // NextJs specific fix: suppress errors for missing 'import React' in files for nextjs "react/react-in-jsx-scope": "off", // NextJs specific fix: allow jsx syntax in js files "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], //should add ".ts" if typescript project "react/display-name": 1 } }To disable linting of some files/folders, create a .eslintignore
# don't ever lint node_modules node_modules # don't lint build output (make sure it's set to your correct build folder name) dist # don't lint nyc coverage output coverageFinally, eventually add linting to scripts in package.json as a part of the build/deploy process
{ "scripts": { "lint": "eslint ./components/** ./pages/** -c .eslintrc.json --ext js,jsx", "lint-fix": "eslint ./components/** ./pages/** -c .eslintrc.json --fix --ext js,jsx", } }
This taken from This Stack Overflow Answer
The trick to use Next.js Link with react-bootstraps Nav.Link
Next.js has its Link component which helps to build dynamic links. React Bootstrap has ist Nav.Link component to build nice navigation links.
Combining both is not so straight forward. One of each would always complain about things like
“You are using a string directly in a Link!”There is a way to combine both:
const Header = props => {
return (
<Navbar>
<Link href="/my-page" passHref>
<Nav.Link>
My Page
</Nav.Link>
</Link>
</Navbar>
)
}Note the attribute
passrefthat gets passed onto the<Link>component. It makes unnecessary to passas='a' href='/my-page'to the child element! See this for more information.