create-react-app開發(fā)常用配置

注: 如未找到配置文件請(qǐng)使用npm run eject彈出配置文件
當(dāng)前對(duì)應(yīng)版本react 16.2

設(shè)置代理

在開發(fā)中往往是跨域請(qǐng)求的九杂,配置一下請(qǐng)求代理可以解決這個(gè)問題

// package.json 文件
"proxy": "http://xxx.xxx",

模塊熱替換(HMR)

默認(rèn)情況下在每次修改內(nèi)容的時(shí)候都會(huì)刷新頁面萧朝,有時(shí)候我們并不想要這樣肛炮,比如有一個(gè)bug需要重復(fù)點(diǎn)擊或者重復(fù)操作多次才能實(shí)現(xiàn),但是由于我們每次修改都會(huì)刷新頁面,可能會(huì)導(dǎo)致這個(gè)bug很難被測(cè)試或者實(shí)現(xiàn),這個(gè)配置在我看來非常有用,當(dāng)然這不是必須的啥供,但是可以適當(dāng)?shù)?strong>提高開發(fā)效率。在React 的入口文件 src/index.js中库糠,添加一些配置代碼伙狐。

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
  <App />,
  document.getElementById('root')
);
//  +++++ 加入+++++
if (module.hot) {
  module.hot.accept();
}

css局部化

  • 正常導(dǎo)入css情況下會(huì)污染到全局
  • 修改 webpack-config-dev.js 及 webpack-config-prod.js 配置
options: {
  modules: true,
  localIdentName: '__[local]--[hash:base64:5]'
}

注意: 使用 css-module會(huì)導(dǎo)致 ant 樣式失效...
其次有其他css局部化解決方案 比如 styled-components
可參考我另外一篇文章 騷里騷氣的styled-components快速入門

支持裝飾器寫法

比如redux或者mobx可以使用@寫法

插件中使用legacy是因?yàn)锽abel 5支持處理裝飾器,但是它也許會(huì)跟最終的標(biāo)準(zhǔn)有區(qū)別瞬欧,所以才使用legacy這個(gè)詞贷屎。


//  package.json

"babel": {
    "presets": [
      "react-app"
    ],
    "plugins": [
 // +++ 加入配置 +++
      "transform-decorators-legacy",
      // ...ant配置
    ]
  }

請(qǐng)注意, plugins 的屬性非常重要: transform-decorators-legacy 應(yīng)該放在最前面艘虎。 babel 設(shè)置有問題唉侄?請(qǐng)先查看這個(gè) issue

打包后路徑問題導(dǎo)致頁面空白

//  package.json 文件增加配置
...
"homepage": ".",
...

注: 如果直接打開index.html后文件正確加載但頁面仍然空白野建,請(qǐng)檢查你是否使用的是 BrowserRouter (同vue的history模式)需要后端配置支持属划,否則請(qǐng)使用HashRouter 即帶 #

配置簡(jiǎn)化路徑

當(dāng)頁面嵌套過深時(shí)我們會(huì)發(fā)現(xiàn)在路徑通常都要這么寫
import xx from './../../../xxx/qqq'
通過配置webpack可以寫成
import xx from '@/xxx/qqq'

// 修改 webpack.config.dev 與 webpack.config.prod 兩個(gè)文件 加入相同配置

...

// +++ 找個(gè)開心的地方加入配置
function resolve(dir) {
    return path.join(__dirname, '..', dir)
}

// 修改
alias: {
      'react-native': 'react-native-web',
        // +++ 加入配置
      '@': resolve('src')
}

  • 優(yōu)點(diǎn): 如果按照相對(duì)路徑的方法引用恬叹,每次要計(jì)算.. 并且文件一旦遷移 那么又要重新計(jì)算,如此配置文件遷移也不需要計(jì)算
  • 缺點(diǎn): 在部分編輯器可能會(huì)失去文件引用高亮(比如webstrom), 并且不能通過快捷鍵快速查找其引用.

: 這屬于webpack的配置同眯,當(dāng)然在vue-cli中也適用(更新:目前vue-cli已經(jīng)默認(rèn)支持這種配置)

按需引用antd-mobile(antd同)

  • 安裝 antd-mobile npm i antd-mobile -S
  • 安裝 babel-plugin-import npm i babel-plugin-import -D
 // package.json 文件
  "babel": {
    "presets": [
      "react-app"
    ],
    // 加入配置
    "plugins": [
    // 如果使用了 定制顏色功能 將 "css" => true 同時(shí)需要配置 less
      ["import", { "libraryName": "antd-mobile", "style": "css" }]
    ]
  }

