详解webpack2+React 实例demo
发布时间 - 2026-01-11 03:12:08 点击率:次1.目录结构

源文件在src目录下,打包后的文件在dist目录下。
2.webpack.config.js
说明:
1.涉及到的插件需要npm install安装;
2.html-webpack-plugin创建服务于 webpack bundle 的 HTML 文件;
3.clean-webpack-plugin清除dist目录重复的文件;
4.extract-text-webpack-plugin分离css文件。
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
var config = {
context: path.resolve(__dirname, './src'),
entry: {
app: './main.js'
},
output: {
path: path.resolve(__dirname, './dist'),
filename: '[name].bundle.js'
},
devtool: 'cheap-module-eval-source-map',
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader'
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: ["css-loader","postcss-loader"]
})
},
{
test: /\.less$/,
use: ["style-loader","css-loader","less-loader"]
},
{
test: /\.(png|jpg)$/,
loader: 'url-loader',
options: {
limit: 8129
}
}
]
},
devServer:{
historyApiFallback: true,
host:'0.0.0.0',
hot: true, //HMR模式
inline: true,//实时刷新
port: 8181 // 修改端口,一般默认是8080
},
resolve: {
extensions: ['.js', '.jsx', '.css'],
modules: [path.resolve(__dirname, './src'), 'node_modules']
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new UglifyJsPlugin({
sourceMap: true
}),
new webpack.LoaderOptionsPlugin({
minimize: true,
debug: true
}),
new HtmlWebpackPlugin({
template:'./templateIndex.html'
}),
new ExtractTextPlugin({
filename: '[name].[hash].css',
disable: false,
allChunks: true,
}),
new CleanWebpackPlugin(['dist'])
],
}
module.exports = config;
// webpack里面配置的bundle.js需要手动打包才会变化,目录可以由自己指定;
// webpack-dev-server自动检测变化自动打包的是开发环境下的bundle.js,打包路径由contentBase决定,两个文件是不一样的.
3.postcss.config.js(Autoprefixer)
module.exports = {
plugins: {
'autoprefixer': {browsers: 'last 5 version'}
}
}
// 兼容最新的5个浏览器版本
4.新建.babelrc
{
"presets": ['es2015','react','stage-3']
}
5.index.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>React Project</title> </head> <body> <div id="content"></div> <script src="app.bundle.js"></script> </body> </html>
6.package.json
npm install 或 yarn -> 安装模块,npm run build -> 打包,npm start -> 启动localhost:8181
{
"name": "reactproject",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"jquery": "^3.1.1",
"react": "^15.3.2"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.14.0",
"babel-loader": "^6.2.5",
"babel-plugin-syntax-async-functions": "^6.13.0",
"babel-plugin-transform-async-to-generator": "^6.16.0",
"babel-preset-es2015": "^6.14.0",
"babel-preset-react": "^6.11.1",
"babel-preset-stage-3": "^6.17.0",
"bootstrap": "^4.0.0-alpha.2",
"clean-webpack-plugin": "^0.1.16",
"css-loader": "^0.25.0",
"extract-text-webpack-plugin": "^3.0.0-rc.2",
"file-loader": "^0.9.0",
"html-webpack-plugin": "^2.29.0",
"jshint": "^2.9.3",
"jshint-loader": "^0.8.3",
"json-loader": "^0.5.4",
"less": "^2.7.1",
"less-loader": "^2.2.3",
"moment": "^2.15.1",
"node-sass": "^3.10.0",
"postcss-loader": "^2.0.6",
"react-bootstrap": "^0.30.5",
"react-dom": "^15.3.2",
"sass-loader": "^4.0.2",
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"webpack": "^3.3.0",
"webpack-dev-server": "^2.5.1"
},
"scripts": {
"start": "webpack-dev-server --hot --inline --progress --colors --content-base .",
"build": "webpack --progress --colors"
},
"keywords": [
"reactcode"
],
"author": "xhh",
"license": "ISC"
}
7.main.js:入口文件
import React from 'react'
import { render } from 'react-dom';
import $ from 'jquery';
import Demo1 from './js/demo1.js';
// import Demo2 from './js/demo2.js';
render(<Demo1 title="这是提示" />, $('#content')[0]);
// render(<Demo2 myName="园中桥" sex="female"/>, $('#content')[0]);
8.templateIndex.html
打包后的模板index文件,插件html-webpack-plugin的template指定的目录。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Template Index html</title> </head> <body> <div id="content"></div> </body> </html>
9.demo
demo1.js
import React from 'react';
import '../css/demo1.css';
const arr = [
{
name:'name1',
tel:'12343456783'
},
{
name:'name2',
tel:'12343456784'
},
{
name:'name3',
tel:'12343456785'
}
];
export default class Demo1 extends React.Component {
constructor(props) {
super(props);
this.state = {
content: true,
value: 'inputText'
};
}
handleClick(){
this.setState({
content: !this.state.content
})
// this.refs.myInput.focus();
}
handleChange(event) {
this.setState({value: event.target.value});
}
renderArr() {
return arr.map((item,index)=>{
return <li key={index}>name:{item.name},tel:{item.tel}</li>
})
}
render(){
let btnStyle = {
border: '1px solid #ccc',
background:'#fff',
color: '#a106ce'
}
return (
/* 注释 */
<div>
<button style={btnStyle} className="btn" type="button" onClick={()=>this.handleClick()}>change state</button><br/>
<p title={this.props.title} style={{ color:'#A349A4' }}>Hello { this.props.textCont}!</p>
<p>{this.state.content ? 'initial value' : 'later value'}</p>
{ /* 标签里面的注释外面要用花括号 */ }
<input type="text" value={this.state.value} ref="myInput" onChange={this.handleChange.bind(this)} />
<h4>{this.state.value}</h4>
<DemoChild><p>lalala</p></DemoChild>
<ul>
{ this.renderArr() }
</ul>
</div>
)
}
}
Demo1.propTypes = {
title: React.PropTypes.string.isRequired
}
Demo1.defaultProps = {
textCont: 'React'
}
class DemoChild extends React.Component {
constructor(props) {
super(props);
}
render(){
return (
<div>我是子组件{this.props.children}</div>
)
}
}
demo1.css
ul {
list-style: none;
padding: 0;
margin:0;
display: flex;
}
.btn:focus {
outline: none;
}
demo2.js:父子组件生命周期
import React, { Component, PropTypes } from 'react';
import '../css/demo2.css';
export default class Demo2 extends Component {
constructor(props){
super(props);
this.state = {
stateName: this.props.myName + ',你好',
count: 0,
}
console.log('init-constructor');
}
static get defaultProps() {
return {
myName: "xhh",
age: 25
}
}
doUpdateCount(){
this.setState({
count: this.state.count+1
})
}
componentWillMount() {
console.log('componentWillMount');
}
componentDidMount() {
console.log('componentDidMount')
}
componentWillReceiveProps(nextProps){
console.log('componentWillReceiveProps')
}
shouldComponentUpdate(nextProps, nextState){
console.log('shouldComponentUpdate');
// return nextProps.id !== this.props.id;
if(nextState.count > 10) return false;
return true;
}
componentWillUpdate(nextProps,nextState){
console.log('componentWillUpdate');
}
componentDidUpdate(prevProps, prevState){
console.log('componentDidUpdate');
}
componentWillUnmount(){
console.log('componentWillUnmount');
}
render(){
console.log('render');
return (
<div>
<p className="colorStyle">姓名:{this.props.myName}</p>
<p>问候:{this.state.stateName}</p>
<p>年龄:{this.props.age}</p>
<p>性别:{this.props.sex}</p>
<p>父元素计数是:{this.state.count}</p>
<button onClick={ this.doUpdateCount.bind(this) } style={{ padding: 5,backgroundColor: '#ccc' }}>点我开始计数</button>
<SubMyPropType count1={this.state.count} />
</div>
)
}
}
Demo2.propTypes = {
myName: PropTypes.string,
age: PropTypes.number,
sex: PropTypes.string.isRequired
}
class SubMyPropType extends Component {
componentWillMount() {
console.log('subMyPropType-componentWillMount');
}
componentDidMount() {
console.log('subMyPropType-componentDidMount')
}
componentWillReceiveProps(nextProps){
console.log('subMyPropType-componentWillReceiveProps')
}
shouldComponentUpdate(nextProps, nextState){
console.log('subMyPropType-shouldComponentUpdate');
if(nextProps.count1 > 5) return false;
return true;
}
componentWillUpdate(nextProps, nextState){
console.log('subMyPropType-componentWillUpdate');
}
componentDidUpdate(prevProps, prevState){
console.log('subMyPropType-componentDidUpdate');
}
componentWillUnmount(){
console.log('subMyPropType-componentWillUnmount');
}
render(){
console.log('subMyPropType-render');
return(
<p>子元素计数是:{this.props.count1}</p>
)
}
}
demo2.css
.colorStyle {
color: #0f0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# webpack2
# React
# 实例
# demo
# 详解webpack2+node+react+babel实现热加载(hmr)
# 详解react-webpack2-热模块替换[HMR]
# 的是
# 这是
# 我是
# 目录下
# 才会
# 要用
# 涉及到
# 服务于
# 大家多多
# 园中
# 你好
# browsers
# version
# babelrc
# plain
# xhtml
# index
# lt
# gt
# doctype
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python数据仓库与ETL构建实战_Airflow调度流程详解
iOS验证手机号的正则表达式
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
详解jQuery中的事件
Android实现代码画虚线边框背景效果
,网页ppt怎么弄成自己的ppt?
如何快速生成高效建站系统源代码?
如何快速启动建站代理加盟业务?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
Laravel如何升级到最新版本?(升级指南和步骤)
如何在阿里云完成域名注册与建站?
Laravel怎么清理缓存_Laravel optimize clear命令详解
html5的keygen标签为什么废弃_替代方案说明【解答】
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
如何快速查询域名建站关键信息?
浅述节点的创建及常见功能的实现
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
phpredis提高消息队列的实时性方法(推荐)
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Android自定义控件实现温度旋转按钮效果
如何在 Pandas 中基于一列条件计算另一列的分组均值
三星、SK海力士获美批准:可向中国出口芯片制造设备
高端建站如何打造兼具美学与转化的品牌官网?
Bootstrap CSS布局之列表
BootStrap整体框架之基础布局组件
如何用好域名打造高点击率的自主建站?
如何基于云服务器快速搭建个人网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何构建满足综合性能需求的优质建站方案?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
香港服务器部署网站为何提示未备案?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel Docker环境搭建教程_Laravel Sail使用指南
Laravel如何实现数据库事务?(DB Facade示例)
如何为不同团队 ID 动态生成多个“认领值班”按钮
香港服务器租用每月最低只需15元?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
使用spring连接及操作mongodb3.0实例
如何用低价快速搭建高质量网站?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
JS经典正则表达式笔试题汇总
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何选择可靠的免备案建站服务器?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】

