webpack react antd遇到的問題

  1. 初始化項(xiàng)目文件
  2. 加入antd
  3. 問題
  4. 總結(jié)
  5. 相關(guān)鏈接

最近這兩天把redux切換到了redux-saga之后,就想學(xué)習(xí)學(xué)習(xí)webpack. 咋說呢,這個(gè)東西被大家說的神乎其神,所以在我的認(rèn)知里還是蠻神秘的(新手的感覺而已,不喜勿噴).
今天上午把webpack看了下,有個(gè)大致的方向,就想配一個(gè)簡(jiǎn)單的,可以本地開發(fā)運(yùn)行的react(github custom_react)應(yīng)用.

初始化項(xiàng)目文件

  • package.json
    這個(gè)很簡(jiǎn)單,直接npm init就好. npm?

  • index.html
    我們新建一個(gè)index.html.

mkdir -p public
cd public
touch index.html

index.html內(nèi)容如下:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="theme-color" content="#000000">
    <title>custom</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
  • index.js
    開始這個(gè)js文件之前,我們需要使用相關(guān)的包
npm i --save react react-dom

然后我們的index.js是這樣的.

import ReactDOM from 'react-dom';
import App from './App';
import React from 'react'

ReactDOM.render(
    <App/>,
    document.getElementById('root')
);
  • App.js
    然后我們的App.js是這樣的.
import React, { Component } from 'react';

class App extends Component {
    render() {
        return (
            <h1>Hello Word</h1>
        )
    }

}

export default App
  • webpack.config.js
    同樣,在開始新建文件之前, 先安裝相關(guān)的包.
npm i --save webpack 或者 npm i webpack -g
npm install --save-dev webpack-dev-server // webpack的服務(wù)器
npm install --save-dev babel-core babel-loader  babel-preset-es2015 babel-preset-react babel-preset-stage-0
npm install --save-dev css-loader postcss-loader style-loader
npm install --save-dev autoprefixer

-g是全局安裝,執(zhí)行打包命令的時(shí)候直接webpack就好了.如果是--save安裝,就需要打包的時(shí)候使用 node_modules/.bin/webpack.在這里,我們安裝了webpack以及bable家族.(利用bable去轉(zhuǎn)換es6,去轉(zhuǎn)換jsx, ...).還有css相關(guān)的處理.

// webpack.config.js
var webpack = require('webpack');
var path = require('path')
module.exports = {
    entry: ['webpack/hot/dev-server', __dirname + "/index.js"],
    output: {
        path: __dirname + "/build",
        filename: "bundle.js",
        publicPath: "/assets/"
    },
    module: {
        loaders: [
            {
                test: /\.(js|jsx)$/, // test 匹配js和jsx)
                exclude: /node_modules/, //屏蔽不需要處理的文件
                loader: 'babel-loader',
                query: {
                    "presets": [
                        "react",
                        "es2015",
                        "stage-0"
                    ],
                }
            },
            {
                test: /\.css$/,
                loader: 'style-loader!css-loader?importLoaders=1',
            }
        ]
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(), //模塊的熱替換插件
    ],
    devServer: {
        contentBase: path.join(__dirname, "/public"), // index.html的位置
        historyApiFallback: true,
        inline: true,
        port: 3008, //這里寫你自己想要的啟動(dòng)端口
        compress: true,
        progress: true,
    }
}

好的,目前我們的webpack.config.js大致就是這樣,現(xiàn)在我們還需要修改package.json去運(yùn)行他.

// package.json
. . .
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "start": "webpack-dev-server"
  },
. . . 

現(xiàn)在我們可以在終端輸入命令嘗試.

npm run build //會(huì)去構(gòu)建配置,會(huì)有文件output.
npm start // 啟動(dòng)項(xiàng)目.

請(qǐng)確定我們的index.html引入了文件.

. . .
<body>
    <div id="root"></div>
    <script src="/assets/bundle.js"></script>
 </body>
. . .

不出意外,正常啟動(dòng),輸入localhost:3008之后,就會(huì)出現(xiàn)Hello Word!

加入antd

首先安裝相關(guān)的包

npm install antd --save
npm install babel-plugin-import --save-dev

然后在我們的webpack.config.js配置使用.

// webpack.config.js
. . .
query: {
                    "presets": [
                        "react",
                        "es2015",
                        "stage-0"
                    ],
                    plugins: [
                        ["import", {
                            libraryName: "antd",
                            style: "css"
                        }],
                    ]
                }
. . .

然后我們嘗試是否引入了antd.

  • 修改App.js
import React, { Component } from 'react';
import MainLayout from './src/MainLayout'

class App extends Component {
    render() {
        return (
            <MainLayout />
        )
    }

}

export default App
  • src/MainLayout.js
import React from 'react'
import { Layout, Menu, Breadcrumb, Icon } from 'antd';
const {Header, Content, Footer, Sider} = Layout;
const SubMenu = Menu.SubMenu;


class SiderDemo extends React.Component {
    state = {
        collapsed: false,
    }


    onCollapse = (collapsed) => {
        console.log(collapsed);
        this.setState({
            collapsed
        });
    }

