简介
使用 TypeScript
(TS) 编写 Electron
应用程序带来了许多好处,以下是一些主要优势:
- 类型安全:
TypeScript
是一种静态类型语言,它在编译时检查类型错误,这有助于在开发过程中及早发现潜在的错误。 - 更好的工具支持:
TypeScript
提供了丰富的工具链支持,包括智能代码补全、重构、导航和错误检测等,这些工具可以显著提高开发效率 - 易于维护:
TypeScript
的类型系统和模块化特性使得代码更加易于理解和维护,特别是在大型项目中。 - 代码重用:
TypeScript
的类型定义文件(.d.ts
)允许开发者为现有的JavaScript
库提供类型定义,从而在Electron
项目中重用这些库
使用 TypeScript
开发 Electron
应用程序可以带来更高质量的代码和更愉快的开发体验.
esbuild
我们用到 ts
就需要用一种打包工具来打包。市面上打包工具很多。此处选择 esbuild
.
esbuild
是一个高性能的 JavaScript
和 TypeScript
打包器,它由 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
打包的安装包快了好几倍。
– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。