React+react-router4+webpack2基础环境搭建

package.json文件

//一部分
"scripts": {
    "start": "webpack-dev-server",
    "build": "webpack"
  },
"devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-preset-es2015": "^6.24.1",
    "css-loader": "^0.28.0",
    "react-hot-api": "^0.5.0",
    "react-hot-loader": "^1.3.1",
    "style-loader": "^0.16.1",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.5",
    "babel-preset-react": "^6.24.1"
  },
  "dependencies": {
    "react": "^15.5.4",
    "react-dom": "^15.5.4",
    "react-router-dom": "^4.1.1"
  }

注意:
在安装了babel-core和babel-loader后,还要安装规则集,安装完后加入到配置文件中。官方的规则集如下:

# ES2015转码规则 
$ npm install --save-dev babel-preset-es2015 

# react转码规则 
$ npm install --save-dev babel-preset-react 

# ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个 
$ npm install --save-dev babel-preset-stage-0 
$ npm install --save-dev babel-preset-stage-1 
$ npm install --save-dev babel-preset-stage-2 
$ npm install --save-dev babel-preset-stage-3

若出现Cannot find module ‘babel-plugin-transform-es2015’的错误,删除node_modules文件夹,重新安装所有模块即可。

webpack.config.js

var webpack=require("webpack");
var path=require("path");

module.exports={
    entry:{
        login:["./app/js/login.js"],
    },
    devtool:"source-map",//使打包后的代码的报错信息精确到行
    output:{
        path:path.resolve(__dirname,"./build/js"),//绝对路径,打包发布时才用到
        publicPath:'/js/',//index.html与打包后的js的相对路径
        filename:"[name].bundle.js"
    },
    module:{
        loaders:[
            {
                test:/\.(js|jsx)$/,
                exclude:/node_modules/,
// 在这里添加 react-hot-loader,注意这里使用的是loaders,所以不能用 query,应该把presets参数写在 babel 的后面
                loader:"react-hot-loader!babel-loader?presets[]=react,presets[]=es2015"

            }
        ]
    },
    devServer: {             
        contentBase:'./',//配置服务器目录
        publicPath:'/js/',//同output的publicPath
        port: 8000,//配置端口
        inline:true,//热加载
        hot:true,//热替换
        historyApiFallback: true//启动URL后退功能
    }
}

1.react-hot-loader:
能让修改的部分自动刷新,这和自动刷新网页是不同的,仅仅是替换你修改的部分,不会丢失页面状态 。

2.“entry”:值可以是字符串、数组和对象。
倘若你的应用只有一个单一的入口,enter项的值你可以使用任意类型,最终输出的结果都是一样的。都是把互相依赖的js文件打包成一个js文件,在入口的html文件中引用。
但是,如果你想添加多个彼此不互相依赖的文件,你可以使用数组格式的值。
如果你的应用是多页面的而不是SPA,有多个html文件(如index.html和index2.html)。然后你通过一个对象为每一个html生成一个bundle文件。

3.利用devServer可以进行一些配置。
inline和hot的区别:
“inline”选项会为入口页面添加“热加载”功能(刷新整个页面),“hot”选项则开启“热替换(Hot Module Reloading)”,即尝试重新加载组件改变的部分(而不是重新加载整个页面)。如果两个参数都传入,当资源改变时,webpack-dev-server将会先尝试HRM(即热替换),如果失败则重新加载整个入口页面。

//对象
entry:{
        login:["./app/js/login.js"],
        main:["./app/js/login.js"],
}
//数组
entry:["./app/js/login.js","./app/js/login.js"]
//字符串
entry:"./app/js/login.js"

login.js

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

class Example extends Component{
    render(){
        return (
           <h2>hello</h2>
        );

    }

}

ReactDOM.render(<Example/>,document.getElementById("root"));

index.html

index.html放在根目录下。src的路径与webpack.config.js配置的publicPath有关。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>react</title>
</head>
<body>
    <div id="root"></div>
    <script type="text/javascript" src="./js/login.bundle.js"></script>
</body>
</html>

以上就搭建起基础环境了。但是我们有时候用一些自动生成项目目录的包,看到里面都是用server.js文件来起一个本地服务器,然后用node+文件名来启动项目。大致过程可以参考:

server.js

在以上文件的基础上,增加server.js

var webpack=require("webpack");
var devServer=require("webpack-dev-server");
var config=require("./webpack.config.js");
new devServer(webpack(config),{
    publicPath: config.output.publicPath,//注意这里需要再配置一次publicPath,可以去掉webpack.config.js中的devServer配置,把所有属性都放在这里来配置
}).listen(8000,'localhost',function(err,res){
    if(err){
        return console.log(err);
    }
    console.log("listening");

})

修改package.json的npm script:
"start": "node server.js"

打包

使用html-webpack-plugin插件:它的作用是可以将根目录下的index.html拷贝一份到build目录下,并修改html文件中的src为正确的路径(根据publicPath修改的)。

安装html-webpack-plugin插件。然后在webpack.config.js中添加:

plugins:[
        new HtmlWebpackPlugin({
            filename:'../index.html',//配置路径和文件名(以webpack.config.js中的output的path为参照)
            template:'./index.html'//以跟目录下的index.html为模板来拷贝
        })
    ]

运行npm run build命令,生成build目录。直接在浏览器打开index.html即可看到效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值