electron forge

本文介绍了如何使用electronforge创建Electron项目,强调了项目结构,包括main、preload和renderer部分。文章讨论了目前Electron入门教程的局限性,特别是对于vue、react、angular等前端框架的集成问题。通过示例展示了在vue项目中添加electron,安装依赖,配置electronforge,特别是webpack配置的修改,以适应项目需求。最后,文章提供了一个简单的项目配置总结。

electron forge是electron官方推荐的打包、分发工具,怎么说呢,可以参考的资料少之又少,不过话又说回来,其他的打包工具可以参考的内容也并不见得就很多。

在正式切入主题以前,先谈谈electron项目的开发问题。当然,几乎不论你怎么搜索electron项目入门,互联网上可追寻的踪迹依然是使用electron-builder、electron-forge等等脚手架直接init的项目指南。若是指定要vue、react、angular任意一种前端开发语言,几乎清一色的都是使用对应的项目builder依赖,完了一看,webpack、vite版本不对,依赖不对,甚至electron的可用版本还停留在上个世纪。

所以本文的意义在于,一是谈谈现状,二是谈谈如何从零开始做一个electron项目。当然,打包工具基于electron forge,虽然实际使用后forge真的有很多令人操蛋的地方,但是相信掌握了这个逻辑以后即便是换成其他打包工具也不会存在问题。

项目结构

electron的项目从严格意义上来讲,分成main、preload、renderer 3块,其中main、renderer 2块内容相互独立,perload 存在与main和renderer互相的关联。

正常来讲,从开发顺序上来讲,一般是renderer(前端项目),其次才是main和preload。无论项目是不是过分依赖于node,都可以按照这个顺序来进行开发。需要使用node的地方,通过preload进行引入并提前做好声明(针对typescript开发)。

从脚手架初始化前端(renderer)项目

以vue项目为例,直接使用vue-cli进行项目初始化。当然react、angular也是一样的,本文不针对特定的前端开发框架。

本文使用vue 3、webpack 5、electron 17进行开发。

添加electron

本文在vue项目根目录单独建立了一个文件夹electron用于存放electron项目相关文件。主要也就是main.js、preload.js。

记得添加electron的npm依赖。

添加electron forge

添加electron forge依赖,并按照官方指南进行import。

编写electron forge配置文件

electron forge的配置文件是本文的重点。当然electron forge对于项目文件的操作逻辑也是很值得借鉴的,首先编译electron的文件,其次编译renderer(前端)的项目文件。

详细的内容就看下面代码中的注释吧。

const { WebpackPlugin } = require("@electron-forge/plugin-webpack");
const CopyPlugin = require("copy-webpack-plugin");
const path = require("path")

// 导入vue的webpack构建配置,按照vue.config的说明,需要从node_modules下导入
const rendererConfig = require("./node_modules/@vue/cli-service/webpack.config.js")
// 重定向vue项目的编译输出文件目录。之所以要输出到该目录是因为forge的main默认路径(且无法更改就是该路径)
rendererConfig.output.path = `${path.resolve(__dirname)}/.webpack/main`
// 重置入口文件,使用forge的entryPoints作为唯一入口配置
rendererConfig.entry = {}
// 移除vue plugins的CopyPlugin规则,因为默认会将public复制到dist,此处的输出文件已经不是dist而是.webpack/main
rendererConfig.plugins = rendererConfig.plugins.filter((v) => (!(v instanceof CopyPlugin)));
// 添加自定义的CopyPlugin规则,这个应该可以看懂,不需要额外的解释吧?
rendererConfig.plugins.push(
  new CopyPlugin(
    {
      patterns: [
        {
          from: `${path.resolve(__dirname)}/public`,
          to: `${path.resolve(__dirname)}/.webpack/main`,
          toType: 'dir',
          noErrorOnMissing: true,
          globOptions: {
            ignore: [
              '**/.DS_Store',
              '**/index.html',
            ]
          },
          info: {
            minimized: true
          }
        },
        { // 必须!entryPoints的preload没啥用,需要单独执行复制操作。当然如果需要执行混淆,可以将preload的文件放到前端项目目录中,然后额外添加编译规则(使用对象指定entry)即可。具体的参考webpack的相关配置。
          from: `${path.resolve(__dirname)}/electron/preload.js`,
          to: `${path.resolve(__dirname)}/.webpack/main`
        },
      ]
    }
  ),
)

