文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
制作应用安装包
vite 编译完成之后,也就是执行 npm run build 指令,将在项目 dist 目录内会生成一系列的文件(如下图所示),此时 closeBundle 钩子被调用,在这个钩子中把上述生成的文件打包成一个应用程序安装包。
import path from 'path';
import fs from 'fs';
class BuildObj {
// 编译主进程代码
buildMain() {
require('esbuild').buildSync({
entryPoints: ['./src/main/mainEntry.ts'],
bundle: true,
platform: 'node',
minify: true,
outfile: './dist/mainEntry.js',
external: ['electron'],
});
}
// 为生产环境准备 package.json
preparePackageJson() {
let pkgJsonPath = path.join(process.cwd(), 'package.json');
let localPkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
let electronConfig = localPkgJson.devDependencies.electron.replace('^', '');
localPkgJson.main = 'mainEntry.js';
delete localPkgJson['scripts'];
delete localPkgJson['devDependencies'];
localPkgJson.devDependencies = {
electron: electronConfig,
};
let tarJsonPath = path.join(process.cwd(), 'dist', 'package.json');
fs.writeFileSync(tarJsonPath, JSON.stringify(localPkgJson));
fs.mkdirSync(path.join(process.cwd(), 'dist/node_modules'));
}
// 使用 electron-builder 制成安装包
buildInstaller() {
let options = {
config: {
directories: {
output: path.join(process.cwd(), 'release'),
app: path.join(process.cwd(), 'dist'),
},
files: ['**'],
extends: null,
productName: 'Electron',
appId: 'com.xxx.desktop',
asar: true,
nsis: {
oneClick: true,
perMachine: true,
allowToChangeInstallationDirectory: false,
createDesktopShortcut: true,
createStartMenuShortcut: true,
shortcutName: 'ElectronDesktop',
},
publish: [{
provider: 'generic',
url: 'http://localhost:5500/',
}],
},
project: process.cwd(),
};
return require('electron-builder').build(options);
}
}
export let buildPlugin = () => {
return {
name: 'build-plugin',
closeBundle: () => {
let buildObj = new BuildObj();
buildObj?.buildMain();
buildObj?.preparePackageJson();
buildObj?.buildInstaller();
}
}
}
这个对象通过三个方法提供了三个功能:
- buildMain。由于 ite 在编译之前会清空 dist 目录,所以在之前生成的 mainEntry.js 文件也被删除了,此处通过 buildMain 方法再次编译主进程代码。不过由于此处是在为生产环境编译代码,所以增加了 minify: true 配置,生成压缩后的代码。
- preparePackageJson。用户安装产品后,在启动应用程序时,实际上是通过 Electron 启动一个 Node.js 的项目,所以要为这个项目准备一个 package.json 文件,这个文件是以当前项目的 package.json 文件为蓝本制作而成的。里面注明了主进程的入口文件,移除了一些对最终用户没用的配置节。
- buildInstaller。这个方法负责调用 electron-builder(npm install electron-builder -D 安装 electron-builder 库) 提供的 API 以生成安装包。最终生成的安装包被放置在 release 目录下,这是通过 config.directories.output 指定的。静态文件所在目录是通过 config.directories.app 配置项指定。其他配置项,请自行查阅官网文档。
生成 package.json 文件之后,还创建了一个 node_modules 目录。此举是为了阻止 electron-builder 的一些默认行为(目前来说它会阻止 electron-builder 创建一些没用的目录或文件)。
这段脚本还明确指定了 Electron 的版本号,如果 Electron 的版本号前面有"^"符号的话,需把它删掉。这是 electron-builder 的一个 Bug,这个 bug 导致 electron-builder 无法识别带 ^ 或 ~ 符号的版本号。
做好这些配置之后,执行 npm run build 就可以制作安装包了,最终生成的安装文件会被放置到 release 目录下。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论