electron 初始使用记录

  1. Electron 官网文档查看网页
  2. 新建文件名

mkdir my-electron-app && cd my-electron-app

npm init

  1. 初始化项目,安装速度会很慢

npm install electron --save-dev

  1. 新建main.js文件座位主入口使用
    您在 package.json 中指定的 main 文件是 Electron 应用的入口。 这个文件控制 主程序 (main process),它运行在 Node.js 环境里,负责控制您应用的生命周期、显示原生界面、执行特殊操作并管理渲染器进程 (renderer processes),稍后会详细介绍。

在继续编写您的 Electron 应用之前,您将使用一个小小的脚本来确保主进程入口点已经配置正确。 在根目录的 main.js 文件中写一行代码:

main.js

console.log('Hello from Electron 👋')

复制代码
package.json
{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js",
  "scripts": {
    "start": "electron .",   //需要添加启动项目
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jane Doe",
  "license": "MIT",
  "devDependencies": {
    "electron": "23.1.3"
  }
}
  1. 启动npm run start

    npm run start

  2. 创建index.html

    这是我的第一个桌面应用

    这是我的第一个桌面应用

    👋

  3. main.js中写入

    const { app, BrowserWindow } = require('electron/main')

    const createWindow = () => {
    const win = new BrowserWindow({
    width: 800,
    height: 600
    })

    win.loadFile('index.html')
    }

    app.whenReady().then(() => {
    createWindow()

    app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
    }
    })
    })

    app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
    app.quit()
    }
    })

  1. 使用 VS Code 调试,生成launch.json
    使用 VS Code 调试您的程序,您需要让 VS Code 监听主进程 (main process) 和渲染器进程 (renderer process) 。 下面为您提供了一个简单的配置文件。 请在根目录新建一个 .vscode 文件夹,然后在其中新建一个 launch.json 配置文件

    {
    "version": "0.2.0",
    "compounds": [
    {
    "name": "Main + renderer",
    "configurations": ["Main", "Renderer"],
    "stopAll": true
    }
    ],
    "configurations": [
    {
    "name": "Renderer",
    "port": 9222,
    "request": "attach",
    "type": "chrome",
    "webRoot": "{workspaceFolder}" }, { "name": "Main", "type": "node", "request": "launch", "cwd": "{workspaceFolder}",
    "runtimeExecutable": "{workspaceFolder}/node_modules/.bin/electron", "windows": { "runtimeExecutable": "{workspaceFolder}/node_modules/.bin/electron.cmd"
    },
    "args": [".", "--remote-debugging-port=9222"],
    "outputCapture": "std",
    "console": "integratedTerminal"
    }
    ]
    }

  2. 添加代码热更新
    Electron 开发时 "改代码自动刷新 / 重启" 叫热重载(Hot Reload)

    npm i nodemon -D

    //package.json 更改start
    "scripts": {
    "start": "nodemon --exec electron .",
    "test": "echo "Error: no test specified" && exit 1"
    },

添加nodemon.json文件

