qiankun 公共依赖

1、提取公共依赖的目的

 减少相同资源的重复加载资源版本不同步打包文件庞大

2、如何提取公共依赖

 基本思路:

1、相同依赖 采用 CDN 的方式加载,并把 所有依赖的 CDN 链接 统一放到一个文件中进行管理
2、把存放 CDN 链接的文件,引入到 vue.config.js 中去
3、在项目打包时,添加忽略部分文件打包的配置,把以CDN方式加载的依赖忽略掉
4、把CDN加载的链接,动态添加到 index.html 中去

2.1 改造主应用

2.1.1 修改目录、添加配置文件及资源
在主应用的 public 下新建 global > config 文件夹,用于存放 全部应用公共接口地址配置、微应用配置、公共依赖 CDN 地址 等内容
在 config 文件夹下 新建 api-config.js,用于存放全部应用公共接口地址配置
在 config 文件夹下 新建 config-micro-app.js,用于存放微应用配置
在 config 文件夹下 新建 config-webpack.js,用于存放公共依赖 CDN 地址
在主应用的 public 下新建 libs 文件夹,用于存放各种依赖包
在这里插入图片描述
2.1.2 config-webpack.js 中,导出公共依赖地址配置
微应用中的依赖,就是读取主应用中的 config-webpack.js 这个配置文件
把项目打包部署到服务器上,public 文件夹内容不会被打包改变;因此线上项目的 public/libs 文件夹中就是依赖,依赖包的在线地址就能拿到了

