React官方腳手架工具Create-react-app 用於快速建立React應用,但依舊有侷限性,咱們根據項目需求須要對Create-react-app的配置進行修改。這裏針對引入Antd的兩種配置方式進行配置。css
一. React-app-rewired(一個對 create-react-app 進行自定義配置的社區解決方案)。
1.安裝react-app-rewiredhtml
npm install --save-dev react-app-rewired
2.修改package.json啓動項react
/* package.json */ "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test --env=jsdom", }
3.在項目根目錄建立一個 config-overrides.js 用於修改默認配置。webpack
module.exports = function override(config, env) { // do stuff with the webpack config... return config; };
4.使用babel-plugin-import實現Antd按需加載,修改config-overrides.jsgit
npm install --save-dev babel-plugin-import
/* config-overrides.js */ const { injectBabelPlugin } = require('react-app-rewired'); module.exports = function override(config, env) { config = injectBabelPlugin(['import', { libraryName: 'antd', style: 'css'}], config); return config; };
5.使用react-app-rewire-less配置Lessgithub
npm install --save-dev react-app-rewire-less
/* config-overrides.js */ const { injectBabelPlugin } = require('react-app-rewired'); const rewireLess = require('react-app-rewire-less'); module.exports = function override(config, env) { config = injectBabelPlugin(['import', { libraryName: 'antd', style: true }], config); config = rewireLess.withLoaderOptions({ modifyVars: { "@primary-color": "#1DA57A" }, })(config, env); return config; };
我遇到的問題:
1._DEV_ is not defined.web
npm install --save-dev react-app-rewire-defind-plugin
/* config-overrides.js */ const { injectBabelPlugin } = require('react-app-rewired'); const rewireLess = require('react-app-rewire-less'); const rewireDefinePlugin = require('react-app-rewire-define-plugin'); module.exports = function override(config, env) { config = injectBabelPlugin(['import', { libraryName: 'antd', style: true }], config); config = rewireLess.withLoaderOptions({ modifyVars: { "@primary-color": "#1DA57A" }, })(config, env); config = rewireDefinePlugin(config, env, { __DEV__: false }); return config; };
2.Cannot read property 'exclude' of undefined
參考 https://github.com/timarney/react-app-rewired/issues/145
解決方案 https://github.com/dawnmist/react-app-rewired/commit/25208ab81791edb4356dc959188bcd4c4471ad87npm
二. npm run eject 暴露全部內建的配置
1.使用babel-plugin-import實現Antd按需加載,修改package.json,或者在項目根目錄新建文件.babelrc寫配置,注意是二選一。json
npm install --save-dev babel-plugin-import
1)package.jsonbabel
"babel": { "presets": [ "react-app" ], "plugins": [ [ "import", { "libraryName": "antd", "style": true } ] ] },
2).babelrc
{ "presets": [ "react-app" ], "plugins": [ [ "import", { "libraryName": "antd", "style": true } ] ] }
注意: 不要認爲package.json裏已有presets配置這裏就不用寫,這裏的.babelrc會覆蓋package.json裏帶有的babel配置,若是刪除presets配置,會報錯。
2.引入Less
1)安裝less-loader 和 less
npm install --save-dev less-loader less
2)修改config文件夾下的webpack.config.dev.js和webpack.config.prod.js文件(都須要修改)
查找 :exclude
本來的 exclude: [/\.js$/, /\.html$/, /\.json$/],
修改成 exclude: [/\.html$/, /\.(js|jsx)$/, /\.(css|less)$/, /\.json$/, /\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
查找:test
本來的 test: /\.css$/,
修改成 test: /\.(css|less)$/,
在這個test的下面找到use,添加loader
use: [ {...}, {...}, { loader: require.resolve('less-loader') // compiles Less to CSS } ],
ok,以上兩種方式修改配置,按需選擇。
我比較鐘意第二種方法,畢竟暴露了webpack配置,更靈活。
若是引入Antd,可能依賴於引入Less,
若是不想引入Antd,能夠捨棄Antd部分,按步驟引入Less。