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 是针对所有环境(mainrendererpreloadweb)统一的。因为这些插件的功能通常是跨环境的(即无论是在浏览器端、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站去

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

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

相关文章

浏览器渲染流程

1.渲染模式 标准模式和怪异模式(Quirks Mode)是两种不同的文档渲染模式,用于指示浏览器如何解析HTML、CSS等页面内容。标准模式是指浏览器按照W3C规范的流程进行解析和渲染网页,这样可以确保不同浏览器对同一份代码的渲染结果基本…

ElementUI 问题清单

1、form 下面只有一个 input 时回车键刷新页面 原因是触发了表单默认的提交行为&#xff0c;给el-form 加上submit.native.prevent就行了。 <el-form inline submit.native.prevent><el-form-item label"订单号"><el-inputv-model"query.order…

ArcGIS求取多个点距离线要素的最近距离以及距离倒数

本文介绍在ArcMap软件中&#xff0c;对于点要素中的每一个点&#xff0c;求取其距离最近的道路的距离、距离倒数的方法。 首先&#xff0c;看一下本文的需求。现在已知一个点要素&#xff0c;其中含有多个点&#xff0c;假设每一个点表示城市中的一家商店&#xff1b;同时&…

【数据库系列】Spring Boot如何配置Flyway的回调函数

Flyway 提供了回调机制&#xff0c;使您能够在特定的数据库迁移事件发生时执行自定义逻辑。通过实现 Flyway 的回调接口&#xff0c;可以在迁移前后执行操作&#xff0c;如记录日志、执行额外的 SQL 语句等。 1. 创建自定义回调类 要配置 Flyway 的回调函数&#xff0c;需要创…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 &#xff08;1&#xff09;截获&#xff1a;攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为“截获”。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元&#xff08;PDU&#xff09;而不干扰信…

【查询基础】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

计算机毕业设计Python+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C语言——指针基础

1 指针基础 怎么获得变量地址 1 如何产生一个指针变量——>类型* 标识符;int* p1;char* p2;double* p3;//不同类型的基本指针占用内存是一样的都是4个字节&#xff08;32位&#xff09;/8个字节&#xff08;64位&#xff09;&#xff0c;都是存的地址2 数组名是数组首地址…

Python语法基础---正则表达式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们这个文章所讲述的&#xff0c;也是数据分析的基础文章&#xff0c;正则表达式 首先&#xff0c;我们在开始之前&#xff0c;引出一个问题。也是我们接下来想要解决的问题。…

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装&#xff1a; UDP数据分用&#xff1a; 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid&#xff0c;在操作系统中二者的…

容器运行应用及Docker命令

文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…

JDK17 下载与安装

下载安装包 针对不同的操作系统, 需要下载对应版本的 JDK. 如果电脑是 Windows32 位的, 建议重装系统, 重装成 64 位的操作系统. 因为 Java 从 9 版本开始, 就已经不提供 32 位版本的安装包了. 官网下载 官网下载链接 需要登录 Oracle 账号才能下载. 账号: 2872336204qq.c…

6.1 innoDb逻辑存储结构和架构-简介

InnoDB 是 MySQL 默认的存储引擎&#xff0c;以其强大的事务支持、崩溃恢复能力和高效的数据处理能力广受欢迎。本文从逻辑存储结构、内存架构、磁盘结构到后台线程&#xff0c;逐步剖析 InnoDB 的关键概念&#xff0c;帮助您更好地理解和应用。 1. 逻辑存储结构 InnoDB 的数据…

SpringBoot小知识(4):高级配置知识与bean的绑定

一、EnableConfigurationProperties ConfigurationProperties注解在我们之前讲过&#xff0c;他是从配置中读取参数封装给实体类的一个注解。 那么EnableConfigurationProperties是个啥呢&#xff1f; EnableConfigurationProperties 是 Spring Framework 中用于启用基于配置文…

Vue 实现无线滚动效果

目录 1.Element-plus官网中的Infinite Scroll组件说明 2.滚动条设置 3.滚动到底部的函数调用 1.Element-plus官网中的Infinite Scroll组件说明 官网链接如下所示&#xff1a; Infinite Scroll 无限滚动 | Element Plus 首先查看该代码&#xff0c;发现这个组件使用了一个…

Spring Cloud Alibaba 之 “Sentinel”

从网上下载好sentinel-dashboard-1.6.3.jar&#xff0c;然后执行 java -jar sentinel-dashboard-1.6.3.jar,执行成功之后在浏览器输入localhost:8080&#xff0c;Sentinel的登录名和密码都是sentinel,登陆成功之后看到只有一个首页。 接下来开始整合Spring Cloud Alibaba Sen…

【Android】从事件分发开始:原理解析如何解决滑动冲突

【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突 文章目录 【Android】从事件分发开始&#xff1a;原理解析如何解决滑动冲突Activity层级结构浅析Activity的setContentView源码浅析AppCompatActivity的setContentView源码 触控三分显纷争&#xff0c;滑动冲突…

用友NC yerfile/down SQL注入漏洞复现(XVE-2024-34596)

0x01 产品简介 用友NC(也称用友NC6或NCC)是用友网络科技股份有限公司开发的一款企业级管理软件,旨在为企业提供全方位的管理服务。主要面向大型企业和集团公司,提供全面的财务和业务管理解决方案,助力企业实现数字化转型和高效管理。采用J2EE架构和先进开放的集团级开发平…

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…

18 - Java 线程

简介 进程&#xff08;process&#xff09; 对一个程序的运行状态, 以及在运行中所占用的资源(内存, CPU)的描述&#xff1b; 一个进程可以理解为一个程序; 但是反之, 一个程序就是一个进程, 这句话是错的。 进程的特点: 独立性: 不同的进程之间是相互独立的, 相互之间资源…