Webpack 和 React 实战
TL;DR$ git clone https://github.com/nodejh/start-react-with-webpack react-sample $ cd react-sample && npm install $ npm run dev 然后打开浏览器输入 为了避免包版本问题导致程序不能运行,根目录下有一个 1. 安装并配置 Webpack首先创建并初始化一个项目目录: $ mkdir react-sample && cd react-sample $ npm init 安装 $ npm i webpack --save-dev 然后配置 # 创建一个 webpack.config.js 文件 $ touch webpack.config.js <!-- more --> 在该文件中加入下面的内容: const webpack = require('webpack'); const path = require('path'); // 定义打包目录路径 const BUILD_DIR = path.resolve(__dirname,'./build'); // 定义组件目录路径 const APP_DIR = path.resolve(__dirname,'./app'); const config = { entry: `${APP_DIR}/index.jsx`,// 文件打包的入口点 output: { path: BUILD_DIR,// 输出目录的绝对路径 filename: 'bundle.js',// 输出的每个包的相对路径 },resolve: { extensions: ['','.js','.jsx'],// 开启后缀名的自动补全 },}; module.exports = config; 这是一个最基本的 webpack 配置文件。 接下来在 <html> <head> <meta charset="utf-8"> <title>Start React with Webpack</title> </head> <body> <div id="app" /> <script type="text/javascript" src="./bundle.js"></script> </body> </html> 2. 配置加载器 babel-loader加载器是把一个资源文件作为入参转换为另一个资源文件的 node.js 函数。 由于我们写 React 的时候使用的是 JSX 语法和 ES6 语法,而浏览器并不完全支持它们。所以需要使用
安装依赖包: $ npm i babel-core babel-loader babel-preset-es2015 babel-preset-react --save-dev
接下来需要修改 // Existing Code .... const config = { // Existing Code .... module: { loaders: [{ test: /.(js|jsx)$/,exclude: /(node_modules|bower_components)/,loader: 'babel-loader',query: { presets: ['es2015','react'] } }] } }; 3. Hello React安装 React: $ npm i react react-dom --save 在 import React from 'react'; import {render} from 'react-dom'; class App extends React.Component { render () { return <h1> Hello React!</h1>; } } render(<App/>,document.getElementById('app')); 这个时候,执行下面的命令打包: webpack -w
打包完成后,将
4. 自动刷新和热加载懒是第一生产力。每次写完代码,都要重新打包,重新刷新浏览器才能看到结果,显然很麻烦。 那有没有能够自动刷新浏览器的方法呢?当然有,这个时候就需要 webpack-dev-server 这个包。 $ npm install webpack-dev-server -g
Iframe 模式
inline 模式
接下来启动 webpack-dev-server: $ webpack-dev-server --inline --hot --content-base ./build/
[HMR] Waiting for update signal from WDS... [WDS] Hot Module Replacement enabled.
当然,命令行输入这么长,还是不太方便,所以还有一种更简单的方式,在 // Existing Code .... "scripts": { "dev": "webpack-dev-server --inline --hot --content-base ./build/" } 然后通过 5. 添加一个新的组件在 import React,{ Component } from 'react'; class AwesomeComponent extends Component { constructor(props) { super(props); this.state = { likesCount: 0 }; this.onLike = this.onLike.bind(this); } onLike() { let newLikesCount = this.state.likesCount + 1; this.setState({ likesCount: newLikesCount }); } render() { return ( <div> Likes: <span>{this.state.likesCount}</span> <div> <button onClick={this.onLike}>Like Me</button> </div> </div> ); } } export default AwesomeComponent; 然后修改 // ... import AwesomeComponent from './AwesomeComponent.jsx'; // ... class App extends React.Component { render () { return ( <div> <p> Hello React!</p> <AwesomeComponent /> </div> ); } } // ...
UPDATE2016.10.15
设置 webpack-dev-server (old)上面我们直接通过浏览器浏览的 首先安装 $ npm i webpack-dev-server --save-dev 然后在 { "scripts": { "build": "webpack","dev": "webpack-dev-server --devtool eval --progress --colors --hot --content-base build" } }
然后就可以使用 $ npm run dev 在浏览器地址栏输入 如果需要浏览器自动刷新,将 entry: [ 'webpack-dev-server/client?http://localhost:8080','webpack/hot/dev-server',APP_DIR + '/index.jsx' ] 这样的话,每次当代码发生变化之后,webpack 会自动重新打包,浏览器也会自动刷新页面。 2016.11.19 更新
|