webpack环境注入模块到全局

概述

工程化的项目中,一般都是模块化的形式引入对应的依赖包,并不会将其注入到全局变量中,在微前端中,基座项目(主应用)和子应用直接肯定存在依赖的重叠,因此公共的三方包需要提取共用,而这些公共模块,放到主应用中,然后子应用打包排除对应的公共包即可,这样可以节省大量的资源。

实现方式

1、cdn

把对应公共资源单独部署到cdn上,然后主应用中引入加载,主应用和子应用都通过构建工具进行排包,示例如下: 以vue项目为例,公共资源位:vue axios vue-router vuex等

修改主应用和子应用 vue.config.js

js 复制代码
module.exports = {
  configureWebpack: {
    externals: {
      // 键是包名,值是全局变量名
      vue: 'Vue',
      'vue-router': 'VueRouter',
      axios: 'axios',
      lodash: '_'
    }
  }
}

主应用的index.html中cdn引入

将公共的资源单独部署,然后cdn方式引入 index.html示例如下:

js 复制代码
<head>
  <!-- Vue 相关 -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.2/dist/vue-router.min.js"></script>
  
  <!-- 其他库 -->
  <script src="https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
</head>

2、expose-loader

这种方式更为内聚,不用单独cdn引入,直接将主应用的公共模块包注入到全局中,然后子应用排包使用即可。

expose-loader是什么?

expose-loader 允许暴露一个模块(整体或者部分)给全局对象(selfwindowglobal)。

实现

注意:expose-loader版本的不同,用法也会有差异,这里有坑,可以使用的时候查阅文档

js 复制代码
// eslint-disable-next-line @typescript-eslint/no-var-requires
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
/* eslint-disable @typescript-eslint/no-var-requires */
const prod = process.env.NODE_ENV === 'production';

module.exports = {
  configureWebpack: (config) => {
  //s----重点
    config.module.rules.push({
      test: require.resolve('vue'),
      use: [{
        loader: 'expose-loader',
        options: {
          exposes: 'MyVue'//暴露到window的属性名
        }
      }]
    })
    config.module.rules.push({
      test: require.resolve('jquery'),
      use: [{
        loader: 'expose-loader',
        options: {
          exposes: 'JQuery'
        }
      }]
    })
    config.module.rules.push({
      test: require.resolve('@qbee/fe-vue-contacts'),
      use: [{
        loader: 'expose-loader',
        options: {
          exposes: 'FeVueContacts'
        }
      }]
    })
  
    }
  },
  parallel: require('os').cpus().length > 1,
  devServer: {
    hot: true,
    open: process.platform === 'darwin',
    host: '0.0.0.0',
    port: 2459,
    https: false,
    hotOnly: false,
    proxy: prod
      ? null
      : {
          '/': {
            target: process.env.APP_PROXY_URL, // 服务器地址
            changeOrigin: true, // 是否跨域,
            ws: false
          }
        }
  }
};

总结

对应大平台,集群项目来说,公共资源抽离出去可以减少很大一部分资源请求的消耗时间,提升用户体验。

相关推荐
计算机魔术师24 分钟前
AI为拿高分不惜入侵网站:22个模型作弊审计,真相让人背脊发凉
前端
晓说前端26 分钟前
TypeScript 核心语法应用 —— Vue 3 中的使用(下)
前端·javascript·typescript·类型系统
zhangminghuan35 分钟前
微信小程序开发核心知识点全景解析(前端必备硬核基础)
前端·微信小程序·小程序
boooooooom1 小时前
尝尝咸淡:从朴素 RAG 到 Graph RAG——一个烹饪问答系统的三层检索升级之路
前端·后端·llm
cindershade1 小时前
让每条前端异常都能回答:该由谁修、为什么现在修
前端
bitbrowser1 小时前
Telegram提示尝试次数过多,换网络和重装有用吗
前端
研☆香1 小时前
前端简单的的变量声明
前端
赵大仁2 小时前
Next.js AI Route Handler 工程化:超时、流式与鉴权
前端·ai·鉴权·next.js·工程化
yuhaiqiang2 小时前
从这两件事就能看出 vibecoding 距离专业作品差距有多大?AI 能抹平技术,但抹不平品味 !
前端·后端·程序员
一次旅行2 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能