成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Webpack 和 React 實(shí)戰(zhàn)

gxyz / 1529人閱讀

摘要:首先安裝然后在的里面加入和兩個(gè)命令在建立一個(gè)服務(wù)器為你的代碼創(chuàng)建源地址。更新使用語(yǔ)法編寫(xiě)修改加載器的配置方法將添加文件改為在中配置加載器的配置方法接下來(lái)需要配置,告訴我們使用了和插件。

TL;DR
$ git clone https://github.com/nodejh/start-react-with-webpack react-sample
$ cd react-sample && npm install
$ npm run dev

然后打開(kāi)瀏覽器輸入 http://localhost:8080,并嘗試隨意修改一下 app 目錄里面的代碼,就能看到效果了。

為了避免包版本問(wèn)題導(dǎo)致程序不能運(yùn)行,根目錄下有一個(gè) npm-shrinkwrap.json 文件,這里面所有包的版本都是固定的。 npm install 時(shí)首先會(huì)檢查在根目錄下有沒(méi)有 npm-shrinkwrap.json,如果 shrinkwrap 文件存在的話,npm 會(huì)使用它(而不是 package.json)來(lái)確定安裝的各個(gè)包的版本號(hào)信息。

1. 安裝并配置 Webpack

首先創(chuàng)建并初始化一個(gè)項(xiàng)目目錄:

$ mkdir react-sample && cd react-sample
$ npm init

安裝 webpack

$ npm i webpack --save-dev

然后配置 webpack.config.js

# 創(chuàng)建一個(gè) webpack.config.js 文件
$ touch webpack.config.js