打包構(gòu)建分析

build之后發(fā)現(xiàn)包體積比較大绽昼,用 webpack-bundle-analyzer 分析各個(gè)js文件的打包

// webpack.config.prod.js
const BundleAnalyzerPlugin = 
require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

// ...code

// 找到 plugins 記得別加錯(cuò)地方 很多 new xxx()的才是
plugins: [
    new xxx(),
    new xxx(),
    // +++++
    new BundleAnalyzerPlugin(),
] 

生產(chǎn)環(huán)境去掉map文件

有時(shí)候你會(huì)發(fā)現(xiàn)build時(shí)間過長(zhǎng),參見npm run build takes 1-2 hours to build 我們可以去除掉map文件構(gòu)建

// webpack.config.prod.js
- devtool: shouldUseSourceMap ? 'source-map' : false
// 改為
devtool: false,

配置less

  • 安裝 yarn add less-loader less --dev
//  webpack.config.dev.js
  module: {
    strictExportPresence: true,
    //...
    rules: [
        // ...
         {
            test: /\.(css|less)$/, // 修改
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {},
              },
              // 增加
              {
                loader: require.resolve('less-loader') // compiles Less to CSS
              }
            ],
          },
    ]
    
// webpack.config.prod.js

{
    test: /\.(css|less)$/, // 修改
                loader: ExtractTextPlugin.extract(
              Object.assign(
                {
                  fallback: {
                    loader: require.resolve('style-loader'),
                    options: {
                      hmr: false,
                    },
                  },
                  use: [
                  // ...code
                    {
                      loader: require.resolve('less-loader') // 增加
                    }
                  ],
                },
                extractTextPluginOptions
              )
            ),
    

}

配置不同環(huán)境變量

由于create-react-app 忽略了 env.NODE_ENV 環(huán)境變量的設(shè)置须蜗,參考文檔 但是有時(shí)候在一些項(xiàng)目中绪励,我們可能需要根據(jù)不同的環(huán)境變量使用不同的配置,那么我們可以這么做:

如果需要自定義環(huán)境變量 必須以REACT_APP_開頭

// 修改package.json
  "scripts": {
    "start": "cross-env REACT_APP_SECRET_API=development node scripts/start.js",
    "build": "node scripts/build.js",
    "test": "node scripts/test.js --env=jsdom"
// 這三個(gè)是我加的 可以根據(jù)你的業(yè)務(wù)需求來
    "build:dev": "cross-env REACT_APP_SECRET_API=development node scripts/build.js",
    "build:test": "cross-env REACT_APP_SECRET_API=test node scripts/build.js",
    "build:pro": "cross-env REACT_APP_SECRET_API=production node scripts/build.js",

  },

然后我們?cè)趫?zhí)行 npm run build:dev 的時(shí)候就可以拿到 REACT_APP_SECRET_API的值為development
前面加 cross-env是為了兼容不同平臺(tái) 需要自行安裝 npm install cross-env --save-dev

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唠粥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子停做,更是在濱河造成了極大的恐慌晤愧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉腌,死亡現(xiàn)場(chǎng)離奇詭異官份,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烙丛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舅巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人河咽,你說我怎么就攤上這事钠右。” “怎么了忘蟹?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵飒房,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我媚值,道長(zhǎng)狠毯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任褥芒,我火速辦了婚禮嚼松,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锰扶。我一直安慰自己献酗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布坷牛。 她就那樣靜靜地躺著凌摄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓帅。 梳的紋絲不亂的頭發(fā)上锨亏,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天痴怨,我揣著相機(jī)與錄音,去河邊找鬼器予。 笑死浪藻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乾翔。 我是一名探鬼主播爱葵,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼反浓!你這毒婦竟也來了萌丈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤雷则,失蹤者是張志新(化名)和其女友劉穎辆雾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體月劈,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡度迂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猜揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭墓。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖而姐,靈堂內(nèi)的尸體忽然破棺而出腊凶,到底是詐尸還是另有隱情,我是刑警寧澤拴念,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布吭狡,位于F島的核電站,受9級(jí)特大地震影響丈莺,放射性物質(zhì)發(fā)生泄漏划煮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一缔俄、第九天 我趴在偏房一處隱蔽的房頂上張望弛秋。 院中可真熱鬧,春花似錦俐载、人聲如沸蟹略。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖炬。三九已至,卻和暖如春状婶,著一層夾襖步出監(jiān)牢的瞬間意敛,已是汗流浹背馅巷。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留草姻,地道東北人钓猬。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撩独,于是被迫代替她去往敵國(guó)和親敞曹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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