多平台编包动态引入依赖的解决方案

最近开发时遇到了这样的需求,A 平台需要引入一个 video.js,B 平台却是不需要的,那么面向 B 平台打包的时候把依赖装进去自然就不大合适。最好的方法是动态引入依赖,根据平台来判断要不要引入

动态引入依赖

很快啊,动态引入依赖的代码就写好了

if (window.isPlatformA()) {import("!video.js").then((videojsModule) => {const videojs = videojsModule.default;......})
}

关于为什么 video.js 前要加 ! 见 Webpack and Video.js,简单来说就是 webpack 会破坏 video.js 的代码,让它不好使了,从现象来看就是视频一直处于 loading 状态。所以通过这种写法来使得 video.js 不经过 webpack

自信启动,npm start!

播不出来 /(ㄒoㄒ)/~~

Uncaught ReferenceError: D_Projects_XXX_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_11__ is not defined

点进去看调用栈,是 babel 运行时的一个模块,没解析出来
这玩意搜也不好搜,只能拆开搜 createClass、babel runtime helpers 之类的。有的说给 babel 的 presets 里面加 “absoluteRuntime”: false,这个是管绝对路径的,感觉没什么用;还有人说是 babel runtime 的版本要换,我这都没有 babel runtime。。

不对,既然是在代码跑起来的时候去动态的判断某些数值然后采取不同的措施,这意思不正是所谓的“运行时”嘛!再看 @babel/runtime 的介绍,@babel/runtime is a library that contains Babel modular runtime helpers,原来报错中提到的 babel runtime helpers 是出自它手

npm install @babel/runtime

解决了!

预编译优化

完成动态 import 之后,直接进行编包,结果完全没有缩小啊!

想想也是,加载的时候按需加载,这是针对浏览器的,浏览器的负担确实是小了。但是编包的时候,webpack 一看,这个 chunk 有可能会用到也有可能不会用到,那么我是把它打进去呢还是不打进去呢?还是打进去吧。这样的话,包就不可能小

C++ 的项目里,有通过 #ifdef 来实现预编译,动态决定编译时是否执行某段代码,js 有没有这种机制呢

