TL;DR
Клонируйте этот репозиторий https://github.com/ReeganExE/react-hooks-boilerplate и приступайте к взлому.
npm install npm start
Проверьте это: http://localhost:8080
Функции
- Реагировать на крючки
- Горячий загрузчик React
- Webpack 4, Babel 7, ESLint Airbnb
- Нет скрытой магии
Начать с нуля
Инициировать проект
Создайте новый каталог, затем
npm init -y
Установить зависимости
npm install react@next react-dom@next react-hot-loader
Установить зависимости разработки
Вавилон
npm install @babel/core @babel/preset-env @babel/preset-react babel-loader --save-dev
Веб-пакет
npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
ESLint Airbnb
npx install-peerdeps --dev eslint-config-airbnb npm install babel-eslint --save-dev
Кросс-окружение
npm install cross-env --save-dev
Настраивать
Конфигурация Babel
{ "presets": [ "@babel/preset-env", "@babel/preset-react" ], "plugins": [ "react-hot-loader/babel" ] }
Конфигурация ESLint
{ "parser": "babel-eslint", "extends": ["airbnb"], "env": { "browser": true }, "rules": { "arrow-parens": "off", "comma-dangle": ["error", "never"], "no-confusing-arrow": "off", "no-unused-expressions": "off", "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], "react/jsx-one-expression-per-line": "off" }, "plugins": [ "react" ] }
webpack.config.js
const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { env } = process; const options = { mode: env.NODE_ENV, entry: './src/index.js', output: { filename: '[name].js' }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ] }, plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(env.NODE_ENV) }), new HtmlWebpackPlugin() ], devServer: { hot: true }, devtool: env.NODE_ENV === 'development' ? 'cheap-module-eval-source-map' : undefined }; module.exports = options;
NPM Скрипты
{ "scripts": { "start": "cross-env NODE_ENV=development webpack-dev-server --hot", "build": "cross-env NODE_ENV=production webpack", "lint": "eslint ./src" }, }
Создать src/index.js
import React from 'react'; import { render } from 'react-dom'; import App from './App'; render(<App />, document.body.appendChild(document.createElement('div')));
src/App.js
import React, { useState, useEffect } from 'react'; import { hot } from 'react-hot-loader/root'; const useGithub = userName => { const [user, setUser] = useState(); useEffect(() => { fetch(`https://api.github.com/users/${userName}`) .then(r => r.json()) .then(setUser); }, [userName]); return user; }; function App() { const user = useGithub('ReeganExE'); if (!user) { return <div>Loading...</div>; } return ( <div> Hello <b>{user.login}</b> <p>{user.bio}</p> </div> ); } export default hot(App);
Счастливый секс
— Нинь Фам —