复制代码
{
    "watch": ["./"],
    "ext": "js,html,css,vue,json",
    "ignore": ["node_modules/", "dist/"],
    "exec": "electron .",
    "restartable": "rs",
    "quiet": false
  }
  1. 改版后的index.html文件

    来自 Electron 渲染器的问好!

    来自 Electron 渲染器的问好!

    👋


    复制代码
    <span id="output"></span>
  2. 改版后的renderer.js文件

    const add = document.getElementById("add");
    const edit = document.getElementById("edit");
    const del = document.getElementById("delete");

    const bt2 = document.getElementById("readFile");
    const output = document.getElementById("output");
    const input = document.getElementById("input");
    //新增文件
    add.onclick = () => {
    console.log(input);
    versions.saveFile(input.value)

    };

    //删除文件
    del.onclick = async () => {
    const data = await versions.deleteFile();
    alert("删除成功")
    };
    bt2.onclick = async () => {
    console.log(versions);
    const data = await versions.readFile();
    output.innerHTML =data
    };

  3. 改版后的preload.js文件

    //预加载页面
    //ipcRenderer是渲染进程向主进程发送消息的桥梁
    //contextBridge是渲染进程向主进程暴露接口的桥梁
    const { contextBridge ,ipcRenderer} = require('electron')

    contextBridge.exposeInMainWorld('versions', {
    node: () => process.versions.node,
    chrome: () => process.versions.chrome,
    electron: () => process.versions.electron,
    // 写入文件
    saveFile:(data)=>{
    console.log(data);
    ipcRenderer.send('wirte-file',data)
    },

    //读取文件
    readFile:()=>{
    const data = ipcRenderer.invoke('read-File') //invoke是异步的,send是同步的
    console.log(data,'"0000');
    return data
    },
    //删除文件
    deleteFile:()=>{
    const data = ipcRenderer.invoke('del-File') //invoke是异步的,send是同步的
    return data
    }

    // 除函数之外,我们也可以暴露变量
    })

  4. 改版后的main.js文件

    const { app, BrowserWindow,ipcMain } = require("electron");
    const path = require('path')
    const fs = require('fs')
    //写入文件操作
    function wirteFile(_, data) {
    fs.writeFileSync('D:/test.txt', data)
    }
    let mainWindow = ""
    //读取文件操作
    function readFile() {
    const data = fs.readFileSync('D:/test.txt','utf-8')
    console.log(data)
    return data
    }
    //删除文件操作
    function deleteFile() {
    fs.unlinkSync('D:/test.txt')
    }
    //
    const createWindow = () => {
    mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    preload: path.resolve(__dirname, 'preload.js')
    }
    });
    ipcMain.on('wirte-file',wirteFile)
    ipcMain.handle('read-File',readFile)
    ipcMain.handle('del-File',deleteFile)

    mainWindow.loadFile("./pages/index.html"); //加载本地文件
    console.log(mainWindow)
    // mainWindow.loadURL('https://www.bilibili.com/') //加载网页
    };

    app.whenReady().then(() => { //当应用准备就绪时触发
    ipcMain.handle('ping', () => 'pong') //监听ping事件,返回pong
    createWindow()//创建窗口
    });

  5. 实际效果

  6. 进行打包安装 electron-builder

    始终报错 • no node modules returned while searching directories searchDirectories=[""]
    ⨯ ENOENT: no such file or directory, rename 'D:\my-project-all\2026-project\my-electron-app\dist\win-unpacked\electron.exe' -> 'D:\my-project-all\2026-project\my-electron-app\dist\win-unpacked\my-electron-app.exe' failedTask=build stackTrace=Error: ENOENT: no such file or directory, rename 'D:\my-project-all\2026-project\my-electron-app\dist\win-unpacked\electron.exe' -> 'D:\my-project-all\2026-project\my-electron-app\dist\win-unpacked\my-electron-app.exe'

1.no node modules returned while searching directories:打包工具找不到 node_modules(路径配置空了 / 目录不对)

2.ENOENT: no such file or directory, rename ...:打包工具想把 electron.exe 重命名为你的应用名,但根本没生成这个文件,所以重命名失败

打包过程中总是各种报错,如下原因一直再更改,删除配置项,最后终于跑动了,主要是把版本改了,然后必须添加上icon

"devDependencies": {

"electron": "^28.3.3",

"electron-builder": "^24.9.1"

}

"icon": "./icon.ico",

  1. 最终打包成功
复制代码
在这里插入代码片


相关推荐
happyprince18 小时前
12-vLLM 量化方案全面分析
前端·javascript·vllm
EntyIU18 小时前
Vue History 模式配置文档
前端·javascript·vue.js
anOnion1 天前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
这是个栗子1 天前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun1 天前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
摇滚侠1 天前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
触底反弹1 天前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹1 天前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
程序边界1 天前
lac_agent自愈链路下篇——从systemd托管到真正的自愈
前端·javascript·chrome
竹林8181 天前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript