0

0

react如何配置开发环境?React+webpack 的开发环境配置步骤(结果篇)

寻∝梦

寻∝梦

发布时间:2018-09-11 11:12:11

|

2357人浏览过

|

来源于php中文网

原创

本篇文章主要讲述了关于react+webpack的开发环境配置步骤最后结果篇。下面让我们一起来看这篇文章吧

配置步骤(一):react如何配置开发环境?react+webpack开发环境配置步骤(附配置实例)

配置步骤(二):  react如何配置开发环境?React+webpack 的开发环境配置步骤(深入篇)

这里先讲每一步的原因和做法。配置步骤(四)会讲怎么快速搭建webpack,同时会把整个项目包分享到git上。

目录  
四、React 配置  
1. React 组件
2. React router 模块
3. React 和Redux 配合


在前面的文章已经讲解怎么配置好了整个webpack环境。后面会有一篇文章讲怎么快速搭建webpack。

1. React 组件

先用node.js安装react 和react-dom 模块:

npm install react react-dom --save

在webpack.dll.config.js 里面的vendors 数组里面添加 react-dom 第三库

const vendors = [  
  'react',  "react-dom"];

在Powershell 窗口里面敲下面指令,把第三方库打包到dll里面。

webpack -p --config webpack.dll.config.js --progress --profile --colors

指令完成后,会更新manifest.json 和vendor.xxxx.js。 这时需要手动刷新html 模板里面引进的vendor.xxxx.js文件。

修改app.js里面的内容,添加reactdom 的渲染语句:

require('./css/css');require('./less/less.less');require('./scss/scss.scss');var app=document.createElement("p");
app.innerHTML='

Hello World!

';document.body.insertBefore(app,document.body.childNodes[0]);

//下面的是react的代码

import React from 'react';
import ReactDOM from 'react-dom';class FirstComponent extends React.Component{
    render(){      return(
          

this is React code from Components.

); } } var p=document.createElement("p");p.setAttribute("id","root"); document.body.insertBefore(p,document.body.childNodes[1]); ReactDOM.render(,document.getElementById('root'));

在powershell里面敲npm start 启动服务器,在浏览器上敲localhost:8080 就可以显示这个网页的内容。

2.React router 模块

先安装相应的模块:react-router-dom,指令:

npm install react-router-dom --save

这个模块同样需要添加到webpack.dll.config.js 里面的vendors 数组里面添加 react-dom 第三库

const vendors = [  
  'react',  "react-dom"];

在Powershell 窗口里面敲下面指令,把第三方库打包到dll里面。

webpack -p --config webpack.dll.config.js --progress --profile --colors

指令完成后,会更新manifest.json 和vendor.xxxx.js。 这时需要手动刷新html 模板里面引进的vendor.xxxx.js文件。

修改app.js里面的内容:

import React from 'react';import ReactDOM from 'react-dom';import {NavLink,Route,BrowserRouter,HashRouter as Router, Swith,Redirect} from 'react-router-dom';import RouteConfig from '../Config/Route.jsx';var p=document.createElement("p");
p.setAttribute("id","root");document.body.insertBefore(p,document.body.childNodes[1]);
ReactDOM.render(
    
        {RouteConfig}
    
    ,document.getElementById('root'));

现在的router 有两个版本,用react-router 或者react-router-dom 。这里用react-router-dom,这个模块有几个接口:NavLink 、Route 、BrowserRouter、HashRouter、Swith、Redirect 等 。每个接口的作用我这不做说明。RouteConfig 是路由配置文件,自己创建的。

现在需要创建几个文件,
  1) 在根目录创建Config文件夹,文件夹里面创建Route.jsx。
       Route.jsx 的内容:

import React from 'react';
import ReactDOM from 'react-dom';
import {NavLink,Route,BrowserRouter as Router,HashRouter,Switch,Redirect}  from 'react-router-dom';

import MainComponent from '../component/Main.jsx';//引进组件import Topic from '../component/Topic.jsx';//引进组件const routes =[
    {
        path:'/',
        exact:true,
        component: MainComponent
    },
    {
        path:'/topic',
        exact:false,
        component:Topic
    },
];const RouteConfig = (
    
    {
      routes.map((route,index)=>(
                  
                ))
    }
    
);
export default RouteConfig;

2)在根目录下创建component 文件夹,文件夹下创建两个文件:
   Main.jsx:

