使用 electron 和 electron-forge 加載 本地磁盤資源 img 的問題


最近在學習使用 electron 進行桌面開發一款圖片壓縮的軟件。遇到了加載本地磁盤文件的問題。記錄一下其解決方案。

使用 electron 加載本地磁盤文件

  • 第一種方法 設置webPreferences.webSecurity值為false

使用這個方法就是設置Chromium的啟動安全參數,允許訪問本地資源文件。由於Chromium是不允許在遠程地址訪問本地資源。只有本地資源訪問本地資源,那么問題來了,使用 electron 啟動的項目怎么設置訪問本地路徑資源呢? 代碼配置如下

// main.js

const { app, BrowserWindow } = require("electron");
const createWindow = () => {
  const mainWindow = new BrowserWindow({
    width: 1024,
    height: 600,
    webPreferences: {
      // 設置安全參數
      webSecurity: false, // false 之后就可以訪問 本地資源文件了
    },
  });
  mainWindow.loadURL("http://localhost:3000"); // 本地服務鏈接
  mainWindow.webContents.openDevTools();
};

app.on("ready", createWindow);

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

app.on("activate", () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});
<!-- localhost:3000 -->
<div>
  <img src="D:/xxxx/xxx.png" />
  訪問本地圖片地址
</div>

這樣就可以在electron里正常訪問本地資源了。

  • 第二種方法,注冊自定義協議,來繞過Chromium安全檢查。
// main.js

const { app, BrowserWindow, protocol } = require("electron");
const createWindow = () => {
  const mainWindow = new BrowserWindow({
    width: 1024,
    height: 600,
  });
  mainWindow.loadURL("http://localhost:3000"); // 本地服務鏈接
  mainWindow.webContents.openDevTools();
};

app.on("ready", createWindow);

app.whenReady().then(() => {
  // 注冊協議 aaaa 協議名字無所謂 自定義即可
  protocol.registerFileProtocol("aaaa", (request, callback) => {
    const url = request.url.substr(7);
    // 防止url 解析不正常 使用 decodeURI
    callback(decodeURI(path.normalize(url)));
  });
});

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

app.on("activate", () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});
<!-- localhost:3000 -->
<div>
  <img src="aaaa:///D:/xxxx/xxx.png" />
  根據自定義協議名前綴 訪問本地圖片地址
</div>

使用 electron-forge 加載本地磁盤文件

electron-forge是 electron 的腳手架,類似於,react 的create-react-app或者 vue 的vue-cli,所有配置文件都是已經配置好的,根據需求在往上添加就可以用了。如果加載本地磁盤資源用以上辦法還是不太行的。需要再加上一個配置才行。

forge.config.js或者package.json 設置plugins項,如下

{
  "plugins": [
    [
      "@electron-forge/plugin-webpack",
      {
        "devContentSecurityPolicy": "`default-src 'self' 'unsafe-inline' data:;`", //設置 devContentSecurityPolicy 就可以訪問本地資源了
        "mainConfig": "./webpack.main.config.js",
        "renderer": {
          "config": "./webpack.renderer.config.js",
          "entryPoints": [
            {
              "html": "./src/index.html",
              "js": "./src/renderer.tsx",
              "name": "main_window"
            }
          ]
        }
      }
    ]
  ]
}

配置之后,再使用 上面的兩種方法 其中一種就可以解決 手腳架加載本地磁盤文件的問題了。

下面貼上我當時開發的版本信息。

PS D:> node -v
# v14.18.2
PS D:> npm -v
# 6.14.15
{
  "@electron-forge/cli": "^6.0.0-beta.61",
  "electron": "16.0.5"
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM