Closed5

[Electron] React x TypeScript を Rspack でビルドしてみる

はっぱはっぱ
  • rspack.config.ts
import type { Configuration } from "@rspack/cli";
import { CssExtractRspackPlugin, HtmlRspackPlugin } from "@rspack/core";

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

const common: Configuration = {
  mode: isDev ? "development" : "production",
  externals: ["fsevents"],
  resolve: {
    extensions: [".js", ".ts", ".jsx", ".tsx", ".json"],
  },
  output: {
    publicPath: "./",
    assetModuleFilename: "assets/[name][ext]",
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        loader: "builtin:swc-loader",
        options: {
          jsc: {
            parser: {
              syntax: "typescript",
            },
            transform: {
              react: {
                runtime: "automatic",
              },
            },
          },
        },
      },
      {
        test: /\.css$/,
        use: [CssExtractRspackPlugin.loader, "css-loader"],
        type: "javascript/auto",
      },
      {
        test: /\.(ico|png|svg|eot|woff?2?)$/,
        type: "asset/resource",
      },
    ],
  },
  watch: isDev,
  devtool: isDev ? "source-map" : false,
};

const main: Configuration = {
  ...common,
  target: "electron-main",
  entry: {
    main: "./src/main.ts",
  },
};

const preload: Configuration = {
  ...common,
  target: "electron-preload",
  entry: {
    preload: "./src/preload.ts",
  },
};

const renderer: Configuration = {
  ...common,
  target: "web",
  entry: {
    app: "./src/web/index.tsx",
  },
  plugins: [
    new CssExtractRspackPlugin(),
    new HtmlRspackPlugin({
      inject: "body",
      template: "./src/web/index.html",
    }),
  ],
};

export default [main, preload, renderer];
はっぱはっぱ
  • NPM スクリプト
package.json
{
  "scripts": {
    "dev": "rimraf dist && run-p dev:rspack dev:electron",
    "dev:rspack": "rspack --node-env \"development\"",
    "dev:electron": "wait-on ./dist/index.html ./dist/main.js && electronmon .",
    "build": "rimraf dist && rspack --node-env \"production\""
  }
}
はっぱはっぱ
  • 必要なパッケージ
package.json
{
  "dependencies": {
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  },
  "devDependencies": {
    "@rspack/cli": "^1.1.3",
    "@rspack/core": "^1.1.3",
    "@types/node": "^22.9.1",
    "@types/react": "^18.3.12",
    "@types/react-dom": "^18.3.1",
    "css-loader": "^7.1.2",
    "electron": "^33.2.0",
    "electronmon": "^2.0.3",
    "npm-run-all": "^4.1.5",
    "rimraf": "^6.0.1",
    "ts-node": "^10.9.2",
    "typescript": "^5.6.3",
    "wait-on": "^8.0.1"
  }
}
はっぱはっぱ
  • webpack
% npm run build

> electron-react-ts@0.0.0 build
> rimraf dist && cross-env NODE_ENV="production" webpack

1 asset
6 modules
webpack 5.96.1 compiled successfully in 1652 ms

1 asset
1 module
webpack 5.96.1 compiled successfully in 1580 ms

3 assets
20 modules
webpack 5.96.1 compiled successfully in 2829 ms
  • Rspack
% npm run build

> electron-react-ts@0.0.0 build
> rimraf dist && rspack --node-env "production"

Rspack compiled successfully in 31 ms

Rspack compiled successfully in 28 ms

Rspack compiled successfully in 75 ms
このスクラップは2024/11/22にクローズされました