// 默认导出forge webpack的配置
module.exports = {
  packagerConfig: { // electron-packager的配置参数,直接参考electron-packager官方说明即可
    appBundleId: "com.terminal.client", // 自定义的app构建id,只允许用户运行一个app实例时很有用
    name: "terminal-client", // 应用名称
    out: ".webpack",  // 需要打包的目录
    junk: true, // 忽略系统的垃圾文件不将其复制到electron app中
    asar: true, // 使用asar压缩资源目录
  },
  rebuildConfig: {}, // 一般不需要
  makers: [ // makers参考forge官方说明即可,虽然我也有点晕,但是对结果影响不大
    // {
    //   name: '@electron-forge/maker-squirrel',
    //   config: {},
    // },
    {
      name: '@electron-forge/maker-zip',
      platforms: ['darwin', "win32"],
    },
    {
      name: '@electron-forge/maker-deb',
      config: {},
    },
    {
      name: '@electron-forge/maker-rpm',
      config: {},
    },
  ],
  plugins: [ // 重点!!!
    new WebpackPlugin({
      mainConfig: { // electron main的webpack打包配置
        entry: "./electron/main.js", // 入口文件
        module: { 
          rules: [ // 自己看应该可以看懂吧,这也是官方写法
            // Add support for native node modules
            {
              // We're specifying native_modules in the test because the asset relocator loader generates a
              // "fake" .node file which is really a cjs file.
              test: /native_modules[/\\].+\.node$/,
              use: 'node-loader',
            },
            {
              test: /[/\\]node_modules[/\\].+\.(m?js|node)$/,
              parser: { amd: false },
              use: {
                loader: '@vercel/webpack-asset-relocator-loader',
                options: {
                  outputAssetBase: 'native_modules',
                },
              },
            },
            {
              test: /\.tsx?$/,
              exclude: /(node_modules|\.webpack)/,
              use: {
                loader: 'ts-loader',
                options: {
                  transpileOnly: true,
                },
              },
            },
          ]
        },
        resolve: { // 无需解释,webpack最基础的内容部分
          extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json'],
        },
        output: { // 清除输出目录
          clean: true,
        }
      },
      renderer: { // 前端项目的webpack打包配置
        config: rendererConfig, // 使用上述的rendererConfig配置
        entryPoints: [
          {
            js: './src/main.ts', // 指定入口文件。官方同时使用了html指定网页模板,此处不需要,vue的webpack中有单独的Html插件处理Html。
            name: 'main', // 名称,自己取就是了,app也行啥都行。
            // 官方文档中此处还添加了preload,实际上来讲没有什么用,所以已经在上面的CopyPlugins中定义。preload的声明中甚至可以对preload进行额外的webpack打包操作,但是实际测试下来(也许是我没有操作对)也没有什么用,具体回到上面的Copyplugins看说明。
          },
        ],
      },
    }),
  ]
};

结语

虽然内容些许简单,但是也是真的很简单。凡事都是一个思路,思路理解了什么事情都好办。

### Electron Forge 使用指南 #### 安装 为了开始使用 Electron Forge,可以通过 npm 进行全局安装或作为项目的本地依赖项进行安装。以下是两种常见的安装方式: 1. **全局安装** 如果希望在任何地方都可以访问 `electron-forge` 命令,则可以将其全局安装: ```bash npm install -g @electron-forge/cli ``` 2. **本地安装** 推荐的方式是将 Electron Forge 作为项目的开发依赖项安装,这样可以更好地管理版本控制: ```bash npm install --save-dev @electron-forge/cli npx electron-forge import ``` 此命令会自动检测当前项目结构并将必要的配置导入到您的项目中。 --- #### 配置 Electron Forge 的核心功能之一是通过简单的配置实现复杂的构建过程。主要的配置通常位于项目的 `package.json` 文件中,或者可以在单独的 `.forge` 配置文件中定义。 以下是一个典型的 `package.json` 中的配置示例: ```json { "name": "my-electron-app", "version": "1.0.0", "description": "", "main": "src/index.js", "scripts": { "start": "electron-forge start", "make": "electron-forge make" }, "config": { "forge": { "packagerConfig": {}, "makers": [ { "name": "@electron-forge/maker-squirrel", "platforms": ["win32"] }, { "name": "@electron-forge/maker-zip", "platforms": ["darwin"] } ] } }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.58", "@electron-forge/maker-deb": "^6.0.0-beta.58", "@electron-forge/maker-rpm": "^6.0.0-beta.58", "@electron-forge/maker-squirrel": "^6.0.0-beta.58", "@electron-forge/maker-zip": "^6.0.0-beta.58" } } ``` 上述配置指定了多个造物者(maker),分别用于 Windows 和 macOS 平台的应用程序打包[^1]。 --- #### 示例 下面展示了一个完整的 Electron Forge 工作流,从初始化到最终生成可发布的应用程序包。 1. **创建新项目** 可以通过 Electron Forge 自动化脚手架工具快速搭建一个新的 Electron 应用程序: ```bash npx create-electron-app my-new-project cd my-new-project ``` 2. **启动开发服务器** 启动开发模式下的应用程序实例以便调试和测试: ```bash npm start ``` 3. **制作发布版** 当完成开发后,可以使用以下命令生成适合不同操作系统的发行包: ```bash npm run make ``` 此命令会依据 `package.json` 中的配置自动生成目标平台的安装包。 4. **安装已发布的开源项目** 如果需要安装其他开发者已经上传至 GitHub 的开源 Electron 项目,可以直接利用 `electron-forge install` 命令: ```bash electron-forge install username/repo-name ``` 例如,安装 Atom 编辑器的核心代码库: ```bash electron-forge install atom/atom ``` --- #### 其他注意事项 - 对于 macOS 用户来说,在分发应用之前可能还需要考虑代码签名问题。此时可以借助专门针对 Electron 设计的工具如 `electron-osx-sign` 来满足 Apple 的严格要求[^4]。 - 若想进一步增强安全性,比如保护内部资源免遭非法篡改或逆向工程攻击,则可以引入像 `asarmor` 这样的解决方案来加固 ASAR 存档文件[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值