react+webpack+react-router+redux项目搭建(二)

(6)react

a. >npm install --save react react-dom
使用react修改上述src/index.js的内容


import React from 'react';

import ReactDom from 'react-dom';

ReactDom.render(

 
React使用成功
, document.getElementById('app'));

运行命令:npm run build ,再打开浏览器查看效果

a. react组件化

为了体现组件化,将“React使用成功”放到Display组件里


import React, {Component} from 'react';

export default class Dispaly extends Component {

render() {

 return{

 
React安装成功
} } }

同时修改src/index.js的内容


import React from 'react';

import ReactDom from 'react-dom';

+ import Display from './component/Display/Display'

+ ReactDom.render(

 , document.getElementById('app'));

b. react-router

安装

npm install --save react-router-dom

新建router文件夹和组件

** >cd src**
** >mkdir router && touch router/router.js **

编辑一个最基本的router.js,包含两个页面home和page1:


import React from 'react';

import {BrowserRouter as Router, Route, Swich, Link} from 'react-router-dom';

import Home from '../pages/Home/Home';

import Page1 from '../pages/Page1/Page1';

const getRouter = () => (

 

 
  • 首页
  • Page1
); export default getRouter;

新建页面文件夹

cd src
mkdir pages

新建两个页面 Home,Page1

cd src/pages

mkdir Home && touch Home/Home.js

mkdir Page1 && touch Page1/Page1.js

填充内容:

src/pages/Home/Home.js

import React, {Component} from 'react';

export default class Home extends Component {
 render() {
 return (
 
This is Home
) } }

这是点击link会在Console显示error, Failed to execute 'pushState' on 'History': A history state object with URL 'file:///D:/' cannot be created in a document with origin 'null' and URL 'file:///D:… /dist/app.html'。这是因为一直以来我们通过[file:///F:/react/react-family/dist/index.html](file:///F:\react\react-family\dist\index.html)路径访问html。不是我们想象中的路由那样的路径http://localhost:3000~。因此,我们需要配置一个简单的WEB服务器,指向index.html~有下面两种方法来实现:
① Nginx, Apache, IIS等配置启动一个简单的的WEB服务器。
② 使用webpack-dev-server来配置启动WEB服务器。

所以,下面对dev-server进行配置,在本文章后再对react-router做详细介绍。

(7) webpack-dev-server配置WEB服务器

webpack-dev-server就是一个小型的静态文件服务器。使用它,可以为webpack打包生成的资源文件提供Web服务。这里webpack-dev-server需要全局安装,要不后面用的时候要写相对路径。

a. 安装

npm install webpack-dev-server --save-dev
npm install webpack-dev-server -g

b. 添加 webpack.config.js配置


 devServer: {

 contentBase: path.join(__dirname, './dist')

 }

其中,contentBase指向文件根路径。

c. 添加运行指令

在package.json中添加

"start": "webpack-dev-server --config webpack.config.js"

执行 npm run start ,打开http://localhost:8080/查看效果

webpack-dev-server编译后的文件,都存储在内存中,我们并不能看见的。你可以删除之前遗留的文件dist/bundle.js,仍然能正常打开网站!

color(CLI only) console中打印彩色日志

historyApiFallback 任意的404响应都被替代为index.html。有什么用呢?你现在运行

npm start,然后打开浏览器,访问http://localhost:8080,然后点击Page1到链接http://localhost:8080/page1,然后刷新页面试试。发现刷新后404了。

为什么?dist文件夹里面并没有page1.html,当然会404了,所以我们需要配置

historyApiFallback,让所有的404定位到index.html。

host 指定一个host,默认是localhost。如果你希望服务器外部可以访问,指定如下:host: "0.0.0.0"。比如你用手机通过IP访问。

hot 启用Webpack的模块热替换特性。

port 配置要监听的端口。默认就是我们现在使用的8080端口。

proxy 代理。比如在 localhost:3000 上有后端服务的话,你可以这样启用代理:


 proxy: {

 "/api": "http://localhost:3000"

}

progress(CLI only) 将编译进度输出到控制台。

根据这几个配置,修改下我们的webpack-dev-server的配置~


 devServer: {

 port: 8080,

 contentBase: path.join(__dirname, './dist'),

 historyApiFallback: true,

 host: '0.0.0.0'

}

CLI ONLY的需要在命令行中配置package.json


"dev": "webpack-dev-server --config webpack.dev.config.js --color --progress" ```

运行 npm start ,这个时候会发现编译正确,但是浏览器显示** Cannot GET /**。这是为什么呢?上面说到了,historyApiFallback,让所有的404定位到index.html。而我们代码中使用的是app.html,所以可以将app.html更换名字index.html或者使用:

historyApiFallback: {

rewrites: [

{ from: /./, to: './dist/app.html' }

]

}

初次之外,devServer还有一个hot属性,它是个布尔值,表示是否开启热替换模块,下面一节将讲到。

(8) Hot Module Replacement

从上可以发现,每当在js内修改内容,都需要重新编译。因此我们使用webpack的一个热替换插件Hot Module Replacement,当在编辑页面修改代码时,浏览器会自动刷新。使用功能如下:
在package.json 增加 --hot

"dev": "webpack-dev-server --config webpack.dev.config.js --color --progress --hot"


或者

在webpack.config.js中添加配置

  • const webpack = require('webpack');

  • devServer: { hot: true}

  • plugins:[ new webpack.HotModuleReplacementPlugin()]


我们分别尝试一下上面的配置,并使用下面的重置state案例:

修改Home.js,增加计数state

import React, {Component} from 'react';

export default class Home extends Component {

constructor(props) {

super(props);

this.state = {

count: 0

}

}

_handleClick() {

this.setState({

count: ++this.state.count

})

}

render() {

return (

This is Home

当前计数:{this.state.count}

)

}

}

你可能感兴趣的:(react+webpack+react-router+redux项目搭建(二))