美文网首页
搭建react项目

搭建react项目

作者: 江疏影子 | 来源:发表于2018-09-06 10:42 被阅读0次

    依附网站: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();
    }
    

    相关文章

      网友评论

          本文标题:搭建react项目

          本文链接:https://www.haomeiwen.com/subject/jcwtgftx.html