    render() {
        return (
            <Layout style={{
                minHeight: '100vh'
            }}>
        <Sider
            collapsible
            collapsed={this.state.collapsed}
            onCollapse={this.onCollapse}
            >
          <div className="logo" />
          <Menu theme="dark" defaultSelectedKeys={['1']} mode="inline">
            <Menu.Item key="1">
              <Icon type="pie-chart" />
              <span>Option 1</span>
            </Menu.Item>
            <Menu.Item key="2">
              <Icon type="desktop" />
              <span>Option 2</span>
            </Menu.Item>
            <SubMenu
            key="sub1"
            title={<span><Icon type="user" /><span>User</span></span>}
            >
              <Menu.Item key="3">Tom</Menu.Item>
              <Menu.Item key="4">Bill</Menu.Item>
              <Menu.Item key="5">Alex</Menu.Item>
            </SubMenu>
            <SubMenu
            key="sub2"
            title={<span><Icon type="team" /><span>Team</span></span>}
            >
              <Menu.Item key="6">Team 1</Menu.Item>
              <Menu.Item key="8">Team 2</Menu.Item>
            </SubMenu>
            <Menu.Item key="9">
              <Icon type="file" />
              <span>File</span>
            </Menu.Item>
          </Menu>
        </Sider>
        <Layout>
          <Header style={{
                background: '#fff',
                padding: 0
            }} />
          <Content style={{
                margin: '0 16px'
            }}>
            <Breadcrumb style={{
                margin: '16px 0'
            }}>
              <Breadcrumb.Item>User</Breadcrumb.Item>
              <Breadcrumb.Item>Bill</Breadcrumb.Item>
            </Breadcrumb>
            <div style={{
                padding: 24,
                background: '#fff',
                minHeight: 360
            }}>
              Bill is a cat.
            </div>
          </Content>
          <Footer style={{
                textAlign: 'center'
            }}>
            Ant Design ?2016 Created by Ant UED
          </Footer>
        </Layout>
      </Layout>
        );
    }
}

export default SiderDemo

然后我們npm start一下,應(yīng)該是可以的了.

問題

怎么說呢,其實(shí)這些東西都是可以找到的,但是因?yàn)榘姹镜仍?難免會(huì)碰到一些小問題,那么我今天就凱說這半天我碰到的兩個(gè)問題.

  • Cannot GET /

這個(gè)問題倒是還好,被我猜測(cè)到了,是沒有運(yùn)行起來,應(yīng)該是說沒有找到index.html文件,所以把服務(wù)器當(dāng)前工作地址指向index.html坐在的文件夾下. 我們這里是在public文件夾下.

  • 頁(yè)面空白

頁(yè)面空白,不顯示Hello Word. 打開瀏覽器console發(fā)現(xiàn)是沒有找到對(duì)應(yīng)的bundle.js. 去sources里也沒有對(duì)應(yīng)的js文件.這個(gè)也有人碰到過,看這個(gè)issue
所以,我們需要指定一下publicPath, 否則頁(yè)面是找不到的.

  • es6語(yǔ)法報(bào)錯(cuò)

出現(xiàn)Module Build Faild相關(guān)的錯(cuò)誤.就是es6的語(yǔ)法錯(cuò)誤.找了很久都不行,最后在一篇外文里看到了解決辦法(最后會(huì)放上鏈接).加上stage-0的支持就好了.

總結(jié)

目前碰到的問題就是那么多,而且這個(gè)文章只適合一點(diǎn)點(diǎn)也不懂的朋友,還有很多東西需要去處理,比如生產(chǎn)模式,性能優(yōu)化..,所以,還得一起繼續(xù)學(xué)習(xí).

相關(guān)鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撇他,一起剝皮案震驚了整個(gè)濱河市演痒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛉艾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異府适,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肺樟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門檐春,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人么伯,你說我怎么就攤上這事疟暖。” “怎么了田柔?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵俐巴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我硬爆,道長(zhǎng)欣舵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任缀磕,我火速辦了婚禮缘圈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜蚕。我一直安慰自己糟把,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布牲剃。 她就那樣靜靜地躺著遣疯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凿傅。 梳的紋絲不亂的頭發(fā)上缠犀,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音狭归,去河邊找鬼夭坪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛过椎,可吹牛的內(nèi)容都是我干的室梅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亡鼠!你這毒婦竟也來了赏殃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤间涵,失蹤者是張志新(化名)和其女友劉穎仁热,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾哩,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抗蠢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了思劳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迅矛。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖潜叛,靈堂內(nèi)的尸體忽然破棺而出秽褒,到底是詐尸還是另有隱情,我是刑警寧澤威兜,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布销斟,位于F島的核電站,受9級(jí)特大地震影響椒舵,放射性物質(zhì)發(fā)生泄漏蚂踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一笔宿、第九天 我趴在偏房一處隱蔽的房頂上張望悴势。 院中可真熱鬧,春花似錦措伐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粪躬,卻和暖如春担败,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镰官。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工提前, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泳唠。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓狈网,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拓哺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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