import React from 'react';import ReactDOM from 'react-dom';import {NavLink as Link} from 'react-router-dom';class MainComponent extends React.Component{
    render(){      return(
          

mainText

jumpe to Topic

); } } export default MainComponent;

Topic.jsx

import React from 'react';import ReactDOM from 'react-dom';import {NavLink as Link} from 'react-router-dom';class Topic extends React.Component{
    render(){      return(
          

topicText:

jumpe to Main

); } } export default Topic;

建完后,在powershell窗口下敲npm start,然后在浏览器地址栏敲localhost:8080  就后出现下面页面:
4.jpg

点击 jumpe to Topic ,就会跳到 topic  页面:
5.jpg

PictoGraphic
PictoGraphic

AI驱动的矢量插图库和插图生成平台

下载

这样webpack react router 就这样简单的配置好了。

3.React 和Redux 配合

Redux 模块可以集中管理 react全部组件的state,这个技术很常用。
安装Redux模块,指令:

 npm install redux react-redux react-router-redux redux-thunk --save

模块安装好后,在需要在webpack.dll.config.js 里面修改vendors的内容:

const vendors = [  'react',  "react-dom",  "react-router-dom",  "redux",  "react-redux",  "react-router-redux",  "redux-thunk"];

在Powershell 窗口下,敲:

webpack -p --config webpack.dll.config.js --progress --profile --colors

在build 路径下会再次生成manifest.json 和 vendor.xxxxx.js文件,把相应的vendor.xxxxx.js文件引入到index.html模板文件中。

要使用redux,需要先理解它的基本原理,这里我简单的说下,具体的可以百度了解下。
redux 主要分为三块,store reducer action。
store 用来存储component里面需要集中管理的state;
action 是定义与state状态改变相关的一系列方法(方法也称为action creator);
reducer 初始化state及调用action的方法修改state的状态,返回新state。
这三者之间的用什么相互关联的,下面步骤讲解里面会有提及。

store 一般会采用自动创建的方法。react组件可以通过函数直接上传给store,上传代码是直接写在组件里面,不需要添加一个组件就修改一次store的代码。
store 的中间件用来实现异步调用,这里用ReduxThunk。这个中间件的优缺点,暂时不涉及。
在src 目录下创建一个Config 文件夹,在Config 里面新建一个Store.jsx。
Store.jsx 的代码:

import {createStore,combineReducers,applyMiddleware} from 'redux';
import RootReducer from '../Reducer/index.jsx';//引入reduceimport ReduxThunk from 'redux-thunk';//中间件var store = createStore(    //自动生成store的函数
    RootReducer, //reduce,修改state状态的函数集合
    applyMiddleware(ReduxThunk) //中间件);

export default store;

RootReducer是自己定义的reduce文件。createStore applyMiddleware 来自redux 模块。 ReduxThunk 来自于redux-thunk。
store 和 reducer 是通过createStore 关联起来的。

action
在src下面创建一个action文件夹,action文件夹下新建一个action.jsx文件。
action代码:

const actions = {

 changeText:function(num){
     console.log("调用actions");      switch(num){      case 1:      return {type:'AlterMain',payload:"mainContainer had been changed"};      case 2:       return {type:'AlterTopic',payload:"topicContainer had been changed"};       default:       return action;

   }
},

};
export default actions;

预先规划设定state格式为:
const defaultState = { //在reducer 里面定义state的初始的值
  mainText:”mainContainer”,
  topicText:”topicContainer”

};
action这里定义了一个修改state状态的函数。当reducer调用action时,action就会通过不同的情况返回不同的action值。

reducer:
在src文件夹下面创建一个Reducer文件夹,文件夹下面新建一个index.jsx文件。
reducer的代码:

