UNPKG

@gez/rspack

Version:

A high-performance Rspack integration for Gez microfrontend framework, providing module federation and SSR capabilities.

215 lines (214 loc) 5.99 kB
import { rspack } from "@rspack/core"; import NodePolyfillPlugin from "node-polyfill-webpack-plugin"; import { createRspackApp } from "./app.mjs"; import { RSPACK_LOADER } from "./loader.mjs"; export async function createRspackHtmlApp(gez, options) { options = { ...options, target: { web: ["chrome>=87", "edge>=88", "firefox>=78", "safari>=14"], node: ["node>=22.6"], ...options?.target }, css: options?.css ? options.css : gez.isProd ? "css" : "js" }; return createRspackApp(gez, { ...options, config(context) { const { config, buildTarget } = context; config.stats = "errors-warnings"; config.module = { ...config.module, rules: [ ...config.module?.rules ?? [], { test: /\.(jpe?g|png|gif|bmp|webp|svg)$/i, type: "asset/resource", generator: { filename: filename(gez, "images") } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/i, type: "asset/resource", generator: { filename: filename(gez, "media") } }, { test: /\.(woff|woff2|eot|ttf|otf)(\?.*)?$/i, type: "asset/resource", generator: { filename: filename(gez, "fonts") } }, { test: /\.json$/i, type: "json" }, { test: /\.worker\.(c|m)?(t|j)s$/i, loader: options.loaders?.workerRspackLoader ?? RSPACK_LOADER.workerRspackLoader, options: { esModule: false, filename: `${gez.name}/workers/[name].[contenthash]${gez.isProd ? ".final" : ""}.js` } }, { test: /\.(ts|mts)$/i, loader: options.loaders?.builtinSwcLoader ?? RSPACK_LOADER.builtinSwcLoader, options: { env: { targets: buildTarget === "client" ? options?.target?.web : options?.target?.node, ...options?.swcLoader?.env }, jsc: { parser: { syntax: "typescript", ...options?.swcLoader?.jsc?.parser }, ...options?.swcLoader?.jsc }, ...options?.swcLoader }, type: "javascript/auto" } ] }; config.optimization = { ...config.optimization, minimizer: [ new rspack.SwcJsMinimizerRspackPlugin({ minimizerOptions: { format: { comments: false } } }), new rspack.LightningCssMinimizerRspackPlugin({ minimizerOptions: { targets: options.target?.web, errorRecovery: false } }) ] }; config.plugins = [ new NodePolyfillPlugin(), ...config.plugins ?? [] ]; config.devtool = false; config.cache = false; if (options.definePlugin) { const defineOptions = {}; Object.entries(options.definePlugin).forEach( ([name, value]) => { const targetValue = typeof value === "string" ? value : value[buildTarget]; if (typeof targetValue === "string" && name !== targetValue) { defineOptions[name] = targetValue; } } ); if (Object.keys(defineOptions).length) { config.plugins.push(new rspack.DefinePlugin(defineOptions)); } } config.resolve = { ...config.resolve, extensions: ["...", ".ts"] }; addCssConfig(gez, options, context); options?.config?.(context); } }); } function filename(gez, name, ext = "[ext]") { return gez.isProd ? `${name}/[name].[contenthash:8].final${ext}` : `${name}/[path][name]${ext}`; } function addCssConfig(gez, options, { config }) { if (options.css === false) { return; } if (options.css === "js") { const cssRule = [ { loader: options.loaders?.styleLoader ?? RSPACK_LOADER.styleLoader, options: options.styleLoader }, { loader: options.loaders?.cssLoader ?? RSPACK_LOADER.cssLoader, options: options.cssLoader }, { loader: options.loaders?.lightningcssLoader ?? RSPACK_LOADER.lightningcssLoader, options: { targets: options.target?.web ?? [], minify: gez.isProd } } ]; const lessRule = [ { loader: options.loaders?.lessLoader ?? RSPACK_LOADER.lessLoader, options: options.lessLoader } ]; if (options.styleResourcesLoader) { lessRule.push({ loader: options.loaders?.styleResourcesLoader ?? RSPACK_LOADER.styleResourcesLoader, options: options.styleResourcesLoader }); } config.module = { ...config.module, rules: [ ...config.module?.rules ?? [], { test: /\.less$/, use: [...cssRule, ...lessRule], type: "javascript/auto" }, { test: /\.css$/, use: cssRule, type: "javascript/auto" } ] }; return; } config.experiments = { ...config.experiments, css: true }; if (!config.experiments.css) { return; } const lessLoaders = [ { loader: options.loaders?.lessLoader ?? RSPACK_LOADER.lessLoader, options: options.lessLoader } ]; if (options.styleResourcesLoader) { lessLoaders.push({ loader: options.loaders?.styleResourcesLoader ?? RSPACK_LOADER.styleResourcesLoader, options: options.styleResourcesLoader }); } config.module = { ...config.module, rules: [ ...config.module?.rules ?? [], { test: /\.less$/, use: [...lessLoaders], type: "css" } ] }; }