当前位置: 首页 > news >正文

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

最近开发时遇到了这样的需求,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

相关文章:

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

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

[单例模式]

目录 [设计模式] 单例模式 1. 饿汉模式 2. 懒汉模式 3. 单例模式的线程安全问题 [设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里…...

速盾:游戏盾的功能和原理详解

速盾有一款专注于网络游戏安全的防护系统,它通过实时监测游戏网络流量和玩家行为,以及使用先进的算法和技术进行分析和识别,检测出各种外挂、作弊行为和恶意攻击,从而保障游戏的公平性和玩家的安全性。 速盾游戏盾的主要功能包括…...

Spleeter:音频分离的革命性工具

目录 什么是Spleeter?Spleeter的工作原理Spleeter的应用场景Spleeter的技术优势Spleeter的挑战与局限性结论 什么是Spleeter? Spleeter 是一个由 Deezer 开发的开源音频源分离工具。它基于深度学习技术,尤其是卷积神经网络(CNN&a…...

【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程

文章目录 0. 前言1. 部分观测的马尔可夫决策过程1.1 POMDP的思想以及与MDP的联系1.1.1 MDP的过程回顾1.1.2 POMDP定义1.1.3 与MDP的联系及区别POMDP 视角MDP 视角决策次数对最优解的影响 1.2 POMDP的3种常规解法1.2.1 连续状态的“Belief MDP”方法1. 信念状态的定义2. Belief …...

openresty入门教程:access_by_lua_block

在OpenResty中,access_by_lua_block 是一个功能强大的指令,它允许你在Nginx的访问控制阶段执行Lua脚本。这个阶段发生在Nginx处理请求的过程中,紧接在rewrite阶段之后,但在请求被传递到后端服务器(如PHP、Node.js等&am…...

Caused by: org.apache.flink.api.common.io.ParseException: Row too short:

Flink版本 1.17.2 错误描述 Caused by: org.apache.flink.api.common.io.ParseException: Row too short: 通过flink中的flinkSql直接使用对应的connector去获取csv文件内容,报获取的数据太短了 可能原因 1.创建的表字段多于csv文件当中的表头 定位 在获取csv…...

hbase的安装与简单操作

好的,这里是关于 HBase 的安装和基本操作的详细步骤,分成几个更清晰的阶段: 第一部分:安装和配置 HBase 1. 环境准备 HBase 依赖于 Hadoop,因此首先确保 Hadoop 已经正确安装和配置。如果没有安装,请先下…...

PySpark本地开发环境搭建

一.前置事项 请注意,需要先实现Windows的本地JDK和Hadoop的安装。 二.windows安装Anaconda 资源:Miniconda3-py38-4.11.0-Windows-x86-64,在window使用的Anaconda资源-CSDN文库 右键以管理员身份运行,选择你的安装路径&#x…...

【进阶】Stable Diffusion 插件 Controlnet 安装使用教程(图像精准控制)

Stable Diffusion WebUI 的绘画插件 Controlnet 最近更新了 V1.1 版本,发布了 14 个优化模型,并新增了多个预处理器,让它的功能比之前更加好用了,最近几天又连续更新了 3 个新 Reference 预处理器,可以直接根据图像生产…...

调试、发布自己的 npm 包

查看 npm 的配置 npm config ls登录 whoami 查看当前登录的用户 npm whoamiaduser 登录 adduser 有以下参数: –scope 作用域–registry 注册地址 默认地址:https://registry.npmjs.org/,也可通过.npmrc文件配置 npm login 是 …...

拓扑学与DNA双螺旋结构的奇妙连接:从算法到分子模拟

拓扑的形变指的是通过连续地拉伸、弯曲或扭曲物体而不进行撕裂或粘合来改变其形状的一种数学变换。拓扑形变属于拓扑学的一个分支,研究在这些操作下保持不变的性质。简单来说,它关注的是物体“形状的本质”,而不是具体的几何形状。 拓扑形变…...

mysql数据库(四)单表查询

单表查询 文章目录 单表查询一、单表查询1.1 简单查询1.2where1.3group by1.4having1.5order by1.6limit 一、单表查询 记录的查询语法如下: SELECT DISTINCT(去重) 字段1,字段2… FROM 表名 WHERE 筛选条件 GROUP BY 分组 HAVING 分组筛选 ORDER BY 排序 LIMIT 限…...

JavaEE初阶---properties类+反射+注解

文章目录 1.配置文件properities2.快速上手3.常见方法3.1读取配置文件3.2获取k-v值3.3修改k-v值3.4unicode的说明 4.反射的引入4.1传统写法4.2反射的写法(初识)4.3反射的介绍4.4获得class类的方法4.5所有类型的class对象4.6类加载过程4.7类初始化的过程4…...

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发

功能级一多开发与工程级一多开发 引言功能级一多开发SysCaps机制介绍能力集canlUse接口 工程级一多开发三层架构规范 引言 一次开发多端部署 定义:一套代码工程,一次开发上架,多端按需部署 目标:支撑开发者快速高效的开发多终端设…...

STL常用遍历算法

概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小&#xff0c;只包括几个在序列上面进行简…...

前端开发中常见的ES6技术细节分享一

var、let、const之间有什么区别&#xff1f; var: 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量​ 注意&#xff1a;顶层对象&#xff0c;在浏览器环境指的是window对象&#xff0c;在 Node 指的是g…...

行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化

1.大纲分析 针对题目“8.0 行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化”的大纲分析&#xff0c;可以从以下几个方面进行展开&#xff1a; 一、引言 简述智慧城市的概念及其重要性。强调智能交通在智慧城市中的核心地位。引出自动驾驶…...

[High Speed Serial ] Xilinx

Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动&#xff0c;并具有世界一流的自适应均衡功能&#xff0c;具有困难的背板操作所需的 PCS 功能。 Versal™ GTY &#xff08;32.75Gb/s&#xff09;&…...

Unity学习笔记(3):场景绘制和叠层设置 Tilemap

文章目录 前言开发环境规则瓦片绘制拐角 动态瓦片总结 前言 这里学一下后面的场景绘制和叠层技巧。 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff5c;4K:https://www.bilibili.com/video/BV1mL411o77x/?spm_id_from333.10…...

不吹不黑,客观理性深入讨论中国信创现状

1. 题记&#xff1a; 随着美国大选尘埃落定&#xff0c;特朗普当选美国新一任总统&#xff0c;参考他之前对中国政策的风格&#xff0c;个人预计他将进一步限制中国半导体产业和信创产业的发展。本篇博文不吹不黑&#xff0c;客观理性深入探讨中国信创现状。文中数据来自权威媒…...

NoSQL大数据存储技术测试(2)NoSQL数据库的基本原理

写在前面&#xff1a;未完成测试的同学&#xff0c;请先完成测试&#xff0c;此博文供大家复习使用&#xff0c;&#xff08;我的答案&#xff09;均为正确答案&#xff0c;大家可以放心复习 单项选择题 第1题 NoSQL的主要存储模式不包括 键值对存储模式 列存储模式 文件…...

「QT」几何数据类 之 QPoint 整型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

植物明星大乱斗5

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 timer.htimer.cppcamera.hcamera.cppmenuScene.cpp timer.h #pragma once #include <functional>class Timer {public:void reStart();void setTimer(int timerMs);void setIsOneShot(bool isOneShot);void …...

每日算法练习

各位小伙伴们大家好&#xff0c;今天给大家带来几道算法题。 题目一 算法分析 首先&#xff0c;我们应该知道什么是完全二叉树&#xff1a;若一颗二叉树深度为n&#xff0c;那么前n-1层是满二叉树&#xff0c;只有最后一层不确定。 给定我们一棵完全二叉树&#xff0c;我们查看…...

把握鸿蒙生态崛起机遇:开发者如何在全场景操作系统中脱颖而出

把握鸿蒙生态崛起机遇&#xff1a;开发者如何在全场景操作系统中脱颖而出 随着鸿蒙系统的逐步成熟和生态体系的扩展&#xff0c;其与安卓、iOS 形成了全新竞争格局&#xff0c;为智能手机、穿戴设备、车载系统和智能家居等领域带来了广阔的应用前景。作为开发者&#xff0c;如…...

字符串类型排序,通过枚举进行单个维度多个维度排序

字符串类型进行排序通过定义枚举值实现 1.首先创建一个测试类&#xff0c;并实现main方法 2.如果是单个维度的排序&#xff0c;则按照顺序定义一个枚举 public enum Risk {高风险,中风险,一般风险,低风险 } public static void main(String[] args) { }3.main方法里实现如下…...

figma的drop shadow x:0 y:4 blur:6 spread:0 如何写成css样式

figma的drop shadow x:0 y:4 blur:6 spread:0 如何写成css样式 在CSS中&#xff0c;我们可以使用box-shadow属性来模拟Figma中的Drop Shadow效果。box-shadow属性接受的值分别是&#xff1a;横向偏移、纵向偏移、模糊半径、扩展半径和颜色。 但是&#xff0c;Figma的Drop Sha…...

基于Matlab 疲劳驾驶检测

Matlab 疲劳驾驶检测 课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI&#xff0c;通过输入视频&#xff0c;分帧&#xff0c;定位眼睛和嘴巴&#xff0c;通过眼睛和嘴巴的张合度&#xff0c;来判别是否疲劳。 二、操作步骤 第一步&#xff1a;最…...

Linux内核.之 init文件,/init/main.c

想要熟悉内核&#xff0c;看下源码&#xff0c;就非常清晰 Linux内核&#xff0c;head.s&#xff0c;汇编启动cpu相关设置后&#xff0c;启动init文件里的&#xff0c;文件在内核的/init/main.c&#xff0c;看下main函数&#xff0c;做了哪些工作 // SPDX-License-Identifier: …...

武汉手机网站制作公司/宁波seo外包

C11 long long超长整形详解 C 11 标准中&#xff0c;基于整数大小的考虑&#xff0c;共提供了如表 1 所示的这些数据类型。与此同时&#xff0c;标准中还明确限定了各个数据类型最少占用的位数。 表 1 C11标准中所有的整形数据类型 整数类型等价类型C11标准规定占用最少位数…...

万业网网站建设审核/seo视频网页入口网站推广

如果只考虑有序树的情形&#xff0c;那么具有7个结点的不同形态的树共有【】 A、132 B、154 C、429 D、前三者均不正确 答案&#xff1a;A 解析&#xff1a;具有 n 个结点不同形态的树 和具有 n-1 个结点不同形态的二叉树数量相同。因此本题转换为求 6个结点不同形态的二…...

怎么做网店网站/百度一下你就知道官网下载安装

Spring Security 是基于web的安全组件&#xff0c;所以一些相关类会分散在 spring-security包和web包中。Spring Security通过自定义Servlet的Filter的方式实现&#xff0c;具体架构可参考官网Spring Security: Architecture 这里使用Spring Boot 2.7.4版本&#xff0c;对应Sp…...

网站的专区怎么建设/曹操论坛seo

文章目录1.运行时数据区⭐运行时常量池《深入理解Java虚拟机》第六章中关于常量池的解释&#xff1a;知乎&#xff1a;JVM详解之:运行时常量池&#xff1a;[https://zhuanlan.zhihu.com/p/160770086](https://zhuanlan.zhihu.com/p/160770086)字符串常量池2.3 对象的创建3.对象…...

徐州泰安抖音代运营/seo技术教程

说起来很搞笑&#xff0c;我在用 sublime 3 写排序算法的时候&#xff0c;准备用 nodejs 来运行&#xff0c;就用 sublime 3 提供的编译功能。但问题来了&#xff0c;我比较挫&#xff0c;写了个死循环&#xff0c;然后 sublime 3 也不给输出提示&#xff0c;我很疑惑的连续跑了…...

河南省住房和城乡建设厅网站主页/靠谱的影视后期培训班

超声波切割机是一种专门用于切割的超声波设备&#xff0c;是超声波应用的重要门类之一。超声波设备_百度百科​baike.baidu.com原理与传统的切割完全不同。超声波切割机利用超声波的能量&#xff0c;将被切割材料的局部加热熔化&#xff0c;从而达到切割材料的目的。超声波切割…...