果然,webpack 有一个叫 DefinePlugin 的 plugin(https://www.webpackjs.com/plugins/define-plugin/),可以起到类似 #define 的效果

 	plugins: [new webpack.DefinePlugin({IS_PLATFORM_A: JSON.stringify(false),}),] 

修改 import 处的条件

if (IS_PLATFORM_A) {import("!video.js").then((videojsModule) => {const videojs = videojsModule.default;......})
}

最后修改 uglifyjs 的配置,enable dead_code,使之过滤掉所有进不去的代码

compress: {dead_code: true,
},

成功!
最后编出来的包比之前小了近 2000 KB

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue2中使用vue-awesome-swiper实现轮播

swiper官方文档:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 1.安装 注意:swiper和vue-awesome-swiper的版本一定一定一定要相对应,版本对应如下: Swiper 5-6 vue-awesome-swiper4.1.1(vue2) Swiper 4.x vue-awesome-swi…

机器学习—神经网络中的层

大多数现代神经网络的基本组成部分是一层神经元,本篇文章中,你将学会如何构造一层神经元,一旦你把它放下,你就能把那些积木,把它们放在一起形成一个大的神经网络。 一层神经元是如何工作的? 下面是我们从…

51单片机教程(四)- 点亮LED灯

1、项目分析 让输入/输出口的P1.0连接一盏LED灯进行点亮。 2、技术准备 1 LED组成 ​ 说明 二极管有 P型 和 N型材料构成,通常是:硅/锗 掺杂其他元素(硼、磷等) 电子是带负电的,是负电荷的载体,电子流…

青训1_1105_03 最小替换子串长度

.md 文章目录 请添加图片描述一 问题描述测试样例示例 二 思路个人思路(ERROR)思路(right) !!解题思路 详细答案三、理解1、 理解嵌套循环:也就是连续子串的所有可能性位置-看懂了2、问题又来了,即使确定了能得到不同长度连续子串&#xff0c…

222页PPT集团公司供应链管理SOP计划管理流程规划

S&OP(Sales & Operations Planning),即销售与运营计划,也被称为产销协同,是一种综合性的企业管理方法。以下是对S&OP计划管理流程规划的详细内容: 一、S&OP的基本概念与目的 S&OP是一…

第三十五篇:HTTP报文格式,HTTP系列二

HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol。 前面我们讲到第三章中网络协议的定义,网络协议的定义:网络协议是通信计算机双方必须共同遵从的一组约定。就像两个人要进行交流,如果不制定一套约定,一方…

华夏教育集团《梦回延安》全国巡演河南站纪实

传承红色精神,推动中国式家校共育。日前,由华夏教育集团太阳谷华夏学校携手河南少年先锋学校、世纪先锋学校联合推出的大型红色舞台剧《梦回延安》在河南省人民会堂精彩亮相。 河南是中华文明的发祥地之一,此次《梦回延安》舞台剧首次走出辽宁…

Idea如何推送项目到gitee

第一步:先在你的gitee创建一个仓库 第二步: 点击推送 点击定义远程,将URL换成你仓库的,填好你的用户名和密码 可以看到已经推送到仓库了

Leecode:977. 有序数组的平方

题目 ——Leecode:977. 有序数组的平方 目录 题目 ——Leecode:977. 有序数组的平方 题目分析 暴力解法: 双指针解法: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排…

动态规划-两个数组的dp问题——44.通配符匹配

1.题目解析 题目来源:44.通配符匹配——力扣 测试用例 2.算法原理 1.状态表示 本题属于两个数组的dp问题,这里需要使用p中的字符消去s中的字符且p中有特殊字符可以匹配s中的普通字符,属于寻找相同子序列的变式,所以需要一个二维d…

Linux命令 - 目录与文件基本操作

文章目录 1 文件系统树2 几个特殊的目录3 绝对路径与相对路径4 文件系统中跳转与浏览4.1 文件系统中跳转4.2 查看目录内容4.2.1 ls命令详解4.2.2 确定文件类型示例 5 操作目录与文件5.1 强大的通配符5.2 复制目录/文件5.3 移动/重命名目录/文件5.4 删除目录/文件5.5 创建目录5.…

基于STM32的自动化植物浇灌系统教学

引言 随着城市化进程的加快,越来越多的人开始关注家庭园艺与植物养护。基于STM32的自动化植物浇灌系统可以帮助用户在忙碌的生活中顺利管理植物的水分需求。本教学文章将指导您如何利用STM32构建一个简单实用的植物浇灌系统,实现自动浇水功能。 环境准备…

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…

【CRM系统选型指南:国内八大主流工具比较】

本文将对十大主流CRM系统进行比较:纷享销客、Zoho CRM、Pipedrive、简信CRM、HubSpot CRM、八百客CRM、金蝶CRM、浪潮CRM、销售易CRM 本文将深入评比2024年主流的CRM系统,帮助你了解各系统之间的主要区别、优缺点以及当前的发展趋势。通过详细的比较和分…

node.js的exports使用误区解释

exports和module.exports指向同一个对象,最终共享的结果,以module.exports指向的对象为准。 exports 和 module.exports 使用误区 使用require()导入的模块,使用的永远是module.exports指向的对象 实例1 exports.age 23 module.exports {n…

Maven项目的基础配置:利用IDEA将SpringBoot的项目打包成war文件

文章目录 引言Maven项目的聚合与继承(依赖管理)把项目打包成war包其他打包配置引言 利用IDEA将SpringBoot的项目打包成war文件Maven项目的聚合与继承(依赖管理)Maven项目的聚合与继承(依赖管理) 把项目打包成war包 利用IDEA将SpringBoot的项目打包成war文件:要配置启动…

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…

51c大模型~合集14

我自己的原文哦~ https://blog.51cto.com/whaosoft/11603879 # LLM 结构化数据生成原理 如何结合人工规则让 LLM 输出符合 JSON 格式的数据。 目前 LLM(Large Language Model)从文本补全到内容创作,都展示出了强大的生成能力。然而通过 L…

CSRA的LINUX操作系统24年11月2日下午上课笔记

压缩和解压缩:zip 、gzip、bz、xz # zip 压缩 # 压缩文件夹 # 解压缩 # unzip -v 查看压缩包中的内容 # bzip2 dir1/* :将dir1中的所有文件压缩 # gzip # 压缩文件夹 # 解压缩 tar 归档命令: # 创建tar包 tar -c*f # 释放tar包 tar -xf[c] # c …

MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符

一、问题 MyBatis 返回 Map 或 List时,时间类型数据,默认为LocalDateTime Springboot 响应给前端的LocalDateTime,默认含有’T’字符,如何统一配置去掉 二、解决方案 1、创建配置类,对ObjectMapper对象进行定制&am…