From 8f0b25f6a57759ac0f7300b3394e7da64c723c9a Mon Sep 17 00:00:00 2001 From: fi3ework Date: Fri, 8 Aug 2025 17:48:38 +0800 Subject: [PATCH] feat: add ESM application example --- pnpm-lock.yaml | 22 ++++++++ rspack/library-esm/rspack.config.mjs | 4 ++ rspack/react-refresh-esm/index.html | 15 +++++ rspack/react-refresh-esm/package.json | 21 +++++++ rspack/react-refresh-esm/rspack.config.js | 55 +++++++++++++++++++ rspack/react-refresh-esm/src/App.tsx | 25 +++++++++ .../react-refresh-esm/src/ArrowFunction.tsx | 1 + rspack/react-refresh-esm/src/ClassDefault.tsx | 9 +++ rspack/react-refresh-esm/src/ClassNamed.tsx | 7 +++ .../react-refresh-esm/src/FunctionDefault.tsx | 5 ++ .../react-refresh-esm/src/FunctionNamed.tsx | 13 +++++ .../react-refresh-esm/src/LazyComponent.tsx | 5 ++ rspack/react-refresh-esm/src/index.tsx | 6 ++ 13 files changed, 188 insertions(+) create mode 100644 rspack/react-refresh-esm/index.html create mode 100644 rspack/react-refresh-esm/package.json create mode 100644 rspack/react-refresh-esm/rspack.config.js create mode 100644 rspack/react-refresh-esm/src/App.tsx create mode 100644 rspack/react-refresh-esm/src/ArrowFunction.tsx create mode 100644 rspack/react-refresh-esm/src/ClassDefault.tsx create mode 100644 rspack/react-refresh-esm/src/ClassNamed.tsx create mode 100644 rspack/react-refresh-esm/src/FunctionDefault.tsx create mode 100644 rspack/react-refresh-esm/src/FunctionNamed.tsx create mode 100644 rspack/react-refresh-esm/src/LazyComponent.tsx create mode 100644 rspack/react-refresh-esm/src/index.tsx diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6302b567d..418b4635f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2337,6 +2337,28 @@ importers: specifier: 0.17.0 version: 0.17.0 + rspack/react-refresh-esm: + dependencies: + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@rspack/cli': + specifier: 1.4.10 + version: 1.4.10(@rspack/core@1.4.10(@swc/helpers@0.5.17)) + '@rspack/core': + specifier: 1.4.10 + version: 1.4.10(@swc/helpers@0.5.17) + '@rspack/plugin-react-refresh': + specifier: ^1.4.3 + version: 1.4.3(react-refresh@0.17.0)(webpack-hot-middleware@2.26.1) + react-refresh: + specifier: 0.17.0 + version: 0.17.0 + rspack/react-with-extract-css: dependencies: '@rspack/cli': diff --git a/rspack/library-esm/rspack.config.mjs b/rspack/library-esm/rspack.config.mjs index 98ce763d3..e17d1a1fb 100644 --- a/rspack/library-esm/rspack.config.mjs +++ b/rspack/library-esm/rspack.config.mjs @@ -12,6 +12,8 @@ export default defineConfig({ library: { type: "modern-module", }, + chunkLoading: 'import', + workerChunkLoading: 'import', }, module: { parser: { @@ -21,6 +23,8 @@ export default defineConfig({ }, }, optimization: { + concatenateModules: true, + avoidEntryIife: true, minimize: false, // no need to minify for library }, experiments: { diff --git a/rspack/react-refresh-esm/index.html b/rspack/react-refresh-esm/index.html new file mode 100644 index 000000000..1fd94734c --- /dev/null +++ b/rspack/react-refresh-esm/index.html @@ -0,0 +1,15 @@ + + + + + + + + Document + + + +
+ + + \ No newline at end of file diff --git a/rspack/react-refresh-esm/package.json b/rspack/react-refresh-esm/package.json new file mode 100644 index 000000000..c7f57de3d --- /dev/null +++ b/rspack/react-refresh-esm/package.json @@ -0,0 +1,21 @@ +{ + "name": "example-rspack-react-refresh-esm", + "version": "1.0.0", + "private": true, + "license": "MIT", + "main": "index.js", + "scripts": { + "build": "cross-env NODE_ENV=production rspack build", + "dev": "rspack serve " + }, + "dependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@rspack/cli": "1.4.10", + "@rspack/core": "1.4.10", + "@rspack/plugin-react-refresh": "^1.4.3", + "react-refresh": "0.17.0" + } +} diff --git a/rspack/react-refresh-esm/rspack.config.js b/rspack/react-refresh-esm/rspack.config.js new file mode 100644 index 000000000..f27211e7a --- /dev/null +++ b/rspack/react-refresh-esm/rspack.config.js @@ -0,0 +1,55 @@ +const { rspack } = require('@rspack/core'); +const ReactRefreshPlugin = require('@rspack/plugin-react-refresh'); + +const isProduction = process.env.NODE_ENV === 'production'; + +/** @type {import('@rspack/cli').Configuration} */ +const config = { + entry: { main: './src/index.tsx' }, + devtool: 'source-map', + output: { + module: true, + chunkFormat: 'array-push', + chunkLoading: 'jsonp', + workerChunkLoading: 'import', + }, + resolve: { + extensions: ['...', '.ts', '.tsx', '.jsx'], + }, + experiments: { + css: true, + outputModule: true, + }, + module: { + rules: [ + { + test: /\.tsx$/, + use: { + loader: 'builtin:swc-loader', + options: { + sourceMap: true, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + development: !isProduction, + refresh: !isProduction, + }, + }, + }, + }, + }, + }, + ], + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: './index.html', scriptLoading: "module" }), + !isProduction && new ReactRefreshPlugin(), + ].filter(Boolean), +}; + +module.exports = config; diff --git a/rspack/react-refresh-esm/src/App.tsx b/rspack/react-refresh-esm/src/App.tsx new file mode 100644 index 000000000..b453c2aef --- /dev/null +++ b/rspack/react-refresh-esm/src/App.tsx @@ -0,0 +1,25 @@ +import { lazy, Suspense } from 'react'; +import { ArrowFunction } from './ArrowFunction'; +import ClassDefault from './ClassDefault'; +import { ClassNamed } from './ClassNamed'; +import FunctionDefault from './FunctionDefault'; +import { FunctionNamed } from './FunctionNamed'; + +const LazyComponent = lazy(() => import('./LazyComponent')); + +function App() { + return ( +
+ + + + + + Loading}> + + +
+ ); +} + +export default App; diff --git a/rspack/react-refresh-esm/src/ArrowFunction.tsx b/rspack/react-refresh-esm/src/ArrowFunction.tsx new file mode 100644 index 000000000..608e550f3 --- /dev/null +++ b/rspack/react-refresh-esm/src/ArrowFunction.tsx @@ -0,0 +1 @@ +export const ArrowFunction = () =>

