Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
前言
我这边一直用的electron-vue框架是基于electron 21版本的,electron 29版本追加了很多新功能,但是这些新功能对开发者不友好,对electron构建出来的软件,使用者更安全,所以,我暂时不想研究electron 29版本,可发挥的地方又收窄了,electron这种东西越用越喜欢,嵌入进来的网页,可以自己想怎么搞就怎么搞,比起浏览器开发,真是专门为开发者独家打造的。
背景
electron-vue 老代码是不支持 data?.这种新式 ES 语法不支持打包,如若支持的话,又发现新版的 babel 插件又依赖于 babel7,导致出现 babel 版本冲突,最后的解决方案,则是全面升级 babel 至 babel7,并且适配好 webpack4(目前 electron-vue 框架正在用的),现将整个升级过程记录,同时也完善下.babelrc 配置文件在代码中如何生效的。
注意事项
electron 打包preload.js时如果是webview或者renderer.src="chrome-extesion://xxxxx" 这样开头的,是不支持module.exports 开头的,这种开头是node.js环境下的commonjs模块化支持,chrome-extension://xxxx 这个环境应该更特殊,更像target:"web"环境,但却支持require("electron"),目前我还没完全掌握规律,所以基于chrome-extension://xxxx 环境,还是老老实实自己写代码。
PS: chrome-extension://xxxxx 是个什么鬼?这是谷歌插件提供的option.html页面的访问协议,不懂得可以去谷歌一下,后续会出谷歌插件开发高级课程。
升级过程
卸载已安装的 babel 版本
npm uninstall babel-core babel-preset-env babel-plugin-transform-runtime babel-register babel-minify-webpack-plugin babel-loader
安装 Babel7 和其他相关依赖
-- babel7 核心库
npm install --save-dev @babel/core@7 @babel/cli@7 @babel/preset-env@7 babel-loader@8
-- 安装可选链、?? 判断插件
npm install --save-dev @babel/plugin-proposal-optional-chaining@7 @babel/plugin-proposal-nullish-coalescing-operator@7-- 安装 Babel 的 runtime 插件(如果您的代码使用了 async/await 或者 generator 函数等)
npm install --save-dev @babel/plugin-transform-runtime@7 @babel/runtime@7
适配 webpack 的 terser
npm install terser-webpack-plugin@4.2.3 --save-dev
安装一些其他 babel 插件
npm install @babel/plugin-proposal-optional-chaining @babel/plugin-proposal-nullish-coalescing-operator @babel/plugin-proposal-class-properties @babel/plugin-proposal-private-methods @babel/plugin-transform-runtime --save-dev
babel 关键插件解释:
这些插件分别用于以下功能:
-
@babel/plugin-proposal-optional-chaining: 允许在代码中使用可选链操作符(?.)。 -
@babel/plugin-proposal-nullish-coalescing-operator: 允许在代码中使用空值合并操作符(??)。 -
@babel/plugin-proposal-class-properties: 允许使用类属性语法。 -
@babel/plugin-proposal-private-methods: 允许使用私有方法语法(例如:#privateMethod)。 -
@babel/plugin-transform-runtime: 用于将一些 ES6+ 的功能(如 Generator 函数)转化为兼容性更好的代码,同时避免重复的代码冗余。
.babelrc 配置怎么用
.babelrc 集中配置了几种 babel env 环境的配置,在具体的 webpack 打包配置时,可以通过设置环境变量来使用具体的配置

.babelrc preload 环境截图

为什么配置在 plugins 下统一?
-
plugins是针对所有环境(main,renderer,preload,web)统一的。因为这些插件的功能通常是跨环境的(即无论是在浏览器端、Node.js 环境,还是 Electron 渲染进程中,使用这些插件的代码行为应该一致)。所以将它们放到plugins配置中统一管理,可以减少冗余的配置。
附带 preload 的 webpack 打包配置代码
完全精简版的 preload 配置代码
'use strict'process.env.BABEL_ENV = 'preload'const path = require('path')
const {dependencies} = require('../../package.json')
const webpack = require('webpack')
const TerserPlugin = require('terser-webpack-plugin');// 获取当前配置文件的名称 (不包含扩展名)
const configFileName = path.basename(__filename, '.js');// 提取文件名中的第二个单词并将其转换为 kebab-case
const secondWord = configFileName.split('.')[1]; // 提取文件名中的第二个单词
const caseFileName = secondWord.split('-')[1]/*** List of node_modules to include in webpack bundle** Required for specific packages like Vue UI libraries* that provide pure *.vue files that need compiling* https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals*/
let whiteListedModules = ['vue', 'element-ui']
console.log(path.join(__dirname, `../../src/renderer/preload/${caseFileName}/main.js`))
let preloadLineConfig = {// 添加以下一行,设置 modemode: process.env.NODE_ENV === 'production' ? 'production' : 'development',devtool: process.env.NODE_ENV === 'production' ? false : '#cheap-module-eval-source-map',entry: {renderer: path.join(__dirname, `../../src/renderer/preload/${caseFileName}/main.js`),},externals: [...Object.keys(dependencies || {}).filter((d) => !whiteListedModules.includes(d)),],module: {rules: [{test: /\.js$/,use: [{loader: 'babel-loader',options: {cacheDirectory: true}},],exclude: /node_modules/,},{test: /\.node$/,use: 'node-loader',},],},node: {__dirname: process.env.NODE_ENV !== 'production',__filename: process.env.NODE_ENV !== 'production',},plugins: [new webpack.NoEmitOnErrorsPlugin(),],output: {filename: '[name].js',libraryTarget: 'commonjs2',path: path.join(__dirname, `../../dist/electron/preload`),},resolve: {extensions: ['.js', '.node'],},optimization: {minimize: true,minimizer: [new TerserPlugin({parallel: true, // 开启多线程压缩cache: true,terserOptions: {// 在这里添加 Terser 的配置选项compress: {drop_console: true, // 例如,移除 console.log},},}),],},target: 'electron-preload',
}/*** Adjust preloadLineConfig for development settings*/
if (process.env.NODE_ENV !== 'production') {preloadLineConfig.plugins.push(new webpack.DefinePlugin({__static: `"${path.join(__dirname, '../../static').replace(/\\/g, '\\\\')}"`,}))
}/*** Adjust preloadLineConfig for production settings*/module.exports = preloadLineConfig
延伸技术
使用 webstorm 的开发者,只要将 node_modules 目录标记为源码,或者从排除中剔除,webstorm 就会自动扫描 node_modules 下的所有源代码,并且提供最好的提示效果

原来没有提示性的代码有了提示性,windows 快捷键 Ctrl+鼠标左键,可以点击这个 Plugin 看源码

可以看到很多 webpack 插件,这些插件用 AI 来解释下:

webpack 插件说明
这些东西虽然不需要记忆,但是的确在以后的打包过程中动态地处理一些东西时非常有用,包括引用路径,引用的资源,甚至定义的不同变量都是能用到的
-
AutomaticPrefetchPlugin: 自动预加载资源,提升加载性能。
-
BannerPlugin: 为打包的文件添加横幅注释。
-
CachePlugin: 控制构建缓存,优化构建速度。
-
ContextExclusionPlugin: 排除不需要的上下文模块,减少打包体积。
-
ContextReplacementPlugin: 替换模块上下文,优化构建和运行时行为。
-
DefinePlugin: 定义全局常量,替换代码中的指定值。
-
Dependency: 处理模块依赖关系。
-
DllPlugin: 提前构建并生成 DLL(动态链接库)文件,提升构建速度。
-
DllReferencePlugin: 引用其他 DLL 文件,优化构建性能。
-
EnvironmentPlugin: 设置环境变量,常用于配置和优化。
-
EvalDevToolModulePlugin: 提供源映射,用于开发模式下调试。
-
EvalSourceMapDevToolPlugin: 提供 eval-based 源映射,优化开发调试。
-
ExtendedAPIPlugin: 扩展 Webpack 的 API 功能。
-
ExternalsPlugin: 将外部库(如 CDN)排除在打包之外,减少打包文件大小。
-
HashedModuleIdsPlugin: 使用模块的哈希值来生成唯一 ID,提升长期缓存效果。
-
HotModuleReplacementPlugin: 支持热模块替换,实时更新应用而无需重新加载页面。
-
IgnorePlugin: 忽略不需要的模块或文件,优化打包。
-
LibraryTemplatePlugin: 用于库的打包,生成适合库的模板。
-
LoaderOptionsPlugin: 为加载器提供选项配置。
-
LoaderTargetPlugin: 设置加载器的目标环境,指定如何处理模块。
-
MemoryOutputFileSystem: 使用内存文件系统,在内存中存储构建文件,提升速度。
-
Module: 处理和加载模块的基本单元。
-
ModuleFilenameHelpers: 帮助工具类,生成模块的文件名。
-
NamedChunksPlugin: 使用模块名称生成输出的 chunk 名称。
-
NamedModulesPlugin: 为模块分配更易于理解的名称,方便调试。
-
NoEmitOnErrorsPlugin: 构建失败时不生成输出文件,避免错误文件的生成。
-
NormalModuleReplacementPlugin: 替换模块的正常流程,允许条件性加载不同模块。
-
PrefetchPlugin: 提前加载指定的模块,提升页面加载性能。
-
ProgressPlugin: 打包过程中显示进度信息。
-
ProvidePlugin: 自动加载某些模块或变量,避免在每个文件中显式引入。
-
SetVarMainTemplatePlugin: 设置入口模板,通常用于自定义构建模板。
-
SingleEntryPlugin: 为单一入口提供插件支持。
-
SourceMapDevToolPlugin: 生成源映射文件,帮助开发调试。
-
Stats: 输出 Webpack 构建过程的统计信息。
-
Template: 模板引擎,用于构建输出内容。
-
UmdMainTemplatePlugin: 生成 UMD(通用模块定义)格式的模板,支持多平台。
-
WatchIgnorePlugin: 在开发过程中,忽略某些文件或目录,避免不必要的重新构建。
补充
目前探索electron-vue这个环境直接升级webpack 5打包,没有成功,后续我将借助AI来从新构建基于node.js 18版本下的webpack5的各种依赖
另外关于electron-vue框架的详细精讲也会录个视频发到B站去
相关文章:
Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
前言 我这边一直用的electron-vue框架是基于electron 21版本的,electron 29版本追加了很多新功能,但是这些新功能对开发者不友好,对electron构建出来的软件,使用者更安全,所以,我暂时不想研究electron 29版…...
github仓库自动同步到gitee
Github Actions是Github推出的自动化CI/CD的功能,我们将使用Github Actions让Github仓库同步到Gitee 同步的原理是利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中,所以我们需要以下几个步骤 生成 SSH 公私钥添加公钥添加私钥配…...
汽车仪表板可识别安全气囊,安全带,ABS,邮箱,灯等多种告警参数,YOLO,VOC,COCO三种方式标记的数据集整理
关于数据集介绍: 汽车仪表板可识别安全气囊,安全带,ABS,邮箱,灯等多种告警参数,YOLO,VOC,COCO三种方式标记的数据集。 可识别常见的: 安全气囊和安全带系统 ,…...
springboot370高校宣讲会管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 高校宣讲会管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,…...
GoReplay开源工具使用教程
目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…...
UE4_材质节点_有关距离的_流体模拟
一、材质节点介绍: 特别注意:距离场需要独立显卡支持。 1、什么是距离场? 想象一下空间中只有两个实体, 一个球,一个圆柱. 空间由无数个点组成, 取其中任何一个点, 比如,它跟球面的最近距离是3, 跟圆柱面的最近距离是2, 那么这个点的值就…...
虚拟现实(VR)与增强现实(AR)有什么区别?
虚拟现实(Virtual Reality,VR)与增强现实(Augmented Reality,AR)在多个方面存在显著差异。以下是对这两者的详细比较: 一、概念定义 虚拟现实(VR): 是一种…...
浏览器中输入一个URL后,按下回车后发生了什么
URL ,统一资源定位符, 简单点就是网址 ip 或域名 端口号 资源位置 参数 锚点 大致流程 URL 解析DNS 查询TCP 连接处理请求接受响应渲染页面 1 .输入一个网址之后,首先浏览器通过查询 DNS ,查找这个 URL 的 IP …...
GNOME(GNU Network Object Model Environment)
定义与概述 GNOME(GNU Network Object Model Environment)是一种广泛使用的桌面环境。它是一个自由软件项目,旨在为操作系统提供一个直观、易用且功能强大的图形用户界面(GUI)。GNOME主要运行在类UNIX操作系统上&#…...
源码分析之Openlayers中的Collection类
概述 在Map类中,有一种高频出现的类Collection(即集合),比如Map类中interaction、controls和overlay的定义初始化和一些操作调用都和Collection有关。本文主要介绍 Openlayers 中Collection类的实现以及Collection类的事件机制。 源码剖析 Collection类 Collection类本质…...
Spring AI 框架介绍
Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于AI领域,并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024/12)已经支持语言,图像…...
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
UPDATE 和 DELETE 操作的正确使用 UPDATE 和 DELETE 是 Oracle 11g 中用于修改和删除表中数据的重要 SQL 语句。在操作时,需特别注意数据筛选条件的准确性,以避免意外更改或删除数据。本文将详细介绍这两种语句的用法、注意事项及相关案例。 一、UPDATE…...
Advanced Macro Techniques in C/C++: `#`, `##`, and Variadic Macros
Advanced Macro Techniques in C/C: #, ##, and Variadic Macros 文章目录 Advanced Macro Techniques in C/C: #, ##, and Variadic MacrosIllustrative Examples of Macros Using # and ##Stringification ExampleToken Concatenation ExampleNested Macros Example Key Conc…...
Maven、JAVAWeb、Servlet
知识点目标 1、MavenMaven是什么Maven项目的目录结构Maven的Pom文件Maven的命令Maven依赖管理Maven仓库JavaWeb项目 2.网络基础知识 3、ServletMaven Maven是什么 Maven是Java的项目管理工具,可以构建,打包,部署项目,还可以管理…...
分布式资源调度——yarn 概述(资源调度基本架构和高可用的实现)
此文章是学习笔记,图片均来源于B站:哈喽鹏程 yarn详细介绍 1、yarn 简介1.1 yarn的简介1.2 yarn 的基本架构1.3. yarn 的高可用 2、yarn 调度策略、运维、监控2.1 yarn 的调度策略2.1.1 FIFO scheduler(先进先出)2.1.2 容量调度2.1.3 公平调度 2.2 yarn…...
网页开发的http基础知识
请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?nameoPPo&status1。GET请求大小在浏览器中是有限制的请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的 HTTP请求…...
学习方法的进一步迭代————4
今天又在怀疑第二大脑的可靠程度 为什么呢? 还是因为自己没记住东西,感觉没学到东西。 其实自己知道大脑本就不应该用来存放知识而是用来思考知识,但是自己还是陷在里面了,我觉得其本质不是因为认知还不够,也不是因为还有点不适…...
数据科学家创建识别假图像的工具
Pixelator v2 是一款用于识别假图像的工具。它采用了全新的图像真实性技术组合,其能力超出了人眼所能看到的范围。 它能够以比传统方法更高的准确度识别图像中的细微差异,并且已被证明能够检测到小至 1 个像素的交替。 使用 SSIM 和 Pixelator v2 突出显…...
使用 GORM 与 MySQL 数据库进行交互来实现增删改查(CRUD)操作
1、安装 GORM 和 MySQL 驱动 新版本库是gorm.io/gorm go get -u gorm.io/gormgo get -u gorm.io/driver/mysql2、连接 MySQL 数据库 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log" )func main() {// 数据源名称 (DSN) 格式&a…...
Day2 生信新手笔记: Linux基础
一、基础知识 1.1 服务器 super computer 或 server 1.2 组学数据分析 组学数据:如基因组学、转录组学、蛋白质组学等; 上游分析:主要涉及原始数据的获取和初步处理,计算量大,消耗的资源较多,在服务器完…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
