Неправильный путь значка в лотке Electron Vue

#vue.js #electron

#vue.js #electron

Вопрос:

Я пытаюсь создать приложения для Windows, используя Electron и Vue. Я хочу отправить приложение в трей и показать значок, чтобы снова развернуть его при нажатии. Это прекрасно работает в DEV, но когда я создаю приложение, значок в трее не работает. Приложение, которое оно выполняет, но при сворачивании трей не отображается, и нет возможности открыть его снова (необходимо завершить процесс).

Это код, который я пытаюсь использовать:

 app.on("ready", async () => {
  if (isDevelopment amp;amp; !process.env.IS_TEST) {
    try {
      await installExtension(VUEJS_DEVTOOLS);
    } catch (e) {
      console.error("Vue Devtools failed to install:", e.toString());
    }
  }
  createWindow();
  createTray()
});

const createTray = () => {
  const tray = new Tray(resolve(process.resourcesPath, '\resources\homeico.ico'))

  const contextMenu = Menu.buildFromTemplate([
    {
        label: 'Show App', click: function () {
            app.show()
        }
    },
    {
        label: 'Quit', click: function () {
            app.isQuiting = true
            app.quit()
        }
    }
  ])
  tray.setToolTip('This is my application.')
  tray.setContextMenu(contextMenu)

  tray.on('click', () => {
      console.log('clicked')
  })
}
 

И в моем vue.config.js:

 pluginOptions: {
    electronBuilder: {
      nodeIntegration: true,
      builderOptions: {     
        "extraResources": [
          {
            "from": "extraResources",
            "to": "resources",
            "filter": [
              "**/*"
            ]
          }
        ]
      }      
    },
  },
 

Строка resolve(process.resourcesPath, ‘resourceshomeico.ico’) указывает на существующий файл, я печатаю этот маршрут в приложении и могу открыть его в проводнике Windows, но когда я хочу показать изображение в приложении, я вижу следующую ошибку в инструменты разработки:

Не разрешено загружать локальный ресурс: file:///C:/Users/mysUser/AppData/Local/Programs/business-config-tool/resources/ресурсы/homeico.ico

Путь доступен, но не в приложении. Как правильно настроить путь к значку? есть другой путь, который я могу настроить для активов? Я также пробовал использовать __dirname и другие форматы значков (ico, png ..)

Спасибо.

Ответ №1:

Я столкнулся с той же проблемой. Я искал решение часами и, наконец, нашел его.

Это решение сделано для приложения с использованием electron-vue (я лично использовал этот плагин Vue Cli electron). И я протестировал его только в Windows.

Лоток должен быть инициализирован путем к значку, который должен отличаться от того, используете ли вы встроенную версию своего приложения ( yarn electron:build ) или обслуживаете свое приложение ( yarn electron:serve ).

Я использую функцию, которую я вызвал isServeMode , которая в основном сообщает мне, использую ли я режим обслуживания или режим buid. Вот как выглядит функция :

 // utils.js file
const isServeMode = () => {
    return process.env.WEBPACK_DEV_SERVER_URL
}
 

Вам не нужно создавать эту функцию, но она может быть полезна где-то еще в вашем приложении, поэтому я предлагаю вам поместить ее в файл, который вы можете импортировать из любого места вашего приложения. В моем случае я создал utils.js файл, в который я записываю эти функции.

Затем поместите свой значок в трее в общую папку, он может не работать, если вы поместите значок в src/assets папку, поскольку мы должны получить к нему доступ из среды узла, а не из Vue. В моем случае я вставил туда свою иконку public/tray/icon.png .

Наконец, мы можем использовать электронный лоток с электронным vue следующим образом

 import { Tray } from "electron"
import path from "path"
import { isServeMode } from "./utils" // Path depends on where you wrote your function

// Some Electron code...

let tray

createTray = () => {
  const iconPath = isServeMode() 
    ? path.join(__dirname, "/bundled/tray/icon.png")
    : path.join(__dirname, "/tray/icon.png")

  tray = new Tray(iconPath)
}
 

Скоро я выпущу новую версию моего приложения Unlighter, которое представляет собой приложение electron-vue, которое будет включать пример лотка. Не стесняйтесь взглянуть на этот «пример приложения из реального мира», если вам интересно.