当前位置: 首页 > article >正文

使用hel-micro微服务实现在jsp项目中引入react组件

以下是一个完整的示例,涵盖 React子应用配置JSP主应用集成 以及 样式隔离 的实现细节。我们将通过 CSS ModulesShadow DOM 确保React样式与JSP样式互不干扰。


一、React子应用配置

1. 项目结构
react-module/
├── src/
│   ├── index.js       # 模块入口文件
│   ├── App.js        # React组件
│   └── App.module.css # 组件样式(CSS Modules)
├── webpack.config.js  # Webpack配置
└── package.json
2. 关键文件代码

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"
  }
}
3. 构建子应用
npm install
npm run build

生成dist/react-module.umd.js,将其复制到JSP项目的静态资源目录(如webapp/static/js)。


二、JSP主应用集成

1. JSP页面代码 (main.jsp)
<!DOCTYPE html>
<html>
<head>
    <title>JSP集成React微前端示例</title>
    <!-- 引入React和ReactDOM(CDN) -->
    <script src="https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.production.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
    
    <!-- 引入hel-micro SDK(CDN) -->
    <script src="https://cdn.jsdelivr.net/npm/hel-micro@3.1.3/lib-core/hel-micromini.min.js"></script>

    <!-- JSP样式 -->
    <style>
        .jsp-title {
            font-size: 32px;
            color: blue;
        }
    </style>
</head>
<body>
    <!-- JSP内容 -->
    <h1 class="jsp-title">JSP主应用</h1>
    <div>当前用户:<%= request.getUserPrincipal().getName() %></div>
    
    <!-- React模块容器 -->
    <div id="react-root"></div>

    <!-- 动态加载微模块 -->
    <script>
        // 使用Shadow DOM隔离React样式
        const shadowRoot = document.getElementById('react-root').attachShadow({ mode: 'open' });
        const reactContainer = document.createElement('div');
        shadowRoot.appendChild(reactContainer);

        // 加载React微模块
        helMicro.preFetchLib({
            name: 'reactMicroModule',
            apiPath: '${pageContext.request.contextPath}/static/js/react-module.umd.js'
        }).then(() => {
            const { App } = window.reactMicroModule;
            ReactDOM.render(React.createElement(App), reactContainer);
        }).catch(err => {
            console.error('模块加载失败:', err);
        });
    </script>
</body>
</html>

三、样式隔离实现

1. React样式隔离
  • 使用 CSS Modules 确保React组件的样式局部化,不会影响外部JSP样式。
  • 使用 Shadow DOM 将React组件渲染到一个隔离的DOM树中,确保React样式不会泄漏到JSP页面。
2. JSP样式隔离
  • JSP页面的样式通过普通<style>标签或外部CSS文件定义,不会影响React组件。

四、效果验证

  1. JSP页面效果
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. React微模块效果
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 样式隔离验证

    • JSP的.jsp-title样式为蓝色,React的.title样式为灰色,互不干扰。
    • 通过浏览器开发者工具检查Shadow DOM,确认React样式被隔离。

五、总结

通过 CSS ModulesShadow DOM,我们实现了React微模块与JSP页面的样式完全隔离。同时,React子应用通过Webpack打包为UMD格式,直接集成到JSP项目中,无需依赖CDN。此方案具有以下优势:

  1. 样式隔离:确保React和JSP样式互不干扰。
  2. 即插即用:React微模块可独立开发、构建和部署。
  3. 低侵入性:JSP项目无需改造,仅需引入静态文件。

希望这个示例能帮助您顺利完成JSP与React的微前端集成!


http://www.kler.cn/a/592909.html

相关文章:

  • Jenkins自动化部署pigx项目的实践总结
  • DLMS电能表通讯协议学习笔记
  • 2025三掌柜赠书活动第八期:预训练语言模型:方法、实践与应用
  • 联核科技AGV无人叉车有哪些常见的安全防护措施?
  • Flutter小白零基础入门到高级项目实战全集
  • 解决uni-app授权弹框华为审核拒绝
  • vscode+wsl2+bear+clangd配置教程
  • 【Spark】查询优化中分区(Partitioning)和分桶(Bucketing)是什么关系?什么时候应当分区,什么时候应当分桶?
  • 【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)
  • flutter 专题 九十 四 Flutter开发之基础知识
  • xss注入实验(xss-lab)
  • 4.1-1 IS-NET-Pro视频转图片的插件
  • 在ASP.NET Core中使用NLog:配置与性能优化指南
  • vscode查看文件历史git commit记录
  • windows安装配置FFmpeg教程
  • 【C#】Winform调用NModbus实现Modbus TCP 主站通讯
  • LeetCode--2181. 链表--合并零之间的节点
  • 【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解
  • 麒麟服务器操作系统Go环境部署手册
  • 织梦DedeCMS后台发布文章增加“顶”和“踩”默认随机值,并可后台修改