搭建react项目

依附网站:https://github.com/theJian/build-a-hn-front-page
第一步:初始化项目 npm init
安装 webpack

npm install --save-dev webpack@3

Q: 什么时候用--save-dev,什么时候用--save

A: --save-dev 是你开发时候依赖的东西,--save 是你发布之后还依赖的东西。看这里

第二步:然后在项目的根目录下建一个名为webpack.dev.config.js(webpack开发配置文件)

const path = require('path');
module.exports = {
    /*入口*/
    entry: path.join(__dirname, 'src/index.js'),
    /*输出到dist文件夹,输出文件名字为bundle.js*/
    output: {
        path: path.join(__dirname, './dist'),
        filename: 'bundle.js'
    }
}

然后在项目根目录新建一个src文件夹,建立一个index.js 并写入
document.getElementById('app').innerHTML = "Webpack works",然后再运行命令 webpack --config webpack.dev.config.js
我们可以看到生成了dist文件夹和bundle.js
第三步:在dist文件夹下面新建一个index.html 在里面写入

<!doctype html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Document</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/javascript" src="./bundle.js" charset="utf-8"></script>
  </body>
</html>

然后再直接点击index.html 就可以看到
index.html

把入口文件 index.js 经过处理之后,生成 bundle.js。就这么简单。

babel

Babel 把用最新标准编写的 JavaScript 代码向下编译成可以在今天随处可用的版本。 这一过程叫做“源码到源码”编译, 也被称为转换编译。

通俗的说,就是我们可以用ES6, ES7等来编写代码,Babel会把他们统统转为ES5。

npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0
新建babel配置文件.babelrc,并且在里面写入

 {
   "presets": [
     "es2015",
     "react",
     "stage-0"
   ],
   "plugins": []
 }

然后修改webpack.dev.config.js,增加babel-loader!

 /*src文件夹下面的以.js结尾的文件,要使用babel解析*/
 /*cacheDirectory是用来缓存编译结果,下次编译加速*/
 module: {
     rules: [{
         test: /\.js$/,
         use: ['babel-loader?cacheDirectory=true'],
         include: path.join(__dirname, 'src')
     }]
 }

现在可以简单的做一个测试,看是否能够将es6的写法转成es5,修改src/index.js

 var func = str => {
     document.getElementById('app').innerHTML = str;
 };
 func('我现在在使用Babel!');

此时别忘记了再实行一个打包命令 webpack --config webpack.dev.config.js
然后会报错

image.png

原因竟然是因为babel-loader的版本过高,退回低版本就行了

npm uninstall babel-loader
npm install babel-loader@7.1.5

然而在查看bundle.js里面去看,并没看到转换的语法.......

react

npm install --save react react-dom
修改 src/index.js 使用react

import React, {Component} from 'react';

export default class Hello extends Component {
    render() {
        return (
            <div>
                Hello,React!
            </div>
        )
    }
}

然后再执行一遍打包命令 webpack --config webpack.dev.config.js
按照React语法,写一个Hello组件

import React,{Component} from 'react';
import ReactDom from 'react-dom';
export default class Hello extends Component{
    render(){
        return(
            <div>
                Hello,React!!!!!!!!!!!
            </div>
        )
    }
}
ReactDom.render(<Hello/>, document.getElementById('app'));

命令优化

每次打包都得在根目录执行这么一长串的命令,直接修改package.json里面的script,增加dev-build

react-router

npm install --save react-router-dom
然后在src文件夹下新建两个组件 HomePage 写入最基本的内容,让其有内容可以显示在页面

image.png

router.js引入这两个组件

import React from 'react';
import {
        BrowserRouter as
        Router,
        Route,
        Switch,
        Link
} from 'react-router-dom';
import Home from '../pages/Home';
import Page from '../pages/Page';
const router=()=>(
    <Router>
        <div>
            <ul>
                <li><Link to='/'>首页</Link></li>
                <li><Link to='/page'>首页</Link></li>
            </ul>
        <Switch>
            <Route exact path="/" component={Home}/>
            <Route path="/page" component={Page}/>
        </Switch>
        </div>
    </Router>
);
export default router;