// CDN 链接(读取线上配置)
exports.cdn = {css: ['http://192.xxxx/xxxx-app/global/libs/element-plus@1.2.0-beta.3/theme-chalk/index.css','http://192.xxxx/xxxx-app/global/libs/font-awesome/4.7.0/css/font-awesome.min.css','http://192.xxxx/xxxx-app/global/styles/variable.css',],js: ['http://192.xxxx/xxxx-app/global/libs/vue@3.2.22/vue.global.js','http://192.xxxx/xxxx-app/global/libs/vue-router@4.0.12/vue-router.global.js','http://192.xxxx/xxxx-app/global/libs/vuex@4.0.2/vuex.global.js','http://192.xxxx/xxxx-app/global/libs/axios@0.24.0/axios.min.js','http://192.xxxx/xxxx-app/global/libs/element-plus@1.2.0-beta.3/index.full.min.js','http://192.xxxx/xxxx-app/global/libs/echarts@5.2.2/echarts.js',// 这里引入了公共接口配置'http://xxxx/xxxx-app/global/config/api-config.js',],
};
// Webpack 打包时,如果使用 CDN 链接引入,则构建时要忽略相关资源
exports.externals = {vue: 'Vue','vue-router': 'VueRouter',vuex: 'Vuex',axios: 'axios','element-plus': 'ElementPlus',echarts: 'echarts',
};

2.1.3 api-config.js

const appConfig = {jdpAppCode: 'DCP.DSM',jdpOuApiContext: 'http://xxxx/ou',jdpBpmApiContext: 'http://xxxx/bpm',
}

2.1.4 config-micro-app.js:

window.microApp = [{name: 'river-micro-app',entries: {dev: '//localhost:7081/',product: '//192.xxxx/xxxx-app/',},container: '#micro-app',activeRule: '#/layout',},
];

2.2 添加微应用配置

2.2.1 同步获取在线文件(require-from-url)
微应用中采用 require-from-url 第三方依赖,实现同步获取在线文件(从节点中的URL加载模块)
2.2.2 读取线上 Webpack 配置文件
在 vue.config.js 中,添加如下代码:

// 同步获取在线JS
const requireFromUrl = require('require-from-url/sync'); // 微应用 - 读取线上 Webpack 配置文件(CDN 地址配置、忽略打包文件配置)
const webpackOnline = 'http://localhost:xxxx/global/config/config-webpack.js';
const { cdn, externals } = requireFromUrl(webpackOnline);

2.2.3 生成一个 HTML5 文件(html-webpack-plugin)
2.2.4 修改 vue.config.js
增加打包忽略 CDN 依赖文件的配置代码
把 CDN 链接,注入到 htmlWebpackPlugin 里(htmlWebpackPlugin 主要是生成 html 的,在 html 中可以拿到它的值)

// 同步获取在线JS
const requireFromUrl = require('require-from-url/sync');
const { name } = require('./package');// 微应用 - 读取线上的 Webpack 配置文件(CDN 地址配置、忽略打包文件配置)
const webpackOnline = 'http://localhost:8083/global/config/config-webpack.js';
const { cdn, externals } = requireFromUrl(webpackOnline);// 判断是否是生产环境
const isProd = process.env.NODE_ENV === 'production';// 静态资源的公共地址,部署到生产环境时,按需修改前项为项目名称(其中name为项目名称)
const publicPath = isProd? `http://localhost:9160/${name}/`: 'http://localhost:8081';module.exports = {devServer: {port: 8081,headers: {'Access-Control-Allow-Origin': '*',},},publicPath,// 自定义 Webpack 配置configureWebpack: (config) => {// 生产环境if (isProd) {// 去除 consoleObject.assign(config.optimization.minimizer[0].options.minimizer.options.compress, {drop_console: true,},);}return {externals, // 打包时忽略这些依赖output: {library: `${name}-[name]`,libraryTarget: 'umd', // 把子应用打包成 umd},};},chainWebpack: (config) => {config.plugin('html').tap((args) => {// 在 html 中,注入 CDN 链接args[0].cdn = cdn;return args;});},
};

2.2.5 修改微应用 public > index.html

<!DOCTYPE html>
<html><head>...<!-- 使用 CDN 的 CSS、JS 文件 --><% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %><link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" ignore rel="stylesheet"><% } %><% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %><script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script><% } %></head>
</html>

2.3 添加主应用配置

2.3.1 修改 vue.config.js

const { name } = require('./package');// 主应用 - 读取本地的 Webpack 配置文件(CDN 地址配置、忽略打包文件配置)
const { externals, cdn } = require('./public/global/config/config-webpack');// 判断是否是生产环境
const isProd = process.env.NODE_ENV === 'production';// 静态资源的公共地址,部署到生产环境时,按需修改前项为项目名称(其中name为项目名称)
const publicPath = isProd ? `/${name}/` : '/';module.exports = {devServer: {port: 8081,},publicPath,// 自定义 Webpack 配置configureWebpack: (config) => {// 生产环境if (isProd) {// 去除 consoleObject.assign(config.optimization.minimizer[0].options.minimizer.options.compress, {drop_console: true,},);}return {externals, // 打包时忽略这些依赖};},chainWebpack: (config) => {config.plugin('html').tap((args) => {// 在 html 中,注入 CDN 链接args[0].cdn = cdn;return args;});},
};

2.3.2 修改主应用 public > index.html

<!DOCTYPE html>
<html><head>...<!-- 使用 CDN 的 CSS、JS 文件 --><% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %><link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" ignore rel="stylesheet"><% } %><% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %><script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script><% } %></head>
</html>

2.4 子应用复用主应用的组件

主应用main.js 中加入

import VueUeditorWrap from 'vue-ueditor-wrap'
window.commonComponent = { VueUeditorWrap };

子应用改成:

 VueUeditorWrap: window.__POWERED_BY_QIANKUN__ ? window.commonComponent.VueUeditorWrap : import('vue-ueditor-wrap')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323919.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCV的图像平移

基本概念 图像的平移操作是将图像的所有像素坐标进行水平或者垂直方向的移动&#xff0c;也就是所有像素点按照给定的偏移量在水平方向上沿X轴&#xff0c;垂直方向上沿y轴移动。 设原始图像像素点为&#xff08;x0,y0&#xff09;&#xff0c;平移后的图像的像素点为(x,y),x…

接口开发—hrun语法和用例规范

学习目标&#xff1a; 1、常见的抓包方法 2、如何提取和使用token 3、用例规范 4、辅助函数 具体内容&#xff1a; 1、常见的抓包方法 做接口测试前&#xff0c;肯定需要使用抓包工具去请求接口&#xff0c;然后才开始正常写接口用例。 常用的2种抓包方法有&#xff1a…

FreeRTOS——内存管理知识总结及实战

1 freeRTOS动态创建与静态创建 动态创建&#xff1a;从FreeRTOS 管理的内存堆中申请创建对象所需的内存&#xff0c;在对象删除后&#xff0c; 这块内存释放回FreeRTOS管理的内存堆中 静态创建&#xff1a;需用户提供各种内存空间&#xff0c;并且使用静态方式占用的内存空间一…

分配器allocators

STL六大组件之一分配器allocators 分配器&#xff1a;负责空间的配置与管理&#xff08;写在容器类型的后面&#xff0c;如右图&#xff0c;作用是帮容器分配内存&#xff0c;一般都 会省略不写&#xff0c;源代码有默认的&#xff09; #include <vector>vector<…

linux下安装Nginx及其常用命令

安装Nginx 接下来在Linux服务器进行操作就可以了 安装插件 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel直接使用wget进行安装(如果没有wget需要先安装wget) yum install wgetwget https://nginx.org/download/nginx-1.24.0.tar.gz解压 tar -zxvf nginx..…

python的课后练习总结4(while循环)

for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. i 1while i < 5:print(i)i i 11、使用wh…

pypdf 将 PDF两个页面拼接成一个页面进一步详解

pypdf 原库名Pypdf2(已弃用&#xff0c;文档 PyPDF2 RectangleObject类_w3cschool) pypdf 官方文档 The Transformation Class — pypdf 3.17.4 documentation pypdf 将两个PDF页面在x轴&#xff0c;y轴进行平移调整位置之后&#xff0c;直接用merge_page拼接在一起&#xff…

python学习曲线绘制

1. 学习曲线的绘制 learning_curve的使用案例 learning_curve 函数是 Scikit-learn 库中用于生成学习曲线的工具。以下是该函数的主要参数及其解释&#xff1a; estimator: 模型估计器&#xff08;estimator&#xff09;&#xff0c;即要评估性能的机器学习模型。这是必需的参…

KubeSphere 社区双周报 | 2023.12.21-2024.01.04

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.12.21-2024.…

AOP(面向切面编程)基于注解方式配置

不会注解的小伙伴看这里哦&#xff1a;Spring常用注解&#xff01;&#xff01;&#xff01;-CSDN博客 pom.xml <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version&g…

Python从入门到网络爬虫(内置函数详解)

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…

苹果Mac图像修图软件Photomator和Pixelmator Pro 有什么区别?

同为一个团队设计的Mac修图软件Photomator和Pixelmator Pro有哪些区别呢&#xff1f;有哪些不一样的功能&#xff1f; Photomator和Pixelmator Pro区别如下&#xff1a; 1、用途不同 Photomator 和 Pixelmator Pro 是两个功能强大的应用程序&#xff0c;具有两个不同的用途。…