1. 程式人生 > 實用技巧 >creact-react-app+antd+scss+less+redux+route+eject後搭建配置

creact-react-app+antd+scss+less+redux+route+eject後搭建配置

creact-react-app+antd+scss+less+redux+route+eject後搭建配置

1.專案版本及時間:

當前時間2020-09-09,所有版本均為當前最新版

2.專案介紹:

依賴creact-react-app開發配置,安裝完成後eject自定義專案配置內容,增加專案需求的擴充套件功能:

3.相關網站:

  1. creact-react-app :https://www.html.cn/create-react-app/docs/getting-started
  2. ant d : https://ant.design/docs/react/getting-started-cn

4.搭建階段一:

全域性安裝:npminstall-gcreate-react-app

進入專案目錄:create-react-appreact-20200909 (大寫報錯)

完成後:cdreact-20200909

釋放配置:npm run eject

回覆:y

目錄結構:(剛執行完的目錄,後期可自己更改)

執行下試試:npm run start

打包試試:npm run build 會多出一個build資料夾

接下來開始我們的改造了。

5.搭建階段二:

  • 縱觀文件結構發現有個很多特殊檔案:

src/serviceWorker.js :

這個檔案可以使用也可以不使用,使用它可以使你的react專案變成一個PWA(Progressive Web Application), 也就是說,在線上,只要訪問過一次你的網站,下一次即使沒有網路,這個應用依然可以被訪問。當然,它的好處不僅這麼一點點,在移動端開啟專案時,如果你用的是chrome或者firefox這樣的高階瀏覽器,瀏覽器會給你的頁面不太一樣的顯示,你的網頁看起來會更像原生App,實際上體驗也更爽。

public/manifest.json :

在專案的public目錄下,存在一個manifest.json檔案,你可以在這裡對你的網頁做一些配置,當用戶訪問網頁,生成一個網頁的桌面快捷方式時,會以這個檔案中的內容作為圖示和文字的顯示內容。配置好manifest.json, 使用serviceWorker.js,使用者完全可以把你的網頁快捷方式放到桌面上,因為你的網頁此時支援離線訪問,所以用起來和原生app的體驗很接近。

src/App.test.js和src/setupTests.js

是依賴jest 單元測試的程式碼,根據專案可刪可不刪,這裡就不做操作了。

robots.txt

爬蟲檔案,可刪可不刪

  • 因為有點強迫症,無論打包之前還是打包之後,專案結構不好看使人不爽,所以從目錄開始修改:

刪除 src目錄下檔案:App.css , App.js , index.css , logo.svg

此時肯定會報錯,不慌在src目錄下建立以下資料夾:api (介面 ip目錄) components (外掛目錄) assets(圖片字型等) pages(頁面) redux(redux 狀態) routes(路由) test(測試) theme(主題顏色) utils(工具)

打包的時候,看到build檔案下有很多檔案,為了看著簡潔,在public下新建個 src 目錄

刪除public檔案下的.png 檔案,並將.json檔案和.ico.txt 放到public/src內。

將src目錄下的 App.test.jssetupTests.js 檔案放到src/test檔案內。如圖:

  • 接下來更改配置檔案內容:

index.html:(直接上程式碼,對比源文件,差別不大)

<!DOCTYPE html>
<html lang="zh">
<head>
    <title>react-20200909</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <meta name="description" content="react-20200909"/>
    <link rel="icon" href="%PUBLIC_URL%/src/favicon.ico"/>
    <link rel="manifest" href="%PUBLIC_URL%/src/manifest.json"/>
</head>
<body>
<div id="react-20200909"></div>
</body>
</html>

webpack.config.js:

搜尋 ManifestPluginfileName 加入src/

搜尋 WorkboxWebpackPlugin.GenerateSW 在下面新增 swDest: 'src/service-worker.js',skipWaiting: true, precacheManifestFilename: 'src/precache-manifest.[manifestHash].js',

這裡要注意下:因為這個外掛原因,目前該版本是4.3.1,現在最新版本是6.0,所以後期可能引數有略微變化,所以報錯時候檢視網站:https://developers.google.com/web/tools/workbox/reference-docs/latest/module-workbox-webpack-plugin.InjectManifest#InjectManifest