import {combineReducers} from 'redux';import {routerReducer} from 'react-router-redux';const defaultState = {//设定state的默认值
   mainText:"mainContainer",
   topicText:"topicContainer"};const reducer = (state = defaultState, action) => {     
    switch (action.type) {//通过action的返回值来选择更新哪个state的状态
        case 'AlterMain':            return  Object.assign({},state,{ mainText:action.payload});        case 'AlterTopic':            return  Object.assign({},state,{ topicText:action.payload});        default:            return state;
    }
};const RootReducer = combineReducers({//可以定义多个reducer,然后通过combineReducers来合并
    routing:routerReducer,//redux和router处理函数
    app:reducer      //app 需要与组件里面上传的state一致});
export default RootReducer;

reducer 只看到 通过action返回值来修改state的状态并没有看到调用action。
在调试移动端显示的时候,发现object.assign 存在兼容问题,在网上查了下资料,需要额外添加下面这段代码:

if (typeof Object.assign != 'function') {    // Must be writable: true, enumerable: false, configurable: true
    Object.defineProperty(Object, "assign", {
      value: function assign(target, varArgs) { // .length of function is 2        'use strict';        if (target == null) { // TypeError if undefined or null
          throw new TypeError('Cannot convert undefined or null to object');
        }        var to = Object(target);        for (var index = 1; index < arguments.length; index++) {          var nextSource = arguments[index];          if (nextSource != null) { // Skip over if undefined or null
            for (var nextKey in nextSource) {              // Avoid bugs when hasOwnProperty is shadowed
              if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                to[nextKey] = nextSource[nextKey];
              }
            }
          }
        }        return to;
      },
      writable: true,
      configurable: true
    });
  }

组件的定义:
修改component文件夹下的Main.jsx(想看更多就到PHP中文网React参考手册栏目中学习)

import React from 'react';import ReactDOM from 'react-dom';import {NavLink as Link} from 'react-router-dom';import {connect} from 'react-redux';import P from 'prop-types';import actions from '../src/action/action.jsx';//引入actions//mapstoreStateToProps 这里指定Main控件需要上传的stateconst mapStoreStateToProps = (state) =>(
    {
         mainText:state.app.mainText, //mainText是变量,值对应的state.app.mainText的存储空间,其中app与reducers里面定义的一致。

    }
);//mapDispatchToProps 这里上传处理state函数,即action里面定义的函数const mapDispatchToProps = (dispatch,ownProps)=> ({
   fn:{
       changeText:(num)=> dispatch(actions.changeText(num))
   }
});//这样state一致上传到store,需要取值用props取就okclass MainComponent extends React.Component{
    render(){      return(
          

mainText:{this.props.mainText}

jumpe to Topic

); } }//最后调用connect函数,把组件和store连接起来export default connect(mapStoreStateToProps,mapDispatchToProps)(MainComponent);

connect 函数能成功执行的前提是 组件是provider的子组件。所有需要修改app.js 。
app.js 代码:

import React from 'react';import ReactDOM from 'react-dom';import {NavLink,Route,BrowserRouter,HashRouter as Router, Swith,Redirect} from 'react-router-dom';import RouteConfig from '../src/Config/Route.jsx';import {Provider} from 'react-redux';import store from '../src/Config/Store.jsx';var p=document.createElement("p");
p.setAttribute("id","root");document.body.insertBefore(p,document.body.childNodes[0]);

ReactDOM.render(
     //Provider 并指定store的文件
        
            {RouteConfig}
        
    
    ,document.getElementById('root'));

Topic.jsx的代码:

import React from 'react';import ReactDOM from 'react-dom';import {NavLink as Link} from 'react-router-dom';import {connect} from 'react-redux';import actions from '../src/action/action.jsx';const mapStoreStateToProps = (state) =>(
    {         topicText:state.app.topicText,

    }
)const mapDispatchToProps = (dispatch,ownProps)=> ({   fn:{       changeText:(num)=> dispatch(actions.changeText(num))
   }
});class Topic extends React.Component{
    render(){      return(
          

topicText:{this.props.topicText}

jumpe to Main

); } }export default connect(mapStoreStateToProps,mapDispatchToProps)(Topic);

这样整个redux就搭建好了。

provider 指定 store文件,它下面的组件可以通过connect 把组件和store关联。
store:通过createStore 把 store和reducer 关联
reducer: 定义state的默认值,并定义state 和action的对应关系。combineReducers 合并reducer,指定reducer的接口,如果用到router时,要注意定义route的处理函数。
action:只是单独定义一些修改state状态的操作。
组件:通过connect 把需要集中管理的state即state对应的action 上传到store,并绑定组件。state的值被修改,组件的view就会做相应的改变

这里没有涉及到redux的异步通信。
流程可以简化理解为:
组件->action->dispath(action)->store->reducer ->store(修改state)->组件(view)

网页的整体效果如下:
用http://localhost:8080 就能看到下面的界面:
6.jpg

点击修改mainText的值 的按钮,mainText就会被更改如下:
7.jpg点击jumpe to Topic
8.jpg

点击 修改topicText的值 的按钮,topicText就会被更改如下:
9.jpg

本篇文章到这就结束了(想看更多就到PHP中文网React使用手册栏目中学习),有问题的可以在下方留言提问。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号