在該文件中加入下面的內(nèi)容:

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`, // 文件打包的入口點(diǎn)
  output: {
    path: BUILD_DIR, // 輸出目錄的絕對(duì)路徑
    filename: "bundle.js", // 輸出的每個(gè)包的相對(duì)路徑
  },
  resolve: {
    extensions: ["", ".js", ".jsx"], // 開(kāi)啟后綴名的自動(dòng)補(bǔ)全
  },
};

module.exports = config;

這是一個(gè)最基本的 webpack 配置文件。

接下來(lái)在 build/ 目錄中創(chuàng)建一個(gè) index.html 文件:


  
    
    Start React with Webpack
  
  
    
2. 配置加載器 babel-loader

加載器是把一個(gè)資源文件作為入?yún)⑥D(zhuǎn)換為另一個(gè)資源文件的 node.js 函數(shù)。

由于我們寫(xiě) React 的時(shí)候使用的是 JSX 語(yǔ)法和 ES6 語(yǔ)法,而瀏覽器并不完全支持它們。所以需要使用 babel-loader 來(lái)讓 webpack 加載 JSX 和 ES6 的文件。

babel-loader 的主要作用如下圖:

安裝依賴包:

$ npm i babel-core babel-loader babel-preset-es2015 babel-preset-react --save-dev

babel-preset-es2015 是轉(zhuǎn)換 ES6 的包;babel-preset-react 是轉(zhuǎn)換 JSX 的包。

接下來(lái)需要修改 webpack.config.js

// 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

app 目錄下新建一個(gè) index.jsx 文件,然后將下面的內(nèi)容添加到 index.jsx 中:

import React from "react";
import {render} from "react-dom";

class App extends React.Component {
  render () {
    return 

Hello React!

; } } render(, document.getElementById("app"));

這個(gè)時(shí)候,執(zhí)行下面的命令打包:

webpack -w

-w 參數(shù)表示持續(xù)監(jiān)測(cè)項(xiàng)目目錄,如果文件發(fā)生修改,則重新打包。

打包完成后,將 build/index.html 用瀏覽器打開(kāi),就能看到 Hello React!,如下:

4. 自動(dòng)刷新和熱加載

懶是第一生產(chǎn)力。每次寫(xiě)完代碼,都要重新打包,重新刷新瀏覽器才能看到結(jié)果,顯然很麻煩。

那有沒(méi)有能夠自動(dòng)刷新瀏覽器的方法呢?當(dāng)然有,這個(gè)時(shí)候就需要 webpack-dev-server 這個(gè)包。

$ npm install webpack-dev-server -g

webpack-dev-server 提供了兩種自動(dòng)刷新模式:

Iframe 模式

不需要額外配置,只用修改路徑

應(yīng)用被嵌入了一個(gè) iframe 內(nèi)部,頁(yè)面頂部可以展示打包進(jìn)度信息

因?yàn)?Iframe 的關(guān)系,如果應(yīng)用有多個(gè)頁(yè)面,無(wú)法看到當(dāng)前頁(yè)面的 URL 信息

inline 模式

需要添加 --inline 配置參數(shù)

提示信息在控制臺(tái)中和瀏覽器的console中顯示

頁(yè)面的 URL 改變,可以在瀏覽器地址欄看見(jiàn)

接下來(lái)啟動(dòng) webpack-dev-server:

$ webpack-dev-server --inline --hot --content-base ./build/

--hot 參數(shù)就是熱加載,即在不刷新瀏覽器的條件下,應(yīng)用最新的代碼更新。在瀏覽器中可能看到這樣的輸出:

[HMR] Waiting for update signal from WDS...
[WDS] Hot Module Replacement enabled.

--content-base ./ 參數(shù)表示將當(dāng)前目錄作為 server 根目錄。命令啟動(dòng)后,會(huì)在 8080 端口創(chuàng)建一個(gè) HTTP 服務(wù),通過(guò)訪問(wèn) http://localhost:8080/index.html 就可以訪問(wèn)我們的項(xiàng)目了,并且修改了項(xiàng)目中的代碼后,瀏覽器會(huì)自動(dòng)刷新并實(shí)現(xiàn)熱加載。

當(dāng)然,命令行輸入這么長(zhǎng),還是不太方便,所以還有一種更簡(jiǎn)單的方式,在 package.json 中配置 webpack develop server:

// Existing Code ....
"scripts": {
    "dev": "webpack-dev-server --inline --hot --content-base ./build/"
  }

然后通過(guò) npm start dev 來(lái)啟動(dòng)即可。

5. 添加一個(gè)新的組件

app 目錄中新建一個(gè) AwesomeComponent.jsx 文件,并添加如下代碼:

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 (
      
Likes: {this.state.likesCount}
); } } export default AwesomeComponent;

然后修改 index.jsx

// ...
import AwesomeComponent from "./AwesomeComponent.jsx";
// ...
class App extends React.Component {
  render () {
    return (
      

Hello React!

); } } // ...

UPDATE 2016.10.15

更新 webpack-dev-server 的配置方法

設(shè)置 webpack-dev-server (old)

上面我們直接通過(guò)瀏覽器瀏覽的 html 文件,接下來(lái)我們需要利用 webpack-dev-server 來(lái)創(chuàng)建一個(gè) HTTP Server。

首先安裝 webpack-dev-server

$ npm i webpack-dev-server --save-dev

然后在 package.jsonscript 里面加入 builddev 兩個(gè)命令:

{
  "scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server --devtool eval --progress --colors --hot --content-base build"
  }
}

webpack-dev-server - 在 localhost:8080 建立一個(gè) Web 服務(wù)器

--devtool eval - 為你的代碼創(chuàng)建源地址。當(dāng)有任何報(bào)錯(cuò)的時(shí)候可以讓你更加精確地定位到文件和行號(hào)

--progress - 顯示合并代碼進(jìn)度

--colors - 命令行中顯示顏色!

--content-base build - 指向設(shè)置的輸出目錄

然后就可以使用 npm run dev 的命令來(lái)啟動(dòng)項(xiàng)目:

$ npm run dev

在瀏覽器地址欄輸入 localhost:8080 即可看到頁(yè)面。

如果需要瀏覽器自動(dòng)刷新,將 webpack.config.js 中的 entry: APP_DIR + "/index.jsx 改為下面這樣:

entry: [
   "webpack-dev-server/client?http://localhost:8080",
   "webpack/hot/dev-server",
    APP_DIR + "/index.jsx"
]

這樣的話,每次當(dāng)代碼發(fā)生變化之后,webpack 會(huì)自動(dòng)重新打包,瀏覽器也會(huì)自動(dòng)刷新頁(yè)面。

2016.11.19 更新

使用 ES6 語(yǔ)法編寫(xiě) webpack.config.js

修改 babel-loader 加載器的配置方法:將添加 .babelrc 文件改為在 webpack.config.js 中配置

?:webpack-dev-server --inline --hot --content-base ./build/ ?? webpack-dev-server --inline --hot --content-base ./build/

babel-loader 加載器的配置方法(old)

接下來(lái)需要配置 babel-loader,告訴 webpack 我們使用了 ES6 和 JSX 插件。先通過(guò)touch .babelrc 創(chuàng)建一個(gè)名為 .babelrc 的配置文件。然后加入下面的代碼:

{
  "presets" : ["es2015", "react"]
}

然后再修改 webpack.config.js,使 webpack 在打包的時(shí)候,使用 babel-loader:

// Existing Code ....
var config = {
  // Existing Code ....
  module: {
    loaders : [
      {
        test : /.jsx?/,
        include : APP_DIR,
        loader : "babel"
      }
    ]
  }
}
自動(dòng)刷新和熱加在的配置(old, wrong)

當(dāng)然,命令行輸入這么長(zhǎng),還是不太方便,所以還有一種更簡(jiǎn)單的方式,直接在 webpack.cofig.js 中配置 webpack develop server:

{
  entry: {
    // ...
  },
  // ...
  devServer: {
    hot: true,
    inline: true
  }
}

Github Issue: https://github.com/nodejh/nodejh.github.io/issues/12

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91265.html

相關(guān)文章

  • React項(xiàng)目實(shí)戰(zhàn):環(huán)境搭建

    摘要:官方文檔中文翻譯構(gòu)建用戶界面的庫(kù)。官方文檔建議學(xué)習(xí)時(shí)以官方文檔為準(zhǔn),中文翻譯或者第三方作者的教程可以幫助你理清思路會(huì)用到的重要知識(shí)點(diǎn)我也會(huì)進(jìn)行簡(jiǎn)明的解釋?zhuān)缬龅藉e(cuò)誤或者不理解的內(nèi)容,歡迎實(shí)時(shí)指出。 前言 前面提到前端大統(tǒng)一的概念,如果感興趣,歡迎說(shuō)說(shuō)自己的看法,點(diǎn)擊前往。Web前端框架層出不窮,不可能面面俱到,這里給個(gè)小建議: 如果對(duì)Weex App感興趣,應(yīng)該選擇vue框架; 如果...

    cnio 評(píng)論0 收藏0
  • React項(xiàng)目實(shí)戰(zhàn):環(huán)境搭建

    摘要:官方文檔中文翻譯構(gòu)建用戶界面的庫(kù)。官方文檔建議學(xué)習(xí)時(shí)以官方文檔為準(zhǔn),中文翻譯或者第三方作者的教程可以幫助你理清思路會(huì)用到的重要知識(shí)點(diǎn)我也會(huì)進(jìn)行簡(jiǎn)明的解釋?zhuān)缬龅藉e(cuò)誤或者不理解的內(nèi)容,歡迎實(shí)時(shí)指出。 前言 前面提到前端大統(tǒng)一的概念,如果感興趣,歡迎說(shuō)說(shuō)自己的看法,點(diǎn)擊前往。Web前端框架層出不窮,不可能面面俱到,這里給個(gè)小建議: 如果對(duì)Weex App感興趣,應(yīng)該選擇vue框架; 如果...

    GHOST_349178 評(píng)論0 收藏0
  • React+dva+webpack+antd-mobile 實(shí)戰(zhàn)分享(一)

    摘要:再看本篇文章之前,本人還是建議想入坑的童鞋可以選有來(lái)創(chuàng)建的項(xiàng)目,因?yàn)楝F(xiàn)在和還不成熟,坑相對(duì)要多一些,當(dāng)然如果你已經(jīng)做好跳坑的準(zhǔn)備,那么請(qǐng)繼續(xù)往下走本文適合對(duì)有一定了解的人。 再看本篇文章之前,本人還是建議想入坑react的童鞋可以選有create-react-app來(lái)創(chuàng)建react的項(xiàng)目,因?yàn)楝F(xiàn)在dva和roadhog還不成熟,坑相對(duì)要多一些,當(dāng)然如果你已經(jīng)做好跳坑的準(zhǔn)備,那么請(qǐng)繼續(xù)往...

    ziwenxie 評(píng)論0 收藏0
  • React+ Redux + React-route + Axios 實(shí)戰(zhàn),很適合進(jìn)階

    摘要:前言前段時(shí)間學(xué)習(xí)完了的基礎(chǔ)自己網(wǎng)上找了一些實(shí)戰(zhàn)項(xiàng)目做了幾個(gè)感覺(jué)項(xiàng)目不是很全面就想做一個(gè)完整的項(xiàng)目來(lái)提升自己的水平以前學(xué)習(xí)的時(shí)候就看過(guò)大神的項(xiàng)目所以自己打算用重寫(xiě)它后端數(shù)據(jù)還是用實(shí)在沒(méi)有精力擼后端感謝大神該項(xiàng)目是餓了么目前開(kāi)發(fā)了登錄注冊(cè)購(gòu) 前言 前段時(shí)間學(xué)習(xí)完了React的基礎(chǔ),自己網(wǎng)上找了一些實(shí)戰(zhàn)項(xiàng)目,做了幾個(gè)感覺(jué)項(xiàng)目不是很全面,就想做一個(gè)完整的項(xiàng)目來(lái)提升自己的React水平.以前學(xué)習(xí)...

    phpmatt 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<