1.下载需要用到的依赖

npm install electron-rebuild bindings file-uri-to-path sqlite3

package.json的scripts中需要添加:第一条是本地运行时需要的,第二条是package打包需要的,可以根据需要添加到dev/package的命令中一起运行,第三条是自动安装Electron应用所需的特定依赖项

"dev-rebuild-sqlite3": "electron-rebuild -f -w sqlite3",
"package-rebuild-sqlite3": "electron-rebuild -f -w sqlite3 --arch=ia32",
"postinstall": "electron-builder install-app-deps"

2.主进程main.ts中webPreferences.contextIsolation:false// 必须关闭,否则渲染进程无法直接访问原生模块

3.build-electron 的build.js配置为:

"asarUnpack": [
    "node_modules/sqlite3/**/*", // 解压 sqlite3 所有文件
    "node_modules/bindings/**/*",  // 解压 bindings 模块
    "node_modules/file-uri-to-path/**/*"  // 解压 file-uri-to-path 模块
],
"extraResources": [
    {
        from: "node_modules/sqlite3/lib/binding/",
        to: "resources/sqlite3/binding/",
        filter: ["**/*"]
    }
],
"files": [
    ......//其他模块
    "./node_modules/sqlite3/**/*", // 显式包含 sqlite3 模块
    "./node_modules/bindings/**/*",  // 显式包含 bindings 模块
    "./node_modules/file-uri-to-path/**/*",  // 显式包含 file-uri-to-path 模块
],
"win": {
    "icon": iconPath,
    "target": [
        {
            "target": "nsis",
            "arch": [
                "ia32"
            ]
        }
    ]
}

4.渲染进程调用方法

  demoToget = async () => {
    try {
      // 通过 window 对象动态加载模块
      const path = (window as any).require?.("path");
      const homedir = (window as any).require('os').homedir();
      const sqlite3 = require('sqlite3').verbose();
      const stickyNotesPath = path.join(
        homedir,
        'AppData/Local/Packages',
        'Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe',//win10-win11
        'LocalState/plum.sqlite'
      );
      console.warn('便签数据库数据路径', stickyNotesPath, sqlite3)

      const db = new sqlite3.Database(stickyNotesPath, sqlite3.OPEN_READONLY, (err: any) => {
        if (err) {
          console.error('无法打开数据库: ' + err.message);
        }
      });

      db.all("SELECT * FROM Note", [], (err: any, rows: any) => {
        if (err) {
          console.error('查询失败: ' + err.message);
        } else {
          for (let i in rows) {
            let obj = JSON.parse(rows[i].LastServerVersion)
            for (let j in obj.document.blocks) {
              for (let m in obj.document.blocks[j].content) {
                console.warn('单行内容:', obj.document.blocks[j].content[m].text)
              }
            }
          }
        }
        db.close();
      });
    } catch (error) {
      console.error('获取便签内容报错', error);
    }
  };

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