我无法应对 SSR React

I can't deal with SSR React

当我导入下一个SSR的react组件时,出现导入错误,请问这是怎么回事?我不想在 package.json

中使用类型模块

也许我在某处犯了错误.....我将非常感谢你的帮助

babel.rc

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react",
    "@babel/preset-typescript",
    "@babel/register"
  ]
}

webpack.config.js

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const TerserWebpackPlugin = require("terser-webpack-plugin");
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");

const { getGlobals } = require("./config/get-globals");

const isDev = process.env.NODE_ENV === "development";
const isProd = !isDev;

const globals = getGlobals();
const optimization = () => {
  const config = {
    splitChunks: {
      chunks: "all",
    },
  };

  if (isProd) {
    config.minimizer = [
      new CssMinimizerWebpackPlugin(),
      new TerserWebpackPlugin(),
    ];
  }

  return config;
};

const ClientConfig = {
  entry: path.join(__dirname, "src", "index.jsx"),
  output: {
    path: path.join(__dirname, "build"),
    filename: "[name].[contenthash].js",
  },
  mode: 'development' === process.env.NODE_ENV ? 'development' : 'production',
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(__dirname, "src", "public", "index_template.ejs"),
      favicon: "src/public/favicon.ico",
      alwaysWriteToDisk: true,
      minify: {
        collapseWhitespace: isProd,
      },
      inject: false,
      templateParameters: (options) => {
        const js = Object.keys(options.assets)
          .filter((el) => /\.js$/.test(el))
          .map((el) => "/" + el);
        const css = Object.keys(options.assets)
          .filter((el) => /\.css$/.test(el))
          .map((el) => "/" + el);
        return {
          css,
          js,
          globals,
        };
      },
    }),
    new HtmlWebpackPlugin({
      inject: false,
      minify: false,
      template: path.resolve(__dirname, "config", "render-stats.js"),
      filename: path.join(__dirname, "config", "build-stats.json"),
    }),
    new MiniCssExtractPlugin({
      filename: "[name].[contenthash].css",
    }),
    new CleanWebpackPlugin(),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: path.resolve(__dirname, "src", "public", "favicon.ico"),
          to: path.resolve(__dirname, "build"),
        },
      ],
    }),
  ],
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
        },
      },
      {
        test: /\.(ts|tsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "ts-loader",
        },
      },
      {
        test: /\.(png|svg|jpg|gif|jpeg|ico)$/,
        use: ["file-loader"],
      },
      {
        test: /\.(ttf|woff|woff2|eot)$/,
        use: ["file-loader"],
      },
      {
        test: /\.xml$/,
        use: ["xml-loader"],
      },
      {
        test: /\.csv$/,
        use: ["csv-loader"],
      },
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: "css-loader",
            options: {
              importLoaders: 1,
              modules: true,
            },
          },
        ],
      },
      {
        test: /\.ejs$/,
        use: { loader: "ejs-compiled-loader", options: {} },
      },
    ],
  },
  resolve: {
    extensions: [".js", ".jsx", ".ejs", ".tsx", ".ts"],
  },
  devServer: {
    port: 3007,
    hot: isDev,
  },
  optimization: optimization(),
};

module.exports = [ClientConfig];

server.js

const express = require("express");
const fs = require("fs");
const path = require("path");
// create express application
const app = express();

// import App component
const { App } = require("../src/components/app.tsx");

app.use("*", (req, res) => {

  let indexHTML = fs.readFileSync(path.resolve(__dirname, "../build/index.html"), {
    encoding: "utf8"
  });

  // set header and status
  res.contentType("text/html");
  res.status(200);

  return res.send(indexHTML);
});

// run express server on port 9000
app.listen("9000", () => {
  console.log("Express server started at http://localhost:9000");
});

错误

从“react”导入 * 作为 React; ^^^^^^ 语法错误:无法在模块外使用导入语句

编译服务器使用此配置filewebpack.server.config.js

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  entry: './src/server/index.js',
  target: 'node',
  externals: [nodeExternals()],
  output: {
    path: path.resolve(__dirname, './dist/server'),
    filename: 'server.js'
  },
  resolve :  {
    extensions : [".js",".jsx"], 
    },
  module: {
    rules: [
      {
        test: /\.jsx?/,
        use: 'babel-loader'
      }
    ]
  }
};