Published on

第十一周:模块联邦 - 微前端

Authors

技术

Module Federation - 模块联邦
webpack 5 支持了模块联邦特性

// App2
const { ModuleFederationPlugin } = require('webpack').container
const path = require('path')

module.exports = {
  entry: './src/index',
  mode: 'development',
  devServer: {
    static: path.join(__dirname, 'dist'),
    port: 3002,
  },
  output: {
    publicPath: 'auto',
  },
  plugins: [
    new ModuleFederationPlugin({
      // 远程组件的应用名称
      name: 'app2',
      // 远程组件的入口文件
      filename: 'remoteEntry.js',
      // 定义需要导出的组件列表
      exposes: {
        './App': './src/App',
        './Component': './src/component',
      },
      // 可以被共享的模块
      shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
    }),
  ],
}

// App1
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { ModuleFederationPlugin } = require('webpack').container
const path = require('path')

module.exports = {
  entry: './src/index',
  mode: 'development',
  devServer: {
    static: path.join(__dirname, 'dist'),
    port: 3001,
  },
  output: {
    publicPath: 'auto',
  },
  plugins: [
    new ModuleFederationPlugin({
      // 当前应用名称
      name: 'app1',
      // 远程应用加载js入口列表
      remotes: {
        app2: 'app2@http://localhost:3002/remoteEntry.js',
      },
      //共享的模块
      shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
    }),
  ],
}

Your Code Doesn't Have to Be a Mess

  1. 定义明确的目标
  2. 建立约束
  3. 对不断增长的新需求说不,明确自己要做的主要需求
  4. 定期删除不必要的死代码和死依赖
  5. 最小化需要的依赖

工具

BackgroundMusic
Mac 不同的 APP 调整不同的音量

arctype
数据库可视化工具

snoopForms
低代码搭建问卷

vytal
一个 Chrome 浏览器插件,可以修改你的时区、语言、地理位置和 Useragent 等设定,从而骗过页面脚本的 IP 侦测。

react-chrono
TimeLine 组件

生活

一句话

软件开发的目标不是类型安全、100% 的测试覆盖率、流畅的代码逻辑、完善的开发工具、高效的系统、使用最好的编程语言、优雅的 API 设计、快速的反馈循环、编写很棒的代码等等...... 软件开发的真正目标只有一个:发布解决客户问题的软件,为客户提供价值。
-- 《成为专业程序员 10 周年的感悟》

人们拥有一种神奇的能力,就是使事情发生。但是大多数人从来不敢尝试这种能力,只是默默接受世界本来的样子。
-- Sam Altman《如何成功》