以下是一个完整的示例,涵盖 React子应用配置、JSP主应用集成 以及 样式隔离 的实现细节。我们将通过 CSS Modules 和 Shadow DOM 确保React样式与JSP样式互不干扰。
react-module/
├── src/
│ ├── index.js # 模块入口文件
│ ├── App.js # React组件
│ └── App.module.css # 组件样式(CSS Modules)
├── webpack.config.js # Webpack配置
└── package.json
a. src/App.module.css
使用CSS Modules确保样式局部化:
.container {
padding: 20px;
background-color: #f0f0f0;
border: 1px solid #ccc;
}
.title {
font-size: 24px;
color: #333;
}
b. src/App.js
使用CSS Modules引入样式:
import React from 'react';
import styles from './App.module.css';
export default function App() {
return (
<div className={styles.container}>
<h1 className={styles.title}>动态加载的React微模块</h1>
<p>当前时间:{new Date().toLocaleString()}</p>
</div>
);
}
c. src/index.js
暴露组件:
import React from 'react';
import App from './App';
export { App };
d. webpack.config.js
配置Webpack支持CSS Modules和UMD输出:
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'react-module.umd.js',
library: 'reactMicroModule',
libraryTarget: 'umd',
globalObject: 'this'
},
externals: {
'react': 'React',
'react-dom': 'ReactDOM'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react']
}
}
},
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true // 启用CSS Modules
}
}
]
}
]
}
};
e. package.json
构建命令
{
"scripts": {
"build": "webpack --config webpack.config.js"
},
"devDependencies": {
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4",
"babel-loader": "^9.1.3",
"@babel/core": "^7.23.2",
"@babel/preset-react": "^7.23.2",
"style-loader": "^3.3.3",
"css-loader": "^6.8.1"
}
}
npm install
npm run build
生成dist/react-module.umd.js
,将其复制到JSP项目的静态资源目录(如webapp/static/js
)。
main.jsp
)
JSP集成React微前端示例
JSP主应用
当前用户:<%= request.getUserPrincipal().getName() %>
标签或外部CSS文件定义,不会影响React组件。样式隔离验证
.jsp-title
样式为蓝色,React的.title
样式为灰色,互不干扰。通过 CSS Modules 和 Shadow DOM,我们实现了React微模块与JSP页面的样式完全隔离。同时,React子应用通过Webpack打包为UMD格式,直接集成到JSP项目中,无需依赖CDN。此方案具有以下优势:
希望这个示例能帮助您顺利完成JSP与React的微前端集成!