開啟檔案 manifest.json 刪除以下檔案,這個檔案是app端時候會用到:

該刪的以及路徑已經處理完,我們進行下一步驟。

6.搭建階段3:

專案執行前執行安裝依賴模組:

npm i react-redux

npm i history

npm i react-router-dom

npm i redux

npm i lodash

新增redux:

我這裡用到的redux來自網路上的一個框架fengui npm當然我只是應用其中的部分功能,在redux 目錄下新建 store.js actions.js 同級目錄新建reducers目錄下新建vars.js 程式碼如下:

store.js

//store.js
import {createStore, combineReducers} from 'redux';
import vars from './reducers/vars';

const mainReducer = combineReducers({
  vars,
});

const store = createStore(mainReducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());

const {dispatch, getState, subscribe} = store;

export {
  store as default,
  dispatch,
  getState,
  subscribe
};

actions.js

//actions.js
export const SET_VARS = 'SET_VARS';

function setVars (key, value) {
    return {
        type: SET_VARS,
        key,
        value
    }
}

let actions = {
    setVars,
};

export {
    actions as default,
    setVars,
};

vars.js

//vars.js
import _ from 'lodash';
const actions = require('../actions')

export default function (state = {}, action = {}) {
    if (action.type === actions.SET_VARS) {
        return _.assign({}, state, _.fromPairs([[action.key, action.value]]))
    }
    return state
}

新增路由:

routes目錄下新建routeMap.jsx pages目錄下新建 login.jsxmain.jsx404.jsx

routeMap.jsx


//routeMap.jsx

import React from 'react'
import { BrowserRouter as Router, Route, Switch, Redirect} from 'react-router-dom'
import { createBrowserHistory } from 'history'
import Login from '@/pages/login';//普通載入模組
import Main from '@/pages/main';
import NotFound404 from '@/pages/NotFound404';

const history = createBrowserHistory();

class RouteMap extends React.Component {
render () {
return (
<Router history={history}>
<Switch>
<Route path="/" exact component={Login}/>
<Route path="/login" component={Login}/>
<Route path="/main" component={Main}/>
<Route path="/404" component={NotFound404}/>
<Redirect from="/*" to="/404"/>
</Switch>
</Router>
)
}
}

export default RouteMap

//_this.props.history.push('/main')//跳轉可後退
//_this.props.history.replace('/main')//跳轉不可後退
// <Redirect from="/*" to="/" /> //重定向
// <Route path="*" component={NotFound404}/>//預設


login.jsx ,main.jsx和404.jsx, (基本一樣

import React from 'react'

class Login extends React.Component {
  render () {
    return (
      <div>
      login或者404或者main
      </div>
    )
  }
}

export default Login

修改入口檔案 src/index.js

//index.js
//下面這倆是為了能支援ie11,在打包後能使用
//import 'react-app-polyfill/ie11';
//import 'react-app-polyfill/stable';

import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux'
import store from './redux/store';
import RouteMap from './routes/routeMap';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <Provider store={store}>
    <RouteMap />
  </Provider>,
  document.getElementById('react-20200909') //要和html對應上!!!!
);

serviceWorker.unregister();

7.搭建階段4:

完成上述,執行中報這個錯,一看原來自己用了 @,那麼新增上配置就行重啟:

webpack.config.js:搜尋alias 新增 '@': paths.appSrc,

為了提高程式碼質量,我們使用eslint,配置在 package.json內

搜尋 :eslintConfig新增:重啟

