• 作者:老汪软件技巧
  • 发表时间:2024-08-19 10:03
  • 浏览量:

前端

大家好,今天来了解下webpack的模块联邦,以后可能是一个新的开发模式

Module Federation

Module Federation 允许 JavaScript 应用程序动态运行来自另一个捆绑包的代码,或是在客户端和服务器上构建代码。Module Federation 是一个插件,可用于webpack 5,也可以用于功能有限的 webpack 4 和 Rollup。在使用 ModuleFederation 之前必须了解以下两个重要概念。

一个host可以加载多个remote,host代表App shell,remote 代表其中的一个微前端。

模块联邦使用

1.创建一个remote工程,暴露出一个组件,提供给容器使用2、再创建一个host工程,引用远程

创建remote工程安装依赖包

npm i webpack webpack-cli webpack-dev-server html-webpack-plugin babel-loader @babel/core @babel/preset-env @babel/preset-react -D

npm i react react-dom

配置基本webpack

const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  devServer: {
    port: 8080,
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react'],
          },
        }
      },
    ],
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './src/index.html',
      inject: true
    }),
  ]
}

加载使用组件

// index.js
import React from "react";
import { createRoot } from 'react-dom/client'
import App from "./App";
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App />)
// App.js
import React from "react";
import NewsList from "./NewsList";
const App = () => {
  return (<div>
    <h1>本地组件h1>
    <NewsList>NewsList>
  div>)
}
export default App
// NewsList
import React from "react";
const NewsList = () => {
  return (<div>
    <h1>remote newlisth1>
  div>)
}
export default NewsList;

配置webpack,共享组件

打包之后,可以在dist文件夹中找到remoteEntry.js

const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
  // ...
  plugins: [
    new ModuleFederationPlugin({
      name: 'remote',
      filename: 'remoteEntry.js',
      exposes: {
        './NewsList': './src/NewsList'
      }
    })
  ]
}

host工程中使用远程组件

1.在webpack中配置,引入远程组件

const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
    // ...
    plugins: [
        new ModuleFederationPlugin({
          name: 'host',
          remotes: {
            remote: 'remote@http://localhost:8080/remoteEntry.js' // 引入在线组件
          }
        })
    ]
}

2.在组件中使用远程组件

import React from "react";
import RemoteNewsList from "remote/NewsList";
import Slider from "./Slider";
const App = () => {
  return (<div>
    <h1>远程组件h1>
    <RemoteNewsList>RemoteNewsList>
    <h1>本地组件h1>
    <Slider>Slider>
  div>)
}
export default App

最后

这个只是一个比较简单的模块联邦的使用,后面用到在深入了解

参考资料

代码git地址