Arrow Function

; diff --git a/rspack/react-refresh-esm/src/ClassDefault.tsx b/rspack/react-refresh-esm/src/ClassDefault.tsx new file mode 100644 index 000000000..b5a90ef61 --- /dev/null +++ b/rspack/react-refresh-esm/src/ClassDefault.tsx @@ -0,0 +1,9 @@ +import { Component } from 'react'; + +class ClassDefault extends Component { + render() { + return

Default Export Class

; + } +} + +export default ClassDefault; diff --git a/rspack/react-refresh-esm/src/ClassNamed.tsx b/rspack/react-refresh-esm/src/ClassNamed.tsx new file mode 100644 index 000000000..c4ad14d01 --- /dev/null +++ b/rspack/react-refresh-esm/src/ClassNamed.tsx @@ -0,0 +1,7 @@ +import { Component } from 'react'; + +export class ClassNamed extends Component { + render() { + return

Named Export Class

; + } +} diff --git a/rspack/react-refresh-esm/src/FunctionDefault.tsx b/rspack/react-refresh-esm/src/FunctionDefault.tsx new file mode 100644 index 000000000..f886ae3e1 --- /dev/null +++ b/rspack/react-refresh-esm/src/FunctionDefault.tsx @@ -0,0 +1,5 @@ +function FunctionDefault() { + return

Default Export Function

; +} + +export default FunctionDefault; diff --git a/rspack/react-refresh-esm/src/FunctionNamed.tsx b/rspack/react-refresh-esm/src/FunctionNamed.tsx new file mode 100644 index 000000000..33d17ea49 --- /dev/null +++ b/rspack/react-refresh-esm/src/FunctionNamed.tsx @@ -0,0 +1,13 @@ +import { useEffect, useState } from 'react'; + +export function FunctionNamed() { + const [data, setData] = useState(0); + + useEffect(() => { + setInterval(() => { + setData((i) => i + 1); + }, 100); + }, []); + + return

Named Export Function {data}

; +} diff --git a/rspack/react-refresh-esm/src/LazyComponent.tsx b/rspack/react-refresh-esm/src/LazyComponent.tsx new file mode 100644 index 000000000..fe0fecab4 --- /dev/null +++ b/rspack/react-refresh-esm/src/LazyComponent.tsx @@ -0,0 +1,5 @@ +function LazyComponent() { + return

Lazy Component

; +} + +export default LazyComponent; diff --git a/rspack/react-refresh-esm/src/index.tsx b/rspack/react-refresh-esm/src/index.tsx new file mode 100644 index 000000000..0799734a3 --- /dev/null +++ b/rspack/react-refresh-esm/src/index.tsx @@ -0,0 +1,6 @@ +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root'); +const root = createRoot(container!); +root.render();