完整的react项目搭建

作者: 六三一七 | 来源:发表于2018-04-22 18:19 被阅读36次

    完整搭建一个React项目

    本项目主要让我们是知道一个react项目大概需要哪些东西才能够跑起来。
    项目中用到了react、react-dom、antd、webpack 系列、babel、以及一堆loader

    项目结构

    新建一个文件夹 demo,目录结构如下

      - demo
        - src  // 应用的所有代码
          - actions     // 处理异步请求
          - assets      // 静态资源
          - components  // 公用组件
          - pages       // 业务逻辑页面
          - reducers    // reducer 状态处理
          - util        // 公用方法
          - index.html  // 项目模板
          - index.js    // 项目入口
        - package.json      // npm init 自动生成
        - webpack.config.js // webpack 配置文件
    

    初始化NPM

    在项目的根目录下打开命令行,输入:

    npm init -y
    

    安装webpack

    npm i webpack webpack-cli webpack-command --save-dev
    

    这里直接将webpack 的三个基本项安装好

    ps:

    --save-dev与--save的区别

    --save-dev表示只是在编译过程中所依赖的包,例如:webpack、sass-loader等 最后在package.json的devDependencies部分显示

    --save 表示编译后在运行时还需要依赖的包,例如 react react-dom等 最后在package.json的dependencies部分显示

    也可以指定安装webpack的版本

    npm install --save-dev webpack@[version] //version代表版本号
    

    配置webpack.config.js文件

    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        filename: 'bundle.js', // 输出的文件名
        path: path.resolve(__dirname, 'dist')
      }
    };
    // entry 是入口文件
    // output 是编译后文件
    // __dirname 全局变量 代表当前文件所在文件夹的完整路径
    // path.resolve 返回一个路径 __dirname+'/dist'
    

    安装其他webpack的插件

    自动创建html文件 html-webpack-plugin

    npm i --save-dev  html-webpack-plugin
    

    清除无用文件 clean-webpack-plugin

    npm i --save-dev clean-webpack-plugin
    

    在每次编译之前把上一次打包的文件清除

    一堆样式编译loader插件

    node-sass和sass-loader 是用来编译scss文件
    style-loader和css-loader 是用来编译css文件
    file-loader url-loader 加载其他文件,比如图片,字体

    npm i --save-dev style-loader css-loader node-sass sass-loader file-loader url-loader
    

    webpack 服务器 webpack-dev-server

    npm i --save-dev webpack-dev-server
    

    再完善一下webpack.config.js

    const path = require('path');
    const webpack = require('webpack');
    const HtmlWebpackPlugin = require('html-webpack-plugin');//自动创建html文件
    const CleanWebpackPlugin = require('clean-webpack-plugin');//清除多余文件
    
    module.exports = {
        devtool: 'cheap-module-eval-source-map',// 用于开发调试,方便清楚是那个文件出错 (共有7种)
        entry: {
            index: './src/index.js'
        },
        output: {
            filename: 'bundle.js', // 输出的文件名
            path: path.resolve(__dirname, 'dist') // 
        },
        module: {
            rules: [{
                test: /\.css$/,
                use:"style-loader!css-loader"
            }, {
                test: /\.scss$/,
                use:["style-loader","css-loader","sass-loader"]
               // 加载时顺序从右向左 
            },
            {
                test: /\.(png|svg|jpg|gif)$/,
                use: ['file-loader']
            }]
        },
        // 开启一个虚拟服务器
        devServer: {
            contentBase: './dist',
            hot: true
        },
        plugins: [
            new CleanWebpackPlugin(['dist']),//每次编译都会把dist下的文件清除,我们可以在合适的时候打开这行代码,例如我们打包的时候,开发过程中这段代码关闭比较好
            new webpack.HotModuleReplacementPlugin(),
            new HtmlWebpackPlugin({
                template: 'src/index.html' //使用一个模板
            })
        ]
    };
    
    

    修改 package.json

    ...
      "scripts": {
        "watch": "webpack --watch",
        "start": "webpack-dev-server --open",
        "build": "webpack"
      },
    ...
    
    

    其他文件

    src/index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>demo</title>
    </head>
    <body>
        <div id="root"></div>
    </body>
    </html>
    

    src/index.js

    console.log('hello world')
    

    运行

    npm run build
    

    编译成功后在根目录下就能看到一个dist文件夹

    集成React

    安装react 的东西,以及antd

    npm i --save react react-dom antd
    
    

    修改index.js

    import React,{Component} from 'react';
    import ReactDom from 'react-dom';
    
    class App extends Component {
        constructor(props) {
            super(props);
            this.state = {  };
        }
        render() {
            return (
                <div>
                    <p>Hello World</p>
                </div>
            );
        }
    }
    
    export default App;
    
    ReactDom.render(<App />,document.getElementById('root'));
    

    babel的使用

    因为react是使用jsx编写,浏览器无法识别,所以需要一个编译工具,这里使用babel

    安装babel

    npm i --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react  @babel/plugin-proposal-class-properties
    npm i --save @babel/polyfill
    npm i --save-dev babel-loader
    

    修改webpack.config.js

    在 module的rules中加入

    {
       test: /\.(js|jsx)$/,
       loader: 'babel-loader',
       exclude: /node_modules/
    }
    

    最终的webpack.config.js文件如下

    const path = require('path');
    const webpack = require('webpack');
    const HtmlPlugin = require('html-webpack-plugin');
    
     module.exports = {
        devtool: 'inline-source-map',
        entry: {
            index: './src/index.js'
        },
        output: {
            filename: 'bundle.js',
            path: path.resolve(__dirname, 'build')
        },
        module: {
            rules: [{
                test: /\.css$/,
                loader:['style-loader', 'css-loader']
            }, {
                test: /\.scss$/,
                loader: ['style-loader', 'css-loader', 'sass-loader']
            }, {
                test: /\.(png|svg|jpg|gif)$/,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    name: 'img/[name].[hash:7].[ext]'
                }
            }, {
                test: /\.(js|jsx)$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            }]
        },
        devServer: {
            contentBase: './build',
            port: 8081,
            inline: true,
            hot: true
        },
        plugins: [
            new webpack.HotModuleReplacementPlugin(),
            new HtmlPlugin({
                template: 'src/index.html'
            })
        ]
    }
    

    添加babel配置文件

    在根目录下添加文件 .babelrc

    {
        "presets": [
            "@babel/preset-env",
            "@babel/preset-react"
        ],
     "plugins": [
            "@babel/plugin-proposal-class-properties",
              ]
    }
    

    运行

    npm run build
    

    出现一个警告信息

    warning  The 'mode' option has not been set, webpack will fallback to
                    'production' for this value. Set 'mode' option to 'development' or
                    'production' to enable defaults for each environment.
    

    大概的意思是我们没有指定命令的模式是开发还是生产

    修改package.json文件

    ...
      "scripts": {
        "watch": "webpack --watch",
        "build": "webpack --mode production",
        "dev": "webpack  --mode development& webpack-dev-server --open  --mode development",
        "start": "webpack-dev-server --open --mode production"
      },
    ...
    
    

    这次我们可以直接运行

    npm run dev
    

    看结果

    如果在这过程中有出现其他的报错信息,可以直接百度,一般的问题其他人都遇到过!

    使用scss

    在assets目录下新建style.scss文件

    .red{
        color:red;
    }
    

    修改 index.js,导入scss文件

    ...
    import './assets/style.scss'
    ...
    
    
    ...
     return (
                <div>
                    <p className="red">Hello World</p>
                </div>
            );
    ...
    
    

    页面刷新后我就能看到样式改变。

    但是这样有一个问题就是,css样式是直接编译到bundle.js文件中的。不太符合我们的开发习惯,所以我们要编译后把css样式和js拆分开来,这时我们就需要用到样式分离插件

    分离文件 extract-text-webpack-plugin

    npm i --save-dev extract-text-webpack-plugin
    

    修改webpack.config.js

    ...
    const HtmlPlugin = require('html-webpack-plugin');
    +++ const ExtractTextPlugin = require("extract-text-webpack-plugin");
    module.exports = {
    
        ....
         module: {
            rules: [{
                test: /\.css$/,
                use:ExtractTextPlugin.extract({
                    fallback:"style-loader",
                    use:"css-loader"
                })
            }, {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract({
                    fallback:"style-loader",
                    use:"css-loader!sass-loader"
                })
            }
            ...],
            ...
            plugins: [
            +++  new ExtractTextPlugin("styles.css")
        ]
        },
    }
    ...
    
    

    再一次运行,我们就能看到在dist文件夹下出现一个style.css文件

    如果出现报错

    DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead
    

    则是因为当前安装的文件分离插件不支持webpack4,安装最新版的即可

    npm install extract-text-webpack-plugin@next
    

    至此,一个简单的react框架就搭建起来了

    相关文章

      网友评论

        本文标题:完整的react项目搭建

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