轻松构建Electron应用:TypeScript与esbuild的完美搭档

news2024/11/26 14:58:41

简介

使用 TypeScript (TS) 编写 Electron 应用程序带来了许多好处,以下是一些主要优势:

  1. 类型安全TypeScript 是一种静态类型语言,它在编译时检查类型错误,这有助于在开发过程中及早发现潜在的错误。
  2. 更好的工具支持TypeScript 提供了丰富的工具链支持,包括智能代码补全、重构、导航和错误检测等,这些工具可以显著提高开发效率
  3. 易于维护TypeScript 的类型系统和模块化特性使得代码更加易于理解和维护,特别是在大型项目中。
  4. 代码重用TypeScript 的类型定义文件(.d.ts)允许开发者为现有的 JavaScript 库提供类型定义,从而在 Electron 项目中重用这些库

使用 TypeScript 开发 Electron 应用程序可以带来更高质量的代码和更愉快的开发体验.

esbuild

我们用到 ts 就需要用一种打包工具来打包。市面上打包工具很多。此处选择 esbuild.

esbuild 是一个高性能的 JavaScriptTypeScript 打包器,它由 Evan Wallace 基于 golang 开发的,旨在提供快速、简单且功能丰富的模块打包解决方案。

开始

在开发应用的时候,我们先按照自己熟悉的方式创建一下项目结构。

安装

编写启动编译脚本 script\run.js


const path = require('path');
const esbuild = require('esbuild');
const child_process = require('child_process');
const electron = require('electron');
const chalk = require('chalk');
const fs = require('fs');
const electron_builder = require("electron-builder");

const method = process.argv.slice(2)[0];
const rootDir = path.join(__dirname, '../');
const defaultAppsDir = path.join(__dirname, '../apps');
const screenShotApp = path.join(__dirname, '../screenShotApp');

const mainDir = path.join(rootDir, 'src/main');
const outDir = path.join(rootDir, 'dist');
const mainEntry = path.join(rootDir, 'dist/main.js');
const RenderEntry = path.join(rootDir, 'src/render/index.html');
const execSync = child_process.execSync;
const outFlag = {
  electron: chalk.blue(`[electron] `),
};

async function init() {
  switch (method) {
    case "build":
      //创建ts打包后的路径
      fs.existsSync(outDir) && fs.rmSync(outDir, { recursive: true });
      //创建打包后的可执行文件输出目录
      fs.existsSync(path.join(outDir, '..', 'release')) && fs.rmSync(path.join(outDir, '..', 'release'), { recursive: true });
      esbuild.buildSync({
        bundle: true,
        entryPoints: [path.join(rootDir, 'src/main/main.ts'), path.join(rootDir, 'src/main/preload.ts')],
        external: ["electron", 'knex'],
        platform: "node",
        minify: true,
        outdir: outDir
      });

      // 拷贝配置文件
      fs.cpSync(path.join(rootDir, 'config.json'), path.join(outDir, 'config', 'config.json'));
      // 拷贝icon图标   
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'logo.ico'), path.join(outDir, 'logo.ico'));
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'logo_mac.ico'), path.join(outDir, 'logo_mac.ico'));
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'empty.ico'), path.join(outDir, 'empty.ico'));

      let pkg = require(path.join(rootDir, 'package.json'));
      let electronVersion = pkg.devDependencies.electron.replace("^", "");
      delete pkg.scripts;
      delete pkg.dependencies;
      delete pkg.devDependencies;
      pkg.dependencies = {
        sqlite3: "5.1.6",
        knex: "3.1.0"
      }
      pkg.devDependencies = { electron: electronVersion };
      fs.writeFileSync(
        path.join(outDir, "package.json"),
        JSON.stringify(pkg, null, 2)
      );

      await electron_builder.build({
        projectDir: outDir,
        config: {
          files: {
            filter: ["!apps", "!config"]
          },
          asar: true,
          asarUnpack: "package.json",
          directories: {
            output: path.join(rootDir, "release")
          },
          extraResources: [
            {
              from: './app',
              to: "./app",
            },
          ],
          win: {
            target: 'nsis',
            icon: 'logo.ico',
          },
          mac: {
            icon: "logo_mac.ico"
          },
          nsis: {
            oneClick: false, //是否一键安装
            installerIcon: 'logo.ico',  //安装图标
            allowToChangeInstallationDirectory: true,// 允许请求提升(仅限辅助安装程序)
            shortcutName: 'BIMCC' // 图标名称
          },
          publish: [
            {
              provider: 'generic',
              url: '',
            }
          ]
        },
      });
      break;
    case "dev":
      //测试编译
      fs.existsSync(outDir) && fs.rmSync(outDir, { recursive: true });
      esbuild.buildSync({
        bundle: true,
        entryPoints: [path.join(rootDir, 'src/main/main.ts'), path.join(rootDir, 'src/main/preload.ts')],
        external: ["electron", 'knex'],
        platform: "node",
        minify: false,
        outdir: outDir
      });

      // 拷贝配置文件
      fs.cpSync(path.join(rootDir, 'config.json'), path.join(outDir, 'config', 'config.json'));
      // 拷贝icon图标
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'logo.ico'), path.join(outDir, 'logo.ico'));
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'logo_mac.ico'), path.join(outDir, 'logo_mac.ico'));
      fs.cpSync(path.join(rootDir, 'src', 'assets', 'empty.ico'), path.join(outDir, 'empty.ico'));

      // 拷贝内置应用
      fs.cpSync(defaultAppsDir, path.join(outDir, 'app'), { recursive: true });
      //运行election
      let instance = child_process.spawn(electron.toString(), [mainEntry]);
      // 监听 electron 主进程输出
      instance.stdout.on("data", (chunk) => {
        let data = chunk.toString();
        if (data.trim().length > 0) {
          console.log(outFlag.electron + `${chunk.toString()}`);
        }
      });
      break;
    default:
      console.log(`The argument should be dev or build`);
  }
}
init().catch((e) => {
  console.log(e);
});


