Start React with Webpack
TL;DR
$ git clone https://github.com/nodejh/start-react-with-webpack react-samplen$ cd react-sample && npm installn$ npm run devn
然後打開瀏覽器輸入 http://localhost:8080,並嘗試隨意修改一下 app 目錄裡面的代碼,就能看到效果了。
為了避免包版本問題導致程序不能運行,根目錄下有一個 npm-shrinkwrap.json 文件,這裡面所有包的版本都是固定的。 npm install 時首先會檢查在根目錄下有沒有 npm-shrinkwrap.json,如果 shrinkwrap 文件存在的話,npm 會使用它(而不是 package.json)來確定安裝的各個包的版本號信息。
1. 安裝並配置 Webpack
首先創建並初始化一個項目目錄:
$ mkdir react-sample && cd react-samplen$ npm initn
安裝 webpack:
$ npm i webpack --save-devn
然後配置 webpack.config.js:
# 創建一個 webpack.config.js 文件n$ touch webpack.config.jsn
在該文件中加入下面的內容:
const webpack = require(webpack);nconst path = require(path);nn// 定義打包目錄路徑nconst BUILD_DIR = path.resolve(__dirname, ./build);n// 定義組件目錄路徑nconst APP_DIR = path.resolve(__dirname, ./app);nnconst config = {n entry: `${APP_DIR}/index.jsx`, // 文件打包的入口點n output: {n path: BUILD_DIR, // 輸出目錄的絕對路徑n filename: bundle.js, // 輸出的每個包的相對路徑n },n resolve: {n extensions: [, .js, .jsx], // 開啟後綴名的自動補全n },n};nnmodule.exports = config;n
這是一個最基本的 webpack 配置文件。
接下來在 build/ 目錄中創建一個 index.html 文件:
<html>n <head>n <meta charset="utf-8">n <title>Start React with Webpack</title>n </head>n <body>n <div id="app" />n <script type="text/javascript" src="./bundle.js"></script>n </body>n</html>n
2. 配置載入器 babel-loader
載入器是把一個資源文件作為入參轉換為另一個資源文件的 node.js 函數。
由於我們寫 React 的時候使用的是 JSX 語法和 ES6 語法,而瀏覽器並不完全支持它們。所以需要使用 babel-loader 來讓 webpack 載入 JSX 和 ES6 的文件。
babel-loader 的主要作用如下圖:
安裝依賴包:
$ npm i babel-core babel-loader babel-preset-es2015 babel-preset-react --save-devn
babel-preset-es2015 是轉換 ES6 的包;babel-preset-react 是轉換 JSX 的包。
接下來需要修改 webpack.config.js:
// Existing Code ....nconst config = {n // Existing Code ....n module: {n loaders: [{n test: /.(js|jsx)$/,n exclude: /(node_modules|bower_components)/,n loader: babel-loader,n query: {n presets: [es2015, react]n }n }]n }n};n
3. Hello React
安裝 React:
$ npm i react react-dom --saven
在 app 目錄下新建一個 index.jsx 文件,然後將下面的內容添加到 index.jsx 中:
import React from react;nimport {render} from react-dom;nnclass App extends React.Component {n render () {n return <h1> Hello React!</h1>;n }n}nnrender(<App/>, document.getElementById(app));n
這個時候,執行下面的命令打包:
webpack -wn
-w 參數表示持續監測項目目錄,如果文件發生修改,則重新打包。
打包完成後,將 build/index.html 用瀏覽器打開,就能看到 Hello React!,如下:
4. 自動刷新和熱載入
懶是第一生產力。每次寫完代碼,都要重新打包,重新刷新瀏覽器才能看到結果,顯然很麻煩。
那有沒有能夠自動刷新瀏覽器的方法呢?當然有,這個時候就需要 webpack-dev-server 這個包。
$ npm install webpack-dev-server -gn
webpack-dev-server 提供了兩種自動刷新模式:
Iframe 模式
- 不需要額外配置,只用修改路徑
- 應用被嵌入了一個 iframe 內部,頁面頂部可以展示打包進度信息
- 因為 Iframe 的關係,如果應用有多個頁面,無法看到當前頁面的 URL 信息
inline 模式
- 需要添加 –inline 配置參數
- 提示信息在控制台中和瀏覽器的console中顯示
- 頁面的 URL 改變,可以在瀏覽器地址欄看見
接下來啟動 webpack-dev-server:
$ webpack-dev-server --inline --hot --content-base ./build/n
--hot 參數就是熱載入,即在不刷新瀏覽器的條件下,應用最新的代碼更新。在瀏覽器中可能看到這樣的輸出:
[HMR] Waiting for update signal from WDS...n[WDS] Hot Module Replacement enabled.n
--content-base ./ 參數表示將當前目錄作為 server 根目錄。命令啟動後,會在 8080 埠創建一個 HTTP 服務,通過訪問 http://localhost:8080/index.html 就可以訪問我們的項目了,並且修改了項目中的代碼後,瀏覽器會自動刷新並實現熱載入。
當然,命令行輸入這麼長,還是不太方便,所以還有一種更簡單的方式,在 package.json 中配置 webpack develop server:
// Existing Code ....n"scripts": {n "dev": "webpack-dev-server --inline --hot --content-base ./build/"n }n
然後通過 npm start dev 來啟動即可。
5. 添加一個新的組件
在 app 目錄中新建一個 AwesomeComponent.jsx 文件,並添加如下代碼:
import React, { Component } from react;nnclass AwesomeComponent extends Component {n constructor(props) {n super(props);n this.state = {n likesCount: 0n };n this.onLike = this.onLike.bind(this);n }nnn onLike() {n let newLikesCount = this.state.likesCount + 1;n this.setState({n likesCount: newLikesCountn });n }nnn render() {n return (n <div>n Likes: <span>{this.state.likesCount}</span>n <div>n <button onClick={this.onLike}>Like Me</button>n </div>n </div>n );n }n}nnnexport default AwesomeComponent;n
然後修改 index.jsx:
// ...nimport AwesomeComponent from ./AwesomeComponent.jsx;n// ...nclass App extends React.Component {n render () {n return (n <div>n <p> Hello React!</p>n <AwesomeComponent />n </div>n );n }n}nn// ...n
完。
推薦閱讀:
※Build Your Own React:第一次渲染
※React異常處理
※React Loadable 簡介
※10 個打造 React.js App 的最佳 UI 框架
※React 初窺:JSX 詳解