基于React的腳手架搭建

目的

為了能夠在工作中更加快速的搭建起開發(fā)環(huán)境,所以在create-react-app的基礎(chǔ)之上結(jié)合自身公司業(yè)務(wù)和個人習(xí)慣渡处,搭建了個更加方便的腳手架。GitHub地址

技術(shù)棧

react  // mvm框架
typescipt // 開發(fā)語言
sass // 預(yù)編譯語言
anti-mobile // UI框架
axios // http請求
react-router-dom // 路由

目錄結(jié)構(gòu)

core // 存放一些工具代碼和一些服務(wù)
environments  // 存放環(huán)境配置文件
pages // app頁面存放文件
routing // 路由
components // 公共組件

搭建過程

1 配置typescript使用環(huán)境

首先我打算使用typescript作為開發(fā)語言署隘,首先我們是用create-react-app來作為基礎(chǔ)的腳手架工具喉脖,按照github上面的操作方法夸楣,進行如下操作:

npm install -g create-react-app
create-react-app my-app --scripts-version=react-scripts-ts
cd my-app/
npm start

這樣當我們就可以通過npm start啟動應(yīng)用了

配置scss 參考鏈接

npm install --save node-sass-chokidar

"scripts": {
+  "build-css": "node-sass-chokidar src/ -o src/",
+  "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/--watch --recursive",
   "start": "react-scripts-ts start",
   "build": "react-scripts-ts build",
   "test": "react-scripts-ts test --env=jsdom",

按照如上操作即可,然后再添加src/**/*.css.gitignore文件中宾抓。接下來我們希望項目能夠監(jiān)測scss的變化,從而自動去編譯scss文件豫喧,顯然我們要用到watch-cssbuild-css這兩個任務(wù)石洗,我們可以使用&&操作符,但是這種跨平臺性并不是很好紧显,所以我們采用npm-run-all這個工具讲衫。

npm install --save npm-run-all

然后進行如下修改

   "scripts": {
     "build-css": "node-sass-chokidar src/ -o src/",
     "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
-    "start": "react-scripts-ts start",
-    "build": "react-scripts-ts build",
+    "start-js": "react-scripts-ts start",
+    "start": "npm-run-all -p watch-css start-js",
+    "build-js": "react-scripts-ts build",
+    "build": "npm-run-all build-css build-js",
     "test": "react-scripts-ts test --env=jsdom",
     "eject": "react-scripts-ts eject"
   }

ok,以上我們就搭建好了scss環(huán)境

安裝anti-mobile

npm install antd-mobile --save
npm install react-app-rewired --save-dev
"scripts": {
    "build-css": "node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/",
    "watch-css": "npm run build-css && node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/ --watch --recursive",
+   "start-js": "react-app-rewired start --scripts-version react-scripts-ts",
    "start": "npm-run-all -p watch-css start-js",
+    "build-js": "react-app-rewired build --scripts-version react-scripts-ts",
    "build": "npm-run-all build-css build-js",
+    "test": "react-app-rewired test --env=jsdom",
    "eject": "react-scripts-ts eject"
  },

這里由于我們使用的是typescript,所以"start-js": "react-app-rewired start --scripts-version react-scripts-ts","build-js": "react-app-rewired build --scripts-version react-scripts-ts",后面要加上react-scripts-ts孵班。接下來我們實現(xiàn)按需加載參考鏈接

安裝npm install babel-plugin-import --save-dev

更改config-overrides.js文件

/* config-overrides.js */
const tsImportPluginFactory = require('ts-import-plugin')
const { getLoader } = require("react-app-rewired");

module.exports = function override(config, env) {
    const tsLoader = getLoader(
        config.module.rules,
        rule =>
            rule.loader &&
            typeof rule.loader === 'string' &&
            rule.loader.includes('ts-loader')
    );

    tsLoader.options = {
        getCustomTransformers: () => ({
            before: [ tsImportPluginFactory({
                libraryName: 'antd-mobile',
                libraryDirectory: 'es',
                style: 'css',
            }) ]
        })
    };

    return config;
};

這樣我們就可以直接引入import { Button } from 'antd-mobile';不需要在前面引入import 'antd-mobile/dist/antd-mobile.css';

當我們引入antd-mobile后可能會出現(xiàn)下列錯誤

E:/MyProjects/frame-work-cli/my-app/node_modules/antd-mobile/lib/picker/PropsType.d.ts
(7,15): Parameter 'values' implicitly has an 'any' type.

找到node_modules/antd-mobile/lib/picker/PropsType.d.ts把format?: (values) => void;改成 format?: (values: any) => void;即可當然為了直接省事涉兽,直接在tsconfig.json設(shè)置"noImplicitAny": false

4 開發(fā)環(huán)境切換配置

現(xiàn)在公司一般都會有開發(fā)環(huán)境篙程,預(yù)發(fā)布環(huán)境和正式環(huán)境枷畏,這些環(huán)境所對應(yīng)的后端地址并不一樣,所以我們要來進行一些配置方便切換虱饿。實現(xiàn)的思路就是讀取命令行參數(shù)拥诡,根據(jù)參數(shù)把不同環(huán)境的配置文件的內(nèi)容復(fù)制替換掉environment.js這個文件,這里我們用到了shelljscross-env(讀取命令行參數(shù))這兩個js庫氮发。
創(chuàng)建cp-environment.js

const shell = require('shelljs');

const env = process.env.NODE_ENV;
const src = `src/environments/environment.${env}.ts`;
const to = `src/environments/environment.ts`;

shell.cp('-R', src, to);

更改package.json

"scripts": {
    "build-css": "node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/",
    "watch-css": "npm run build-css && node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/ --watch --recursive",
    "start-js": "react-app-rewired start --scripts-version react-scripts-ts",
    "start": "cross-env NODE_ENV=pro npm-run-all cp-environment -p watch-css start-js",
    "startDev": "cross-env NODE_ENV=dev npm-run-all cp-environment -p watch-css start-js",
    "startLocal": "cross-env NODE_ENV=local npm-run-all cp-environment -p watch-css start-js",
    "build-js": "react-app-rewired build --scripts-version react-scripts-ts",
    "build": "cross-env NODE_ENV=pro npm-run-all cp-environment build-css build-js",
    "buildLocal": "cross-env NODE_ENV=Local npm-run-all cp-environment build-css build-js",
    "buildDev": "cross-env NODE_ENV=dev npm-run-all cp-environment build-css build-js",
    "test": "react-app-rewired test --env=jsdom",
    "eject": "react-scripts-ts eject",
    "cp-environment": "node cp-environment.js"
  }

當然我們開發(fā)環(huán)境上傳的代碼應(yīng)該是buildDev后的代碼渴肉,但是有可能有時進行了誤操作,把build后的代碼上傳上去爽冕,我們還可以寫一個檢測的腳本仇祭。
原理就是讀取當前分支名,根據(jù)分知名和當前的環(huán)境變量進行對比颈畸。

const branchEnvMap = {
  dev: 'dev',
  test: 'test',
  release: 'prod',
};

const shell = require('shelljs');
const branch = shell.exec('git rev-parse --symbolic-full-name --abbrev-ref HEAD', { silent: true }).toString().trim();
const env = process.argv.slice(2).toString().split('=')[1].toString();

if (branchEnvMap[branch] !== env) {
  shell.echo('該分支對應(yīng)的編譯任務(wù)不是這個前塔,請檢查執(zhí)行的命令!', branch, env);
  shell.exit(1);
}

Http

用到就是axios,至于怎么用直接看我的GitHub地址就行承冰,這里進行了一層封裝华弓,主要是對返回的結(jié)果進行統(tǒng)一的處理。

路由

我用到的是react-router-dom,至于用法還是推薦看github困乒,

1 E:/MyProjects/frame-work-cli/my-app/node_modules/@types/react-dom/node_modules/@types/react/index.d.ts
(3631,13): Subsequent property declarations must have the same type.
Property 'a' must be of type 'DetailedHTMLProps<AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>',
but here has type 'DetailedHTMLProps<AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>'.

當我們啟動應(yīng)用的時候可能會出現(xiàn)如上錯誤寂屏,這是由于我們安裝的@types/react@types/react-dom版本并不怎么一致,參考鏈接, 例如下面的版本

 "@types/react": "^15.6.7",
 "@types/react-dom": "^16.0.3",

所以我們可以換成

"@types/react": "^16.0.36", 
"@types/react-dom: "^16.0.3"

2 E:/MyProjects/frame-work-cli/my-app/node_modules/antd-mobile/lib/picker/PropsType.d.ts(7,15): Parameter 'values' implicitly has an 'any' type.

在tsconfig.json設(shè)置"noImplicitAny": false

3 error TS1192: Module '"react"' has no default export.

設(shè)置 tsconfig.json "allowSyntheticDefaultImports": true,

4 expected parameter: 'props' to have a typedef

在tslint.json設(shè)置typedef: false,這個屬于tslint相關(guān)配置的問題迁霎,具體可以看文檔

最后(歡迎大家關(guān)注我)

DJL簫氏個人博客
博客GitHub地址
簡書
掘金

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吱抚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子考廉,更是在濱河造成了極大的恐慌秘豹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昌粤,死亡現(xiàn)場離奇詭異既绕,居然都是意外死亡,警方通過查閱死者的電腦和手機涮坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門凄贩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袱讹,你說我怎么就攤上這事疲扎。” “怎么了捷雕?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵椒丧,是天一觀的道長。 經(jīng)常有香客問我救巷,道長壶熏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任征绸,我火速辦了婚禮久橙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘管怠。我一直安慰自己淆衷,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布渤弛。 她就那樣靜靜地躺著祝拯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪她肯。 梳的紋絲不亂的頭發(fā)上佳头,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音晴氨,去河邊找鬼康嘉。 笑死,一個胖子當著我的面吹牛籽前,可吹牛的內(nèi)容都是我干的亭珍。 我是一名探鬼主播敷钾,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肄梨!你這毒婦竟也來了阻荒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤众羡,失蹤者是張志新(化名)和其女友劉穎侨赡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱侣,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡羊壹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜害。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶掖。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡球昨,死狀恐怖尔店,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情主慰,我是刑警寧澤嚣州,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站共螺,受9級特大地震影響该肴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藐不,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一匀哄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雏蛮,春花似錦涎嚼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犀概,卻和暖如春立哑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姻灶。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工铛绰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人产喉。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓捂掰,卻偏偏與公主長得像若皱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尘颓,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容