特点:
组建名称 | 主要作用 |
---|---|
react | react的核心代码 |
react-dom | 特定的DOM操作 |
eslint | 代码检测 |
url-loader | BASE64图片(小于1000kb) |
babel-loader | ES6和JSX语法解析 |
style-loader、css-loader | css代码解析 |
HtmlWebpackPlugin | 产出HTML插件 |
一个完整的项目除开需要这些基础框架之外,还需要一些常用的组件:
redux:帮助解决state变化和异步,state可能暴扣服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括UI状态,如接货的路由,被选中的标签,是否显示加载动态效果或者分页器等等。
react-redux: Redux的作者封装了一个React专用的库React-Redux,React-redux将所有的组件分成两大类:UI组件和容器组件。
const Title = Value => <h1>{value}</h1>;
import { connect } from 'react-redux'
const VisibleTodoList = connect(
mapStateToProps, //输入逻辑,(即state对象)如何转换为UI组件的参数
mapDispatchToProps //输出逻辑,用户发出的动作如何变为Action对象,从UI组件传出去。
)(TodoList)
TodoList是UI组件,VisibleTodoList就是由React-Redux通过connet方法自动生成的容器组件。
styled-component:样式化组件的主要作用是它可以编写实际的Css代码来设计组件样式,也不需要组件和样式之间的映射,即创建后就是一个正常的React组件,并且可以附加样式给当前组件。
import { injectGlobal } from 'styled-components';
injectGlobal`
@font-face {
font-family: 'Operator Mono';
src: url('../fonts/Operator-Mono.ttf');
}
body {
margin: 0;
}
const TomatoButton = Button.extend`
color: tomato;
border-color: tomato;
const Link = Button.withComponent('a')
History:history是一个管理js应用session会话历史的js库。它将不同环境(浏览器,node…)的变量统一成了一个简易的API来管理历史堆栈、导航、确认跳转、以及session间的持续状态。
常用的三种History
a. hashHistory
不需要服务器配置,在URL生成一个哈希来跟踪状态,通常在测试环境使用,也可以作为发布环境使用。
b.browserHistory
需要服务端做配置,路径是真实的URL,是官方推荐首选。
客户端:
ReactDOM.render((//你的route),document.getElementById(‘root’));
import { Provider } from ‘react-redux’
import { Router, browserHistory } from ‘react-router’
服务端:
// 通常用于加载静态资源app.use(express.static(__dirname + ‘/public’))
// 在你应用 JavaScript 文件中包含了一个 script 标签// 的 index.html 中处理任何一个 routeapp.get(’*’, function (request, response){response.sendFile(path.resolve(__dirname, ‘public’, ‘index.html’))})
app.listen(port)console.log("server started on port " + port)
const express = require(‘express’)
const path = require(‘path’)
const port = process.env.PORT || 8080
const app = express()
browserHistory需要服务端配置的原因
因为真实的URL其实是指向服务器资源,比如我们经常使用的API接口,也是一个真实的URL的资源路径,当通过真实的URL访问网站的时候,第一次访问的是网站的域名,这个时候可以正常加载我们的网站js等文件,而用户手动刷新网页的时候,由于路径是指向服务器的真实路径,服务器端没有做路由配置,就会导致资源不存在,用户访问的资源不存在,返回给用户的是404错误。
通过hashHistory来生成的URL就不会出现这样的问题,因为它不是指向真实的路由。
Fetch:fetch被称为下一代Ajax技术,采用Promise方式来处理数据。Fetch的核心是HTTP Requests,Responses Headers和Bodypayload的接口抽象,以及一个用于启动异步资源请求的全局fetch方法。
var url = 'https://example.com/profile';
var data = {username: 'example'};
fetch(url, {
method: 'POST', // or 'PUT'
body: JSON.stringify(data),
headers: new Headers({
'Content-Type': 'application/json'
})
}).then(res => res.json())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
<input type="file"/>
var formData = new FormData();
var fileField = document.querySelector("input[type='file']");
formData.append('username', 'abc123');
formData.append('avatar', fileField.files[0]);
fetch('https://example.com/profile/avatar', {
method: 'PUT',
body: formData
})
.then(response => response.json())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
var myHeaders = new Headers();
var myInit = { method: 'GET',
headers: myHeaders,
mode: 'cors',
cache: 'default' };
var myRequest = new Request('flowers.jpg', myInit);
fetch(myRequest).then(function(response) {
return response.blob();
}).then(function(myBlob) {
var objectURL = URL.createObjectURL(myBlob);
myImage.src = objectURL;
});
React-Router:路由是用于支持页面跳转的支撑。此模块比较重要且复杂,写法多样。如今React router已经到了V5版本,增加了基于React Hooks的一些API,比如UseParams、useHistory等,让我们可以在组件中不接受route props就可以拿到路由信息{match,location,location},除了利用React Hooks,React router中还有其他充分展示了React特性的API,比如利用了render props,withRouter利用了高阶组件。另外,就像React家族中的其他成员一样,React Router也做了核心库和绑定库分离,在黑辛苦React Router核心库,有绑定
由于路由比较复杂而且相对独立,详细资料请看 React学习笔记之三—路由