基于React+Webpack+ant-design开发的网站

一、什么是webpack?

WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。
我学webpack是看一个大牛写的博客,特别好,这里推荐下http://www.jianshu.com/p/42e11515c10f

二、什么是Ant Design

Ant Design是蚂蚁金服体验技术部做的前端 UI 基于react的组件库。
官网:https://ant.design/docs/react/getting-started-cn

三、创建项目

安装webpack

  npm install -g webpack

创建个文件夹demo,在该目录下打开命令提示符,输入

npm init

然后一直回车回车就好了,这时里的目录里出现了package.json
打开package.json 复制底下代码(个人总结的常用的模块,其他若你们项目需要的就自行安装)

{
  "name": "你的项目名",
  "version": "1.0.0",
  "description": "项目描述",
  "main": "app/index.js",
  "scripts": {
    "test": "",
    "start": "node server",
    "build": "webpack --config ./webpack.production.config.js --progress --profile --colors",
    "eslint": "eslint ."
  },
  "keywords": [
    "webpack",
    "react",
    "web"
  ],
  "author": "ouxiaojie",
  "license": "MIT",
  "dependencies": {
    "react": "^16.0.0",
    "react-dom": "^16.0.0",
    "react-hot-loader": "^3.0.0",
    "react-router": "^4.2.0"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.5",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-react-transform": "^3.0.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.7",
    "extract-text-webpack-plugin": "^3.0.1",
    "file-loader": "^1.1.5",
    "html-webpack-plugin": "^2.30.1",
    "json-loader": "^0.5.7",
    "less": "^3.0.0-alpha.3",
    "less-loader": "^4.0.5",
    "style-loader": "^0.19.0",
    "url-loader": "^0.6.2",
    "webpack": "^3.7.1",
    "webpack-dev-server": "^2.9.1"
  }
}

然后在命令提示符里输入安装各种模块

npm install
图片.png

在文件夹demo里创建以下文件

图片.png

在webpack.config.js文件里复制以下代码

'use strict';

var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    devtool: 'eval-source-map',
    entry: [
        'webpack-dev-server/client?http://localhost:3000',
        'webpack/hot/only-dev-server',
        'react-hot-loader/patch',
        // path.join(__dirname, 'app/final/index.js')
        path.join(__dirname, 'app/index.js')
    ],
    output: {
        path: path.join(__dirname, './dist/'),
        filename: '[name].js',
        publicPath: '/'
    },
    plugins: [
        new HtmlWebpackPlugin({
            // template: './app/index.tpl.html',
            template: './index.tpl.html',
            inject: 'body',
            filename: './index.html'
        }),
        new webpack.optimize.OccurrenceOrderPlugin(),
        new webpack.HotModuleReplacementPlugin(),
        //new webpack.NoErrorsPlugin(),
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify('development')
        })
    ],
    module: {
        // resolve: {
        //     extensions: ['', '.js', '.json']
        // },
        loaders: [{
            test: /\.js$/,
            exclude: /node_modules/,
            loader: "babel-loader",
            query: {
                presets: ['react', 'es2015']
            }
        }, {
            test: /\.json?$/,
            loader: 'json'
        }, {
            test: /\.css$/,
            loader: "style!css"
        }, {
            test: /\.less/,
            loader: 'style-loader!css-loader!less-loader'
        }, {
          test: /\.(png|jpg|gif)$/,
          loader: 'url-loader?limit=8192',
        }
        ]
    }
};

在server.js文件里复制以下代码

var webpack = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var config = require('./webpack.config');

new WebpackDevServer(webpack(config), {
    publicPath: config.output.publicPath,
    hot: true,
    historyApiFallback: true,
    // It suppress error shown in console, so it has to be set to false.
    quiet: false,
    // It suppress everything except error, so it has to be set to false as well
    // to see success build.
    noInfo: false,
    stats: {
        // Config for minimal console.log mess.
        assets: false,
        colors: true,
        version: false,
        hash: false,
        timings: false,
        chunks: false,
        chunkModules: false
    }
}).listen(3000, 'localhost', function (err) {
    if (err) {
        console.log(err);
    }

    console.log('Listening at localhost:3000');
});

webpack的自动化打包,热更新就配置好啦!代码有疑问的就在上面我推荐的大牛写的webpack简书里找答案啦~

然后在index.tpl.html里输入:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="root"></div>
</body>
</html>

在app文件夹里新建两个文件

图片.png

在index.js文件里输入:

import React from 'react';
import { render } from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import Root from './root'

render(
    <AppContainer>
        <Root />
    </AppContainer>,
    document.getElementById('root')
);

if(module.hot){
    module.hot.accept('./root',() =>{
        const NewRoot = require('./root').default;
        render(
            <AppContainer>
                <NewRoot />
            </AppContainer>,
            document.getElementById('root')
        );
    });
}

在root.js里输入:

import React, { Component } from 'react';
export default class Root extends Component {
    render() {
        return (
            <div>Hello 张艺兴~</div>
        );
    }
};

保存文件,在命令提示符输入

npm run build
图片.png

看到successfully就打包成功啦~
然后在浏览器中输入

http://localhost:3000/

能看到

图片.png

接着 安装antd 组件

npm install antd --save-dev 

接着安装以下插件,这样你用antd的组件时就不用手动写import啦~

npm install babel-plugin-import --save-dev  // 此插件安装前,必须先安装 file-loader
npm install babel-plugin-transform-runtime --save-dev 

然后在webpack.config.js里添加相应的loader

loaders: [{
            test: /\.js$/,
            exclude: /node_modules/,
            loader: "babel-loader",
            query: {
                presets: ['react', 'es2015'],
                plugins: [//修改这里的
                    ["import", {libraryName: "antd", style: "css"}]//修改这里的
                ] //修改这里的
            }
        }, 

配置好了,就可以测试啦
把root.js里的代码修改为

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { DatePicker } from 'antd';
export default class Root extends Component {
    render() {
        return (
             <DatePicker />
        );
    }
};

然后保存文件,在命令提示符输入

npm run build

在浏览器的http://localhost:3000/中看到

图片.png

这样就把React和Webpack和ant-design的各种配置都搭好了,可以开始写代码了~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容