"eslintConfig": {
    "root": true,
    "settings": {
      "import/resolver": {
        "alias": {
          "map": [
            [
              "@",
              "../src"
            ]
          ],
          "extensions": [
            ".js",
            ".jsx",
            ".json"
          ]
        }
      }
    },
    "env": {
      "node": true
    },
    "extends": "react-app",
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {
      "no-console": "off",
      "space-before-function-paren": [
        "error",
        "always"
      ],
      "no-trailing-spaces": [
        "error",
        {
          "skipBlankLines": true,
          "ignoreComments": true
        }
      ],
      "no-multiple-empty-lines": [
        "error",
        {
          "max": 2,
          "maxEOF": 0
        }
      ],
      "indent": [
        "error",
        2,
        {
          "VariableDeclarator": {
            "var": 2,
            "let": 2,
            "const": 3
          },
          "SwitchCase": 2,
          "MemberExpression": 1,
          "FunctionExpression": {
            "parameters": "first"
          },
          "CallExpression": {
            "arguments": "first"
          },
          "ArrayExpression": "first",
          "ObjectExpression": "first",
          "ImportDeclaration": "first",
          "flatTernaryExpressions": true,
          "ignoreComments": true
        }
      ],
      "max-len": [
        "error",
        {
          "code": 300
        }
      ]
    }
  },

具體規則,可以自己配置,這裡只是依據個人愛好隨便加的。注意:新增規則後,規則不通過將在瀏覽器上顯示相關提示警告,請區分錯誤型別!!!!!!!!!!

新增ant d 以及使用 less

npm install antd --save

npm i less-loader

npm i babel-plugin-import

npm i less

npm install node-sass

webpack.config.js:搜尋sassRegex會發現有兩處,新增less配置 新增如下:

仔細看就是把上面scss程式碼複製下來的,稍微改下程式碼就可以,所以我這裡就不貼出來的。

搜尋 babel-plugin-named-asset-import 在下面新增 [ 'import', { libraryName: 'antd', libraryDirectory: 'es', style: true } ],

src/theme 下新建 AllThemeAnt.js新增程式碼:

// 此檔案是 ant基礎樣式檔案,在打包中已經新增,不能實時修改主題顏色,故需要專案啟動前想好主題顏色
// 以下是一些最常用的通用變數,所有樣式變數地址:https://github.com/ant-design/ant-design/blob/master/components/style/themes/default.less

// 暗黑模式
// const { getThemeVariables } = require('antd/dist/theme');
// module.exports =getThemeVariables({
//   dark: true, // 開啟暗黑模式
//   compact: true, // 開啟緊湊模式
// })

// 基礎常用樣式配置
module.exports ={
  '@primary-color': '#1890ff',// 全域性主色
  '@link-color': '#1890ff', // 連結色
  '@success-color': '#52c41a', // 成功色
  '@warning-color': '#faad14', // 警告色
  '@error-color': '#f5222d',// 錯誤色
  '@heading-color': 'rgba(0, 0, 0, 0.85)',// 標題色
  '@text-color': 'rgba(0, 0, 0, 0.65)', // 主文字色
  '@text-color-secondary': 'rgba(0, 0, 0, 0.45)', // 次文字色
  '@disabled-color': 'rgba(0, 0, 0, 0.25)', // 失效色
  '@border-color-base': '#d9d9d9', // 邊框色
  '@border-radius-base': '4px', // 元件/浮層圓角
  '@font-size-base': '14px', // 主字號
  '@box-shadow-base': '0 2px 8px rgba(0, 0, 0, 0.15)', // 浮層陰影
};

config/paths.js 裡面新增allThemeAntSrc:resolveApp('src/theme/AllThemeAnt.js'),

webpack.config.js:

新增const AllThemeAntSrc = require( paths.allThemeAntSrc );

搜尋getStyleLoaders在第一個下面找到 if (preProcessor) { -------- 修改:

if (preProcessor) {
      let loader = {
        loader: require.resolve( preProcessor ),
        options: {
          sourceMap: true,
        },
      };
      if ( preProcessor === "less-loader" ) {
        loader = {
          loader: require.resolve( preProcessor ),
          options: {
            lessOptions: {
              javascriptEnabled:true,
              modifyVars:AllThemeAntSrc,
            },
            sourceMap: true,
          },
        };
      }
      loaders.push(
        {
          loader: require.resolve('resolve-url-loader'),
          options: {
            sourceMap: isEnvProduction && shouldUseSourceMap,
          },
        },
        loader
      );
    }

此時,ant主題已經修改完 less 也已經新增上,重啟就有效果了。

頁面的基本搭建完成,下一篇我將詳細介紹優化內容,以及對出現的bug處理方法。喜歡點個關注吧