Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.4k views
in Technique[技术] by (71.8m points)

Electron build is not performing how dev project does

I have built an Electron app and I'm trying to build it out. It works perfectly when I run it in the dev environment with "npm start", but once I build it out, it fails. I've tried this with electron forge and electron packager. Essentially, my app lives in the task tray and scans a folder every second. If the folder is not empty, it shows the window. While the window is shown, the loop stops. Once the main.js file receives a command that the user actions were completed, it hides the window and goes back to the tray to resume scanning. Here is my main.js file:

const { app, BrowserWindow, Tray, Menu } = require('electron')
var ipcMain = require('electron').ipcMain;
const Store = require('electron-store');
const store = new Store();
const fs = require('fs');

shouldScan = true;

// global window declaration function
var win;
async function createWindow () {
    win = new BrowserWindow({
    width: 500,
    height: 250,
    webPreferences: {
      nodeIntegration: true,
      enableRemoteModule: true,
    }
  })
  win.setMenuBarVisibility(false)
  win.loadFile('index.html')

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

  win.on('minimize', function (event) {
    event.preventDefault()
    shouldScan = true
    scanning()
    win.hide()
})

win.on('show', function (event) {
  event.preventDefault()
  shouldScan = false
})
await sleep(1000)
win.minimize()
}

// start the application
app.whenReady().then(createWindow)

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

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

//allow delays
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}


//check the designated folder and stop the loop while showing the app window from the tray
async function scanning(){
  while(shouldScan){
    console.log('scanning')
    if(store.get('default_path') != null){
      files = fs.readdirSync(store.get('default_path'));
      if(files.length > 0){
        fs.rename(store.get('default_path') + "/" + files[0], store.get('default_path') + "/encounter", err => {
        if (err) {
          console.error(err)
          return
        }
        })
        console.log('should have shown')
        win.show()
        shouldScan = false
    }
  }
    await sleep(1000)
  }
}

//start the scanning funciton again when the signal is received
ipcMain.on('processInput', function(event, status) {
  win.hide()
  shouldScan = true
  scanning()
});

The error I'm experiencing is that the window never goes to tray. Its even supposed to minimize 1 second after launching but it doesn't do that either. Actually, none of the scripts in the main file run other than creating the window. If the window is minimized and its target folder is not empty, it does not re-show the window. The dev tools within the window don't show any errors. I don't know how to have a command prompt running while the packaged .exe is running either, though. Does anyone have some advice?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

for anyone in the future, it seems that electron does not like just local file paths. When I was creating the new Tray('spongebob.ico') that wasn't good. doing this seemed to fix the error:

new Tray(path.join(__dirname, 'asset','img', 'spongebob.png'));

obviously I had to create the correct path and file type.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...