修改package.json 启动项

安装

完结

用了 esbuild 构建 electron 之后,electron 安装包的体积也减少了不小,构建速度和安装时间比原生 electron 打包的安装包快了好几倍。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

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

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

相关文章

RK3568平台(背光篇)背光调试常见问题

一.屏幕背光概述 背光就是屏幕的从里往照射的光。 LCD 主要由液晶面板、背光、驱动电路等组成,液晶面板不会主动发光,需要背光源才能显示,液晶面板的作用就是通过电压改变某像素光的透过率来显示的,当然此光要求是偏振光&#x…

数据结构(5.5_3)——并查集的进一步优化

Find操作的优化(压缩路径) 压缩路径——Find操作,先找到根节点,再将查找路径上所有结点都挂到根结点下 代码: //Find "查"操作优化,先找到根节点,再进行"路径压缩" int Find(int S[], int x) {…

Shell、C/C++、Python操作环境变量

环境变量 环境变量是一种在操作系统中用于存储信息的机制,这些信息可以被系统进程、应用程序和脚本访问和使用。环境变量在操作系统中的作用类似于一个全局配置参数,它们定义了操作系统的运行环境,包括系统行为、应用程序路径、用户信息等。…

uniapp自定义浮动图标、列表布局

uniapp自定义浮动图标 <button class="fab" @click="goPage"><image src="../../../static/yiyuan.png" mode="" style="width: 60rpx;height:60rpx;"></image></button>.fab {z-index: 100;positi…

TLE4966-3G带方向检测功能的高灵敏度汽车霍尔开关

TLE4966-3G是一款集成电路双霍尔效应传感器&#xff0c;专为使用旋转极轮的高精度应用而设计。通过片上有源补偿电路和斩波器技术实现精确的磁切换点和高温稳定性。 该传感器在Q2提供速度输出&#xff0c;其状态&#xff08;高或低&#xff09;与磁场值相对应。对于超过阈值BO…

小白零基础学数学建模系列-Day3-线性回归模型的构建与评估

文章目录 1 线性回归基础1.1 线性回归概念与应用1.2 数学原理与推导1.3 线性回归的实现 2 案例分析&#xff1a;房价预测2.1 加载数据2.2 数据预处理2.3 探索性数据分析2.4 观察选择特征2.5 准备训练模型的数据2.6 将数据拆分为训练集和测试集2.7 训练和测试模型2.8 模型评估 3…

Ubuntu每次登录都提示有新的更新,apt更新却0个软件需要升级:清空MOTD消息 安装update-notifier-common组件 运行强制更新脚本

问题 每登录ubuntu&#xff0c;都会显示有更新需要注意。 80更新可以立即应用。 这些更新中有 1 个是标准安全更新。 要查看这些附加更新&#xff0c;请运行&#xff1a;apt list --upgradable 然而使用更新命令却提示0可更新 查询了一下&#xff0c;这似乎是MOTD的错误&#x…

Gartner发布2024年网络风险管理成熟度曲线:使网络安全战略与业务目标保持一致的概念、方法、流程和技术

网络风险管理现在是高管和监管机构最关注的问题&#xff0c;它采用多种方法和技术来支持治理、风险管理和合规性。安全和风险管理领导者可以使用此技术成熟度曲线来评估解决方案并做出适当的采用决策。 战略规划假设 到 2026 年&#xff0c;60% 的网络安全职能将实施以业务影响…

【Qt】Qt编程注意事项

目录 Qr中的命名规范 Qt Creator中的快捷键 查询文档的方式 Qt窗口坐标体系 Qr中的命名规范 在学习编程语言阶段&#xff0c;给变量、函数、文件、类命名是非常有讲究的。 命名要有描述性&#xff0c;不要使用abc&#xff0c;xyz这种比较无规律的名字类描述。如果名字比较…

什么是前端微服务,有何优势

随着互联网技术的发展&#xff0c;传统的单体应用架构已经无法满足复杂业务场景的需求。微服务架构的兴起为后端应用的开发和部署提供了灵活性和可扩展性。与此同时&#xff0c;前端开发也经历了类似的演变&#xff0c;前端微服务作为一种新兴的架构模式应运而生。 一、前端微服…

开源web版3D展示工具Online3DViewer

Online3DViewer是一个免费且开源的Web解决方案&#xff0c;它允许用户在浏览器中直接预览和探索3D模型。 以下是关于Online3DViewer的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;Online3DViewer是一个在线3D模型查看器&#xff0c;支持多种3D文件格式&#xff0c;用…

如何评价2023年数学建模国赛?

2023年的赛题已经发布了,ABC三题侧重点不同,但是A题专业性较强,涉及微分方程,以及优化模型,B题题目为多波束测线问题,第一问需要计算,结合函数和几何的相关知识点,问题2涉及到最小路径问题,如下有总结,可以查看相应的模块方法,C题目为“蔬菜类商品的自动定价与补货决…

C++ 哈希使用与底层原理

哈希的概念 哈希是一种建立映射的思想&#xff0c;我们尝试用的数据结构是哈希表 &#xff0c;又称「散列表」&#xff0c;其通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具 体而言&#xff0c;我们向哈希表输入一个键 key &#xff0c;则可以在 &am…

Docker③_VMware虚拟机和Docker的备份与恢复

目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…

【C语言-扫雷游戏】mineweeper【未完成】

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

psychopy stroop 实验设计

斯特鲁stroop实验就是色词一致/不一致实验。 设计步骤如下&#xff1a; 1. 先去设置中将Input改为PsychToolbox&#xff0c; 2. 然后左上角File-New新建一个 3. 右键trial&#xff0c;rename改名 改成自己想要的名字即可&#xff0c;比如欢迎界面welcome。 4. 接下来添加提示语…

老阳推荐的temu选品师项目能不能做成?

在不断变化的电商领域&#xff0c;temU选品师项目作为一种新兴职业&#xff0c;受到了越来越多的关注。老阳的推荐使得这一项目引起了不少人的兴趣&#xff0c;那么&#xff0c;temU选品师项目究竟能否成功呢?让我们从一个新的角度来探讨这一问题。 新兴市场的机遇与挑战 temU…

C语言 ——— 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

目录 题目要求 代码思路 代码实现 题目要求 写一个函数&#xff0c;判断一个字符串是否为另外一个字符串旋转之后的字符串 例如 s1 "AABCD" &#xff1b;s2 "BCDAA" &#xff0c;返回1 s1 "AABcd" &#xff1b;s2 "BCDAA" …

免费分享一套SpringBoot+Vue仓库(进销存)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue仓库(进销存)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue仓库(进销存)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 该系统的设计初衷是解决传统仓库管理中存…

高可用集群KEEPALIVED

文章目录 高可用集群KEEPALIVEDVRRPkeepalived 部署环境准备 开启通信功能设置独立日志设置独立子配置文件抢占模式和非抢占模式延迟抢占非抢占模式 单播模式邮箱邮件通知脚本 双主架构实现ipvs的高可用性lvs-dr VRRP Script实现HAProxy高可用 文章相关连接如下&#xff1a; 如…