美文网首页让前端飞Web前端之路程序员
webpack手动配置React开发环境

webpack手动配置React开发环境

作者: zhaoolee | 来源:发表于2018-07-01 16:24 被阅读246次

    React提供了create-react-app的快速构建工具, 但作为一个专业的程序员(老司机), 面对复杂的项目, 入门级的构建工具, 是远远不够的, 我们这里从零开始, 用webpack, 手动配置一个独立的React开发环境, 开发环境完成后, 支持自动构建, 自动刷新, sass语法 等功能...

    1. 首先用npm初始化环境

    mkdir react-webpack-demo
    cd react-webpack-demo
    npm init -y
    
    • 安装相关软件包
    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
    # 识别html转换为jsx语法
    npm install babel-preset-react -D
    

    2.添加对html静态文件的支持

    • 在根目录下新建文件夹src, 在src内加入index.html index.js
    • 在根目录下新建webpack.config.js
    • webpack.config.js中加入如下配置
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    // 负责将html文档虚拟到根目录下
    let htmlWebpackPlugin = new HtmlWebpackPlugin({
        // 虚拟的html文件名 index.html
        filename: 'index.html',
        // 虚拟html的模板为 src下的index.html
        template: path.resolve(__dirname, './src/index.html')
    })
    
    module.exports = {
        // 开发模式
        mode: 'development',
        // 配置入口文件
        entry: './src/index.js',
        // 出口文件目录为根目录下dist, 输出的文件名为main
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: 'main.js'
        },
        // 配置开发服务器, 并配置自动刷新
        devServer: {
            // 根目录下dist为基本目录
            contentBase: path.join(__dirname, 'dist'),
            // 自动压缩代码
            compress: true,
            // 服务端口为1208
            port: 1208,
            // 自动打开浏览器
            open: true
        },
        // 装载虚拟目录插件
        plugins: [htmlWebpackPlugin],
    }
    
    • package.jsonscripts中添加"dev": "webpack-dev-server"
    • src/index.html中添加内容
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>react-webpack-demo</title>
    </head>
    <body>
        react-webpack-demo
        <hr>
        高堂明镜悲白发, 朝如青丝暮成雪
    </body>
    </html>
    
    • 在命令行内运行npm run dev, 即可看到刚添加的index.html内容
    • 接下来我们配置babel对es6语法的支持, 以及对jsx语法的支持

    3. 添加对js高级语法的支持

    • 在项目根目录, 添加.babelrc配置文件 presets为语法配置,plugins为插件配置
    {
        "presets": ["env", "stage-0", "react"],
        "plugins": ["transform-runtime"]
    }
    
    • 在webpack.config.js中添加module字段, 进行插件loader配置
    // webpack.config.js
    module.exports = {
        ...
        // 配置loader
        module: {
            // 根据文件后缀匹配规则
            rules: [
                // 配置js/jsx语法解析
                { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }
            ]
        }
    };
    
    • src/index.html中加入id为root的div节点
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>react-webpack-demo</title>
    </head>
    <body>
    
        react-webpack-demo
        <hr>
        高堂明镜悲白发, 朝如青丝暮成雪
        <hr>
        <div id="root"></div>
    </body>
    </html>
    
    • src/index.js中加入包含jsx语法的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'))
    

    附录: 添加对sass语法的支持(没兴趣可以跳过)

    • 安装sass相关的loader
    npm install style-loader css-loader node-sass sass-loader -D
    
    • 在webpack.config.js内新增规则
    // 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内新增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

    最终效果:

    文中相关资源链接:https://pan.baidu.com/s/1zGRtjltIcqVVJRFNHFhxAw 密码:6lwm

    相关文章

      网友评论

      • 习惯芥末味:先是按照你的文章一步一步操作的,但是到添加scss之前就开始报错了,也不知道为什么,下载你的源码到电脑上重新代开就是好的
        真的是找不到我写的原因出在哪里,这期间可能遇到的什么坑,您有遇到锅的吗?
        习惯芥末味:刚找出我的问题了,按照安装下载的依赖包之间貌似有冲突,删除我自己的直接换成从您那下载的就没有问题,运行正常,不会报错
      • jun4rui:注意一下,因为babel升级,按照教程安装的babel组件会出现不搭配的问题。请看:https://segmentfault.com/a/1190000016458913 这个文章来解决
      • peaktan:楼主看着像是iOS 开发出身:relieved:
        zhaoolee:@peaktan 哈哈我确实学过iOS开发
      • 大白的简述:请教下webpack怎么优化
      • 墨成_名字被占用:为什么在每个函数里都写self=this 的钩子
        时光丶summer:不是箭头函数是拿不到this的 所以一般函数里面的self 就是this
        墨成_名字被占用:@木子昭 哦哦:smile::smile:
        zhaoolee:@墨成_f920 我是写习惯了,这里可以不写的

      本文标题:webpack手动配置React开发环境

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