$ npm install -g create-react-app
$ create-react-app <項目名稱>
$ cd <項目名> $ npm run start
{ ...... "homepage": ".", "dependencies": { "react": "^16.4.0", "react-dom": "^16.4.0", "react-scripts": "1.1.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } }
"homepage": "."
(上面配置文件已給出), 同時build後的項目須要在服務器下才能訪問;不然打開的將是空白頁面;public: 公共目錄,該目錄下的文件都不會被webpack進行加載、解析、打包;經過npm run build進行打包時該項目下的全部文件將會直接被複制到build目錄下;css
%PUBLIC_URL%
來指向public目錄路徑;src: 是源碼目錄該目錄下除了index.js App.test.js registerServiceWorker.js 文件具備必定意義其他文件都是演示使用可直接刪除html
$ npm run eject 說明: 執行eject腳本後,項目下會新增或對部分配置文件進行修改;項目下 script 目錄存放着腳本文件, config 目錄下存放着配置文件
$ npm install less-loader less -dev
// 需同時修改下面的兩個文件: // 開發環境下的配置文件:webpack.config.dev.js // 生產環境下的配置文件:webpack.config.prod.js // 兩個文件的修改內容相同,對應修改內容以下(三處須要進行修改) ...... { // 【1】修改文件匹配正則 test: /\.(css|less)$/, use: [ require.resolve('style-loader'), { loader: require.resolve('css-loader'), options: { // 【2】將本來數字 1 改成數字2 importLoaders: 2, }, }, { .... }, // 【3】添加新的加載配置對象 { loader: require.resolve('less-loader'), } ], } ......
$ npm install react-app-rewired --save-dev
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test --env=jsdom", "eject": "react-app-rewired eject" }
module.exports = function override(config, env) { // 在這裏添加配置 return config; }
$ npm install react-app-rewire-less --save 說明: 這裏再也不須要額外單獨安裝依賴包:less-loader less
const rewireLess = require('react-app-rewire-less'); module.exports = function override(config, env) { // 只須要一條配置信息便可實現對less的支持 config = rewireLess(config, env); // 下面註釋用於配置loader的參數 // config = rewireLess.withLoaderOptions(someLoaderOptions)(config, env); return config; }
$ create-react-app demo $ cd demo $ npm run start
$ npm install npm
import antd/dist/antd.css
import { Button } from 'antd';
- 上面引入組件和樣式的方式,會一次性加載全部樣式並引入組件中的全部相應模塊; - 這種引入方式將會影響到應用的網絡性能; - 相應的就須要改變引入組件和樣式的方式,實現樣式和組件的按需加載; - 下面將介紹三種按需加載組件樣式的方法:
5.2.1 方法一: 精確加載組件node
import Button from 'antd/lib/button'; import 'antd/lib/button/style'; // 或者經過import antd/lib/button/style/css 進行加載樣式
5.2.2 方法二:經過暴露配置 配合 babel-plugin-import插件實現按需加載
babel-plugin-import 是一個用於按需加載組件代碼和樣式的 babel 插件react
$ npm run eject
$ npm install babel-plugin-import --save-dev
"babel": { "presets": [ "react-app" ], "plugins": [ ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }] ] },
import { Button } from 'antd';9
5.2.2 方法三:經過 babel-plugin-import + react-app-rewired實現按需加載(官網推薦)webpack
$ npm install babel-plugin-import --save-dev
// 引入 react-app-rewired 添加 babel 插件的函數 const { injectBabelPlugin } = require('react-app-rewired'); module.exports = function override(config, env) { config = injectBabelPlugin(['import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css' }], config); return config; };
import { Button } from 'antd';9
主要經過利用了 less-loader 的 modifyVars 參數來進行主題配置git
$ npm react-app-rewire-less --save-dev
const rewireLess = require('react-app-rewire-less'); const { injectBabelPlugin } = require('react-app-rewired'); module.exports = function override(config, env) { // 擴展 webpack ==> 支持less config = rewireLess(config, env); // 配置loader參數 config = rewireLess.withLoaderOptions({ // 修改默認顏色 實現自定義主題 modifyVars: { "@primary-color": "#1DA57A" }, })(config, env); // antd 按需加載配置 config = injectBabelPlugin(['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }], config); return config; }
5.4.1 經過暴露配置實現github
$ npm run eject
$ npm install --save-dev babel-plugin-transform-decorators-legacy
"babel": { "presets": [ "react-app" ], "plugins": [ ["transform-decorators-legacy"] ] },
5.4.2 使用插件 react-app-rewired 對配置進行擴展實現對修飾器的支持web
$ npm install --save-dev babel-plugin-transform-decorators-legacy
// 導入添加babel插件的函數 const { injectBabelPlugin } = require('react-app-rewired'); module.exports = function override(config, env) { // do stuff with the webpack config... // 修飾器擴展 (添加babel插件:transform-decorators-legacy ) config = injectBabelPlugin('transform-decorators-legacy', config) return config; };
{ .... "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test --env=jsdom", "eject": "react-app-rewired eject" }, ... }