react +webpack4 搭建项目

173 阅读1分钟

1.init 项目

npm init -y

自动生成package.json

{
  "name": "re",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
cnpm i webpack webpack-cli webpack-dev-server -D

自动生成node_modules文件夹

cnpm i react react-router-dom -S
cnpm i react-dom -S
cnpm i babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime @babel/preset-react -D
cnpm i @babel/polyfill @babel/runtime -D

新建.babelrc

{
  "presets": ["@babel/preset-env","@babel/preset-react"],
  "plugins": ["@babel/plugin-transform-runtime"]
}

webpack.dev.config.js

module.exports = {
  mode: "development",
  entry: ["./src/index.js"],
  output: {
    // 输出目录
    path: path.join(__dirname, "dist"),
    // 文件名称
    filename: "bundle.js"
  },
  module:{
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: [
          {
            loader: "babel-loader"
          }
        ]
      }
    ]
  },
  plugins:[],
  devServer:{}
}


cnpm install clean-webpack-plugin -D
cnpm install html-webpack-plugin -D
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
const webpack = require('webpack');
plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      filename: 'index.html', // 最终创建的文件名
      template: path.join(__dirname, 'src/template.html') // 指定模板路径
    })
  ]
devServer: {
    hot: true,
    contentBase: path.join(__dirname, "./dist"),
    host: "0.0.0.0", // 可以使用手机访问
    port: 8080,
    historyApiFallback: true, // 该选项的作用所有的404都连接到index.html
    proxy: {
      // 代理到后端的服务地址,会拦截所有以api开头的请求地址
      "/api": "http://localhost:3000"
    }
  }
cnpm i react-hot-loader -D
cnpm install css-loader style-loader sass-loader node-sass -D
{
  test: /\.scss$/,
    use: [
      "style-loader", // 创建style标签,并将css添加进去
      "css-loader", // 编译css
      "sass-loader" // 编译scss
    ]
}
cnpm install postcss-loader postcss-cssnext -D
{
        test: /\.scss$/,
        use: [
          "style-loader", // 创建style标签,并将css添加进去
          "css-loader", // 编译css
          "postcss-loader",
          "sass-loader" // 编译scss
        ]
      },
{
        test: /\.(eot|woff2?|ttf|svg)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              name: '[name]-[hash:5].min.[ext]',
              limit: 5000, // fonts file size <= 5KB, use 'base64'; else, output svg file
              publicPath: 'fonts/',
              outputPath: 'fonts/'
            }
          }
        ]
      }
resolve: {
    extensions: [".js", ".jsx"],
    alias: {
      "@": path.join(__dirname, "src"),
      pages: path.join(__dirname, "src/pages"),
      router: path.join(__dirname, "src/router")
    }
  },
{
        test: /\.scss$/,
        use: [
          // "style-loader", // b不再需要style-loader要已经分离处理
          MiniCssExtractPlugin.loader,
          "css-loader", // 编译css
          "postcss-loader",
          "sass-loader" // 编译scss
        ]
      },
optimization: {
    splitChunks: {
      chunks: "all", // 所有的 chunks 代码公共的部分分离出来成为一个单独的文件
    },
  },

cnpm i react-dom -S

新建postcss.config.js

module.exports = {
  plugins: {
    'autoprefixer': {browsers: 'last 5 version'}
  }
}

添加es7语法

cnpm i babel-plugin-transform-decorators -D
cnpm i babel-plugin-transform-decorators-legacy -D
cnpm install --save-dev @babel/plugin-proposal-class-properties -D

.babelrc

{
  "presets": ["@babel/preset-env","@babel/preset-react"],
  "plugins": ["@babel/plugin-transform-runtime",["@babel/plugin-proposal-decorators", { "legacy": true }],
    ["@babel/plugin-proposal-class-properties", { "loose" : true }]]
}