webpack手動(dòng)配置React開(kāi)發(fā)環(huán)境

React提供了create-react-app的快速構(gòu)建工具, 但作為一個(gè)專(zhuān)業(yè)的程序員(老司機(jī)), 面對(duì)復(fù)雜的項(xiàng)目, 入門(mén)級(jí)的構(gòu)建工具, 是遠(yuǎn)遠(yuǎn)不夠的, 我們這里從零開(kāi)始, 用webpack, 手動(dòng)配置一個(gè)獨(dú)立的React開(kāi)發(fā)環(huán)境, 開(kāi)發(fā)環(huán)境完成后, 支持自動(dòng)構(gòu)建, 自動(dòng)刷新, sass語(yǔ)法 等功能...

1. 首先用npm初始化環(huán)境

mkdir react-webpack-demo
cd react-webpack-demo
npm init -y
  • 安裝相關(guān)軟件包
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
# 識(shí)別html轉(zhuǎn)換為jsx語(yǔ)法
npm install babel-preset-react -D

2.添加對(duì)html靜態(tài)文件的支持

  • 在根目錄下新建文件夾src, 在src內(nèi)加入index.html index.js
  • 在根目錄下新建webpack.config.js
  • webpack.config.js中加入如下配置
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 負(fù)責(zé)將html文檔虛擬到根目錄下
let htmlWebpackPlugin = new HtmlWebpackPlugin({
    // 虛擬的html文件名 index.html
    filename: 'index.html',
    // 虛擬html的模板為 src下的index.html
    template: path.resolve(__dirname, './src/index.html')
})

module.exports = {
    // 開(kāi)發(fā)模式
    mode: 'development',
    // 配置入口文件
    entry: './src/index.js',
    // 出口文件目錄為根目錄下dist, 輸出的文件名為main
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'main.js'
    },
    // 配置開(kāi)發(fā)服務(wù)器, 并配置自動(dòng)刷新
    devServer: {
        // 根目錄下dist為基本目錄
        contentBase: path.join(__dirname, 'dist'),
        // 自動(dòng)壓縮代碼
        compress: true,
        // 服務(wù)端口為1208
        port: 1208,
        // 自動(dòng)打開(kāi)瀏覽器
        open: true
    },
    // 裝載虛擬目錄插件
    plugins: [htmlWebpackPlugin],
}
  • package.json內(nèi)scripts中添加"dev": "webpack-dev-server"
  • src/index.html中添加內(nèi)容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>react-webpack-demo</title>
</head>
<body>
    react-webpack-demo
    <hr>
    高堂明鏡悲白發(fā), 朝如青絲暮成雪
</body>
</html>
  • 在命令行內(nèi)運(yùn)行npm run dev, 即可看到剛添加的index.html內(nèi)容
  • 接下來(lái)我們配置babel對(duì)es6語(yǔ)法的支持, 以及對(duì)jsx語(yǔ)法的支持

3. 添加對(duì)js高級(jí)語(yǔ)法的支持

  • 在項(xiàng)目根目錄, 添加.babelrc配置文件 presets為語(yǔ)法配置,plugins為插件配置
{
    "presets": ["env", "stage-0", "react"],
    "plugins": ["transform-runtime"]
}
  • 在webpack.config.js中添加module字段, 進(jìn)行插件loader配置
// webpack.config.js
module.exports = {
    ...
    // 配置loader
    module: {
        // 根據(jù)文件后綴匹配規(guī)則
        rules: [
            // 配置js/jsx語(yǔ)法解析
            { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }
        ]
    }
};
  • src/index.html中加入id為root的div節(jié)點(diǎn)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>react-webpack-demo</title>
</head>
<body>

    react-webpack-demo
    <hr>
    高堂明鏡悲白發(fā), 朝如青絲暮成雪
    <hr>
    <div id="root"></div>
</body>
</html>
  • src/index.js中加入包含jsx語(yǔ)法的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'))

附錄: 添加對(duì)sass語(yǔ)法的支持(沒(méi)興趣可以跳過(guò))

  • 安裝sass相關(guān)的loader
npm install style-loader css-loader node-sass sass-loader -D
  • 在webpack.config.js內(nèi)新增規(guī)則
// 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內(nèi)新增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

最終效果:

文中相關(guān)資源鏈接:https://pan.baidu.com/s/1zGRtjltIcqVVJRFNHFhxAw 密碼:6lwm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揩悄,一起剝皮案震驚了整個(gè)濱河市溜宽,隨后出現(xiàn)的幾起案子两残,更是在濱河造成了極大的恐慌蟹地,老刑警劉巖颅筋,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹏往,死亡現(xiàn)場(chǎng)離奇詭異蓖租,居然都是意外死亡旱物,警方通過(guò)查閱死者的電腦和手機(jī)絮姆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)醉冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人篙悯,你說(shuō)我怎么就攤上這事蚁阳。” “怎么了鸽照?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵螺捐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)定血,這世上最難降的妖魔是什么赔癌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮澜沟,結(jié)果婚禮上灾票,老公的妹妹穿的比我還像新娘。我一直安慰自己茫虽,他們只是感情好刊苍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著席噩,像睡著了一般班缰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悼枢,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天埠忘,我揣著相機(jī)與錄音,去河邊找鬼馒索。 笑死莹妒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绰上。 我是一名探鬼主播旨怠,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜈块!你這毒婦竟也來(lái)了鉴腻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤百揭,失蹤者是張志新(化名)和其女友劉穎爽哎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體器一,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课锌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祈秕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渺贤。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖请毛,靈堂內(nèi)的尸體忽然破棺而出志鞍,到底是詐尸還是另有隱情,我是刑警寧澤方仿,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布固棚,位于F島的核電站街州,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玻孟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一鳍征、第九天 我趴在偏房一處隱蔽的房頂上張望黍翎。 院中可真熱鬧,春花似錦艳丛、人聲如沸匣掸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碰酝。三九已至,卻和暖如春戴差,著一層夾襖步出監(jiān)牢的瞬間送爸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工暖释, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袭厂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓球匕,卻偏偏與公主長(zhǎng)得像纹磺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亮曹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容