webpack处理react

处理react jsx

使用babel-loader

pnpm i -D webpack webpack-cli babel-loader @babel/core @babel/preset-react

const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  mode: "development",
  entry: './src/main.jsx',
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "./dist")
  },
  devServer:  {
    hot: true,
    open: false
  },
  module: {
    rules: [
      {
        test: /\.jsx$/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: [
                [
                  '@babel/preset-react',
                  {
                    runtime: 'automatic' // 自动注入jsx-runtime
                  }
                ]
              ]
            }
          }
        ]
      },
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "./template.html"
    })
  ]
}

处理react tsx

两种主流的 tsx 加载方案

  • 一是使用 Babel 的 @babel/preset-typescript 插件;
  • 二是直接使用 ts-loader
// 使用 @babel/preset-typescript
module.exports = {
  resolve: {
    extensions: ['.js', '.jsx', '.ts', '.tsx'],
  },
  module: {
    rules: [
      {
        test: /\.tsx$/,
        loader: 'babel-loader',
        options: {
          'presets': [
            ["@babel/preset-react", {
                "runtime": "automatic"
            }],
            '@babel/preset-typescript'
          ]
        }
      },
    ],
  },
}
// 使用ts-loader
module.exports = {
  resolve: {
    extensions: ['.js', '.jsx', '.ts', '.tsx'],
  },
  module: {
    rules: [
      {
        test: /\.tsx$/,
        use: 'ts-loader',
      },
    ],
  }
};