$ 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" }, ... }