然后在src/index.js

import React,{Component} from 'react';
import ReactDom from 'react-dom';
import router from './router/router'
ReactDom.render(router(), document.getElementById('app'));

在原网站中会出现点击首页page没有反应,但是我在使用webstorm的情况下没有遇见,暂时自己还不知道是什么问题。只能跳过!!!!
可能在打包的时候遇到这个问题

image.png
直接运行 webpack-cli即可

webpack-dev-server

简单来说,webpack-dev-server就是一个小型的静态文件服务器。使用它,可以为webpack打包生成的资源文件提供Web服务。
npm install webpack-dev-server@2 --save-dev

补充:这里webpack-dev-server需要全局安装,要不后面用的时候要写相对路径。需要再执行这个 npm install webpack-dev-server@2 -g

修改webpack.dev.config.js,增加webpack-dev-server的配置

devServer: {
        contentBase: path.join(__dirname, './dist')
    }

现在执行webpack-dev-server --config webpack.dev.config.js
在这里不知道为什么又遇到了一个未知的困难

image.png
自行在网上百度 看到了有人说有可能是因为webpackwebpack-dev-server的版本不兼容的问题
然后我拷贝了之后项目中webpackwebpack-dev-server的版本就可以了

"webpack": "^3.10.0",
"webpack-dev-server": "^2.9.7"

直接打开浏览器访问localhost:8080即可
Q: --content-base是什么?
A:URL的根目录。如果不设定的话,默认指向项目根目录。
到这里我们也可以在package.json里面设定,直接跑npm start就可以了,不用每次都写webpack-dev-server --config webpack.dev.config.js

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

然后还有其他的webpack-dev-server的配置项

1.color(CLI only) console中打印彩色日志
2.historyApiFallback 任意的404响应都被替代为index.html。有什么用呢?你现在运行npm start,然后打开浏览器,访问http://localhost:8080,然后点击Page1到链接http://localhost:8080/page1,然后刷新页面试试。是不是发现刷新后404了。为什么?dist文件夹里面并没有page1.html,当然会404了,所以我们需要配置
historyApiFallback,让所有的404定位到index.html。
3.host 指定一个host,默认是localhost。如果你希望服务器外部可以访问,指定如下:host: "0.0.0.0"。比如你用手机通过IP访问。hot 启用Webpack的模块热替换特性。关于热模块替换,我下一小节专门讲解一下。
4.port 配置要监听的端口。默认就是我们现在使用的8080端口。
5.proxy 代理。比如在 localhost:3000 上有后端服务的话,你可以这样启用代理:

proxy: {
      "/api": "http://localhost:3000"
    }

模块热替换(Hot Module Replacement)

只更新改变的那一块,并且整个页面处于不刷新的状态
package.jsonstart写入"start": "webpack-dev-server --config webpack.dev.config.js --hot" 尾部追加一个--hot
然后在src/index.js写入

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

推荐阅读更多精彩内容

  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,550评论 0 16
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • 走在人生的十字路口,徘徊,迷茫,不知道该往哪里走。走了好多地方,见了很多朋友,看到很多机会,最后一咬牙,做了一个勇...
    红玫瑰和白汽球阅读 209评论 0 0
  • 看完电视剧《平凡的世界》,心里堵得慌。 少安与润叶,从最初的青梅竹马两情相悦,到后来被现实打败一个从山西带回一个姑...
    能开二月花阅读 246评论 0 1
  • 安好,一个多么温柔美丽的字眼。只是前面加了各自以后,瞬间变得面目狰狞。 无论有多少难以忘怀的青春,无论有多少无法释...
    江离子阅读 184评论 0 1