美文网首页
React的Webpack配置

React的Webpack配置

作者: greenteaObject | 来源:发表于2018-03-15 09:17 被阅读0次

    Yarn安装

    npm i yarn -g
    
    image.png

    webpack

    • 使用版本3.10.0
    • yarn add webpack@3.10.0 --dev

    需要处理的文件里类型

    • HTML -> html-webpack-plugin
    • 脚本 -> babel + babel-preset-react
    • 样式 -> css-loader + sass-loader
    • 图片/字体 -> url-loader + file-loader

    webpack常用模块

    • html-webpack-plugin html单独打包成文件
    • extract-text-webpack-plugin 样式打包成单独文件
    • CommonsChunkPlugin 提出通用模块

    webpack-dev-server

    • 为webpack项目提供web服务
    • 使用2.9.7
    • 更改代码自动刷新,路径转发
    • yarn add webpack-dev-server@2.9.7 --dev
    • 解决多版本共存问题

    开始配置

    安装webpack
    // 创建git 
    git init
    // 初始化项目
    yarn init
    
    // 安装webpack
    yarn add webpack@3.10.0 --dev
    
    const path = require('path');
    module.exports = {
      entry: './src/app.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'app.js'
      }
    };
    

    在项目中新建一个webpack.config.js,然后新建src/app.js

    image.png
    // 执行
    node_modules/.bin/webpack
    

    这个文件就被打包了

    配置HTML
    // 安装
    yarn add html-webpack-plugin@2.30.1 --dev
    

    新建一个src/index.html

    // 引入
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    // 写插件
    plugins: [
      new HtmlWebpackPlugin({
          template: './src/index.html'
      })
    ]
    

    执行后会将app.js自动引入进html中

    处理脚本
    // 安装 解析ES6
    yarn add babel-loader@7.1.2 babel-core@6.26.0 babel-preset-env@1.6.1 --dev
    
    // 配置loader
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /(node_modules)/,  //对这个不做处理
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['env']
            }
          }
        }
      ]
    }
    
    React的配置
    // 安装解析jsx的babel包
    yarn add babel-preset-react@6.24.1 --dev
    
    module: {
      rules: [
        {
          test: /\.jsx$/,
          exclude: /(node_modules)/,  //对这个不做处理
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['env','react']    //在react环境下,也可以进行打包
            }
          }
        }
      ]
    }
    
    // 安装React
    yarn add react@16.2.0 react-dom@16.2.0
    

    此时做一个实验将app.js -> app.jsx,然后修改入口文件

    // app.jsx
    import React from 'react';
    import ReactDOM from 'react-dom';
    
    ReactDOM.render(
      <h1>Hello, world!</h1>,
      document.getElementById('root')
    );
    

    最后解析成了ES5的形式,可以解析jsx了

    解析CSS
    // 安装
    yarn add style-loader@0.19.1 css-loader@0.28.8 --dev
    
    // 添加rules规则
    {
      test: /\.css$/,
      use: [ 'style-loader', 'css-loader' ]
    }
    

    此时css就被成功引入了,但是css被解析成js的形式,因此我们要将css单独拿出来,需要用到ExtractTextWebpackPlugin

    // 安装
    yarn add extract-text-webpack-plugin@3.0.2 --dev
    
    // 引入插件
    const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
    
    {
      test: /\.css$/,
      use: ExtractTextWebpackPlugin.extract({
        fallback: "style-loader",
        use: "css-loader"
      })
    }
    
    // new
    new ExtractTextWebpackPlugin("index.css")
    
    解析scss

    一定要安装node-sass

    // 安装 scss-loader
    yarn add sass-loader@6.0.6 node-sass@4.7.2 --dev
    
    {
      test: /\.scss$/,
      use: ExtractTextWebpackPlugin.extract({
        fallback: 'style-loader',
        use: ['css-loader', 'sass-loader']
      })
    }
    
    处理图片
    // 安装
    yarn add file-loader@1.1.6 url-loader@0.6.2 --dev
    
    {
      test: /\.(png|jpg|gif)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 8192
          }
        }
      ]
    }
    
    引入字体图标
    // 安装
    yarn add font-awesome
    
    {
      test: /\.(woff|woff2|eot|ttf|otf|svg)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 8192
          }
        }
      ]
    }
    
    提取公共模块
    // 提出公共模块
    new webpack.optimize.CommonsChunkPlugin({
      name: 'common',   // 公共模块名
      filename: 'js/base.js'  // 打包的目录
    })
    
    webpack-dev-server
    // 安装
    yarn add webpack-dev-server@2.9.7 --dev
    

    在plugin下加上

    devServer: {
        
    }
    
    // 运行
    node_modules/.bin/webpack-dev-server
    

    但是会出现路径的问题,需要添加publicPath


    image.png
    加脚本
    // package.json
    "scripts" : {
      "dev" : "node_modules/.bin/webpack-dev-server",
      "dist" : "node_modules/.bin/webpack"
    }
    

    最终

    const path = require('path');
    const webpack = require('webpack')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const ExtractTextPlugin = require('extract-text-webpack-plugin')
    module.exports = {
      entry: './src/app.jsx',
      output: {
        path: path.resolve(__dirname, 'dist'),
        publicPath: '/dist/',
        filename: 'js/app.js'
      },
      module: {
        rules: [
          {
            test: /\.jsx$/,
            exclude: /(node_modules)/,  //对这个不做处理
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['env','react']
              }
            }
          },
          {
            test: /\.css$/,
            use: ExtractTextPlugin.extract({
              fallback: "style-loader",
              use: "css-loader"
            })
          },
          {
            test: /\.scss$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style-loader',
              use: ['css-loader', 'sass-loader']
            })
          },
          {
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 8192,
                  name: 'resource/[name].[ext]'   // 路径
                }
              }
            ]
          },
          {
            test: /\.(woff|woff2|eot|ttf|otf|svg)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 8192,
                  name: 'resource/[name].[ext]'   // 路径
                }
              }
            ]
          },
          
        ]
      },
      plugins: [
        // 处理HTML文件
        new HtmlWebpackPlugin({
            template: './src/index.html'
        }),
        // 独立css文件
        new ExtractTextPlugin("css/[name].css"),
        // 提出公共模块
        new webpack.optimize.CommonsChunkPlugin({
          name: 'common',   // 公共模块名
          filename: 'js/base.js'  // 打包的目录
        })
      ],
      devServer: {
        port: 8086
      }
    };
    

    相关文章

      网友评论

          本文标题:React的Webpack配置

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