webpack手动配置React开发环境的步骤


Posted in Javascript onJuly 02, 2018

React提供了create-react-app的快速构建工具, 但作为一个专业的程序员(老司机), 面对复杂的项目, 入门级的构建工具, 是远远不够的, 我们这里从零开始, 用webpack, 手动配置一个独立的React开发环境, 开发环境完成后, 支持自动构建, 自动刷新, sass语法 等功能...

1. 首先用npm初始化环境

mkdir react-webpack-demo
cd react-webpack-demo
npm init -y

webpack手动配置React开发环境的步骤

安装相关软件包

npm install react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin -D
npm install babel-core babel-loader babel-plugin-transform-runtime -D
npm install babel-preset-env babel-preset-stage-0 babel-preset-react -D
# 识别html转换为jsx语法
npm install babel-preset-react -D

2.添加对html静态文件的支持

  1. 在根目录下新建文件夹src, 在src内加入index.html  index.js
  2. 在根目录下新建webpack.config.js
  3. 在webpack.config.js中加入如下配置
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 负责将html文档虚拟到根目录下
let htmlWebpackPlugin = new HtmlWebpackPlugin({
  // 虚拟的html文件名 index.html
  filename: 'index.html',
  // 虚拟html的模板为 src下的index.html
  template: path.resolve(__dirname, './src/index.html')
})

module.exports = {
  // 开发模式
  mode: 'development',
  // 配置入口文件
  entry: './src/index.js',
  // 出口文件目录为根目录下dist, 输出的文件名为main
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'main.js'
  },
  // 配置开发服务器, 并配置自动刷新
  devServer: {
    // 根目录下dist为基本目录
    contentBase: path.join(__dirname, 'dist'),
    // 自动压缩代码
    compress: true,
    // 服务端口为1208
    port: 1208,
    // 自动打开浏览器
    open: true
  },
  // 装载虚拟目录插件
  plugins: [htmlWebpackPlugin],
}

在package.json内scripts中添加"dev": "webpack-dev-server"

webpack手动配置React开发环境的步骤

在src/index.html中添加内容

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>react-webpack-demo</title>
</head>
<body>
  react-webpack-demo
  <hr>
  高堂明镜悲白发, 朝如青丝暮成雪
</body>
</html>

在命令行内运行npm run dev, 即可看到刚添加的index.html内容

webpack手动配置React开发环境的步骤

接下来我们配置babel对es6语法的支持, 以及对jsx语法的支持

3. 添加对js高级语法的支持

在项目根目录, 添加.babelrc配置文件 presets为语法配置,plugins为插件配置

{
  "presets": ["env", "stage-0", "react"],
  "plugins": ["transform-runtime"]
}

在webpack.config.js中添加module字段, 进行插件loader配置

// webpack.config.js
module.exports = {
  ...
  // 配置loader
  module: {
    // 根据文件后缀匹配规则
    rules: [
      // 配置js/jsx语法解析
      { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }
    ]
  }
};

在src/index.html中加入id为root的div节点

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>react-webpack-demo</title>
</head>
<body>

  react-webpack-demo
  <hr>
  高堂明镜悲白发, 朝如青丝暮成雪
  <hr>
  <div id="root"></div>
</body>
</html>

在src/index.js中加入包含jsx语法的react组件

import React from 'react';
import ReactDOM from 'react-dom';


class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { number: 0 };
    this.decrease = this.decrease.bind(this);
    this.increase = this.increase.bind(this);
  }
  // 加1
  increase() {
    let self = this;
    self.setState({ number: self.state.number + 1 })
  }
  // 减一
  decrease() {
    let self = this;
    self.setState({ number: self.state.number - 1 })

  }


  render() {
    return ( 
      <div>
        <input type = "button" value = "减1"onClick = { this.decrease }/> 
        <span> { this.state.number } </span>
        <input type = "button" value = "加1" onClick = { this.increase }/> 
      </div> )
  }
}

ReactDOM.render(<Counter /> , document.getElementById('root'))

附录: 添加对sass语法的支持(没兴趣可以跳过)

安装sass相关的loader

npm install style-loader css-loader node-sass sass-loader -D

在webpack.config.js内新增规则

// webpack.config.js
module.exports = {
  ...
  module: {
    rules: [{
      test: /\.scss$/,
      use: [
        "style-loader", // creates style nodes from JS strings
        "css-loader", // translates CSS into CommonJS
        "sass-loader" // compiles Sass to CSS
      ]
    }]
  }
};

在src内新增index.scss

$designWidth: 750;
@function px2rem($px) {
 @return $px*10/$designWidth + rem;
}

#root {
  div {
    font-size: px2rem(500);
    display: flex;
    color: #64B587;
    input {
      flex: 1 1 auto;
    }
    span {
      flex: 1 1 auto;
      text-align: center;
    }
  }
}

在index.js中新增import index.scss

最终效果:

webpack手动配置React开发环境的步骤

文中相关资源链接:链接: https://pan.baidu.com/s/10PYXo_WoIScn-IFRdtuc5w 密码: td78

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS返回上一页实例代码通过图片和按钮分别实现
Aug 16 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
May 30 Javascript
对Angular.js Controller如何进行单元测试
Oct 25 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
Jan 06 jQuery
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
js中的深浅拷贝问题简析
May 10 Javascript
关于layui的动态图标不显示的解决方法
Sep 04 Javascript
JS数组的常用10种方法详解
May 08 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 18 Javascript
Angularjs中的$apply及优化使用详解
Jul 02 #Javascript
angularjs 的数据绑定实现原理
Jul 02 #Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 #Javascript
vue中的数据绑定原理的实现
Jul 02 #Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 #Javascript
jsonp跨域获取数据的基础教程
Jul 01 #Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
Jul 01 #Javascript
You might like
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
angular5 httpclient的示例实战
2018/03/12 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
物流管理毕业生自荐信
2013/10/24 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
中英文求职信范文
2014/01/27 职场文书
七年级生物教学反思
2014/01/30 职场文书
网络工程师职业规划
2014/02/10 职场文书
合作经营协议书
2014/04/17 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
git中cherry-pick命令的使用教程
2022/06/25 Servers