Алексей
А devtools
Алексей
Ctrl shift i
Вроде так открывается
Алексей
Ничего не выводит туда?
Yupi
page layout may be unexpected due to Quirks Mode
Алексей
Может быть ошибка в хтмл файле
Скинь код хтмл
Yupi
Я наверное скоро лысым стану от этого электрона
Yupi
какой же я тупой в <base href="./"> ./ забыл вставить
Yupi
Удивительно что если юзать просто так работает, а когда собираю нет
Александр
Доброго времени суток. Уважаемые разработчики, кто-нибудь сталкивался с такой проблемой: приложение электрон открыто, но не могу развернуть окно? Висит на панели задач и ни в какую
Ratatata
Добрый день. Подскажите пожалуста возможно ли переназначить закрытие приложения на клавишу escape?
Unknown
Александр
Nikolay Dimitriev
Приложение angular. Пытаюсь настроить автообновление. Для теста разместил по пути https://myservrurl.com/2.0.1/myapp.exe следующую версию приложения. Текущая, на которой тестирую автообновление - 2.0.0.
Долго читал доку и понял, что вот такой вариант должен вполне работать. Но собираю приложение, устанавливаю, запускаю приложение и... ничего не происходит. Если запустить просто ng build && electron . , то в консоли спустя 30 секунд (интервал, по которому запускается autoUpdater.checkForUpdates()) пишет There was a problem updating the application
Error: Can not find Squirrel at AutoUpdater.checkForUpdates
В чём проблема и куда копать?
const {app, BrowserWindow, autoUpdater, dialog} = require('electron');
const log = require('electron-log'); // Подключение модуля логирования
const server = 'https://myservrurl.com/';
const url = `${server}/2.0.1/`;
autoUpdater.setFeedURL({ url });
// интервал для регулярной проверки обновлений
setInterval(() => {
autoUpdater.checkForUpdates();
}, 30 * 1000); // Проверка каждые 30 секунд
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'A new version has been downloaded. Restart the application to apply the updates.'
};
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
});
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
});
// каталог для логов, где будут храниться журналы приложения
log.transports.file.file = 'logfile.log';
log.transports.file.format = '{h}:{i}:{s} {text}'; // формат логов
let appWindow;
app.commandLine.appendSwitch('disable-http-cache');
function createWindow() {
// log.info('Creating appWindow...');
appWindow = new BrowserWindow({
width: 1600,
height: 800,
// alwaysOnTop: true, // должно ли окно всегда оставаться поверх других окон.
frame: false, // Убирает стандартный фрейм с кнопками управления окном
});
// log.info('Loading dist/index.html...');
appWindow.loadFile('dist/index.html');
appWindow.on('closed', function () {
appWindow = null;
});
// Открываем окно в полноэкранном режиме
appWindow.setFullScreen(true);
// проверка, что приложение не запустилось и в открывшемся окне просто белый экран
if (appWindow) {
let reloaded = false;
appWindow.webContents.on('did-finish-load', () => {
if (reloaded) {
return;
}
appWindow.webContents.executeJavaScript(`
document.body.innerText.trim().length > 0
`).then(bodyLoaded => {
// если вдруг что-то пошло не так и программа в итоге
// не запустилась - то она перезапускется принудительно
if (!bodyLoaded) {
reloaded = true;
appWindow.loadFile('dist/index.html');
}
});
});
}
}
// Проверка на наличие другого экземпляра приложения
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
// Если другой экземпляр приложения уже активен, то можно отобразить сообщение об ошибке
// dialog.showErrorBox('Ошибка', 'Приложение уже запущено.');
app.quit();
} else {
// Если текущий экземпляр является первым, создаётся окно приложения
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (appWindow) {
// log.info('appWindow show');
appWindow.show();
}
});
app.whenReady().then(() => {
// log.info('createWindow');
createWindow();
});
}
P X N C H X R
Приложение angular. Пытаюсь настроить автообновление. Для теста разместил по пути https://myservrurl.com/2.0.1/myapp.exe следующую версию приложения. Текущая, на которой тестирую автообновление - 2.0.0.
Долго читал доку и понял, что вот такой вариант должен вполне работать. Но собираю приложение, устанавливаю, запускаю приложение и... ничего не происходит. Если запустить просто ng build && electron . , то в консоли спустя 30 секунд (интервал, по которому запускается autoUpdater.checkForUpdates()) пишет There was a problem updating the application
Error: Can not find Squirrel at AutoUpdater.checkForUpdates
В чём проблема и куда копать?
const {app, BrowserWindow, autoUpdater, dialog} = require('electron');
const log = require('electron-log'); // Подключение модуля логирования
const server = 'https://myservrurl.com/';
const url = `${server}/2.0.1/`;
autoUpdater.setFeedURL({ url });
// интервал для регулярной проверки обновлений
setInterval(() => {
autoUpdater.checkForUpdates();
}, 30 * 1000); // Проверка каждые 30 секунд
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'A new version has been downloaded. Restart the application to apply the updates.'
};
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
});
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
});
// каталог для логов, где будут храниться журналы приложения
log.transports.file.file = 'logfile.log';
log.transports.file.format = '{h}:{i}:{s} {text}'; // формат логов
let appWindow;
app.commandLine.appendSwitch('disable-http-cache');
function createWindow() {
// log.info('Creating appWindow...');
appWindow = new BrowserWindow({
width: 1600,
height: 800,
// alwaysOnTop: true, // должно ли окно всегда оставаться поверх других окон.
frame: false, // Убирает стандартный фрейм с кнопками управления окном
});
// log.info('Loading dist/index.html...');
appWindow.loadFile('dist/index.html');
appWindow.on('closed', function () {
appWindow = null;
});
// Открываем окно в полноэкранном режиме
appWindow.setFullScreen(true);
// проверка, что приложение не запустилось и в открывшемся окне просто белый экран
if (appWindow) {
let reloaded = false;
appWindow.webContents.on('did-finish-load', () => {
if (reloaded) {
return;
}
appWindow.webContents.executeJavaScript(`
document.body.innerText.trim().length > 0
`).then(bodyLoaded => {
// если вдруг что-то пошло не так и программа в итоге
// не запустилась - то она перезапускется принудительно
if (!bodyLoaded) {
reloaded = true;
appWindow.loadFile('dist/index.html');
}
});
});
}
}
// Проверка на наличие другого экземпляра приложения
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
// Если другой экземпляр приложения уже активен, то можно отобразить сообщение об ошибке
// dialog.showErrorBox('Ошибка', 'Приложение уже запущено.');
app.quit();
} else {
// Если текущий экземпляр является первым, создаётся окно приложения
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (appWindow) {
// log.info('appWindow show');
appWindow.show();
}
});
app.whenReady().then(() => {
// log.info('createWindow');
createWindow();
});
}
https://github.com/electron/electron/issues/4535
Nikolay Dimitriev
https://github.com/electron/electron/issues/4535
То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать?
{
"appId": "com.example.app",
"productName": "myapp",
"directories": {
"output": "./inst"
},
"win": {
"target": "nsis",
"icon": "icon.ico",
"publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\""
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowToChangeInstallationDirectory": true
}
}
P X N C H X R
То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать?
{
"appId": "com.example.app",
"productName": "myapp",
"directories": {
"output": "./inst"
},
"win": {
"target": "nsis",
"icon": "icon.ico",
"publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\""
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowToChangeInstallationDirectory": true
}
}
P X N C H X R
https://github.com/electron/electron/issues/17722#issuecomment-1334597242
Николай
Ребят, всем привет! Подскажите пожалуйста. Перенес React приложение на электрон. Необходим доступ к localStorage и кукам. Когда запускаю electron приложение в dev моде, всё отлично, при билде доступ к хранилищам теряется. Как это исправить?
nikolay
что вы подразумеваете под словом "теряется"? после установки сбрасывается содержимое localStorage?
Yupi
Привет. У кого нибудь бывало что меняешь иконку приложения, собираешь билд, вроде она применяется, но иконка на рабочем столе остается прежней. Как такое фиксить?
Nikolay Dimitriev
Привет. У кого нибудь бывало что меняешь иконку приложения, собираешь билд, вроде она применяется, но иконка на рабочем столе остается прежней. Как такое фиксить?
Тоже так. В верхней панели приложения эта иконка применяется, а вот к ярлыку на рабочем столе нет (приложение ангуляр, собираю в exe):
const iconPath = path.join(__dirname, 'icon.ico');
function createWindow() {
win = new BrowserWindow({
width: 1280,
height: 720,
backgroundColor: '#ffffff',
//Trocar caminho para corresponder ao ícone da aplicação
icon: iconPath
});
win.setMenu(MenuPrincipal);
win.webContents.openDevTools();
//Trocar caminho para corresponder ao index.html da aplicação
win.loadFile('dist/index.html');
win.on('closed', function () {
win = null;
});
}
🅰️nimeCoder
🅰️nimeCoder
Ваш exe к icon окна отношения вообще не имеет ни малейшего
🅰️nimeCoder
Nikolay Dimitriev
То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать?
{
"appId": "com.example.app",
"productName": "myapp",
"directories": {
"output": "./inst"
},
"win": {
"target": "nsis",
"icon": "icon.ico",
"publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\""
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowToChangeInstallationDirectory": true
}
}
Удалось настроить автообновление. В целом всё работает, новые версии устанавливаются, если разместить нужные файлы версии по пути https://myserverurl.ru/releases/ , но если разместить в release более старую версию, чем уже установлена, то в логах пишется "warn: CheckForUpdateImpl: hwhat, local version is greater than remote version", не смотря на то, что у меня проставлено autoUpdater.allowDowngrade = true; Нужно ли что-то ещё, чтобы разрешать установку более старых версий?
В документации явно описано, что это должно разрешать установку более старых версий:
/**
* Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel).
*
* Taken in account only if channel differs (pre-release version component in terms of semantic versioning).
*
* @default false
*/
allowDowngrade: boolean;
Вот код обновления в app.js:
// Определение глобальных переменных для URL и интервала
let updateURL = null;
let updateInterval = null;
let isDownloading = false;
// Функция для установки URL и интервала для проверки обновлений
function setUpdateURL() {
// разрешаем установку более старых версий
autoUpdater.allowDowngrade = true;
// Устанавливаем URL для проверки обновлений
const server = 'https://myserverurl.ru/';
updateURL = `${server}releases/`;
// Устанавливаем интервал для регулярной проверки обновлений
updateInterval = setInterval(() => {
if (!isDownloading) {
// Просто проверяем наличие обновлений, без дополнительных проверок
autoUpdater.checkForUpdates();
}
}, 30 * 1000); // Проверка каждые 30 секунд
// Устанавливаем URL для autoUpdater
autoUpdater.setFeedURL({ url: updateURL });
}
// Обработка начала загрузки
autoUpdater.on('update-downloading', () => {
isDownloading = true;
});
// Обработка завершения загрузки
autoUpdater.on('update-downloaded', () => {
isDownloading = false;
});
ALΣX
Привет, может кто подсказать, как синхронизировать оповещения и пользовательские звуки?
Я решил в renderer процессе показывать уведомления через HTML Notifications API в сочетании с Howler.js. Все работает хорошо, пока уведомлений не становится слишком много и они не помещаются в системный стек. Как оказалось, событие show, к которому я прикрепил воспроизведение звуков, обрабатывается сразу после создания уведомления, а не когда оно фактически показано пользователю. Теперь получается, что звуки воспроизводятся до того, как само уведомление показывается. С нативным Notification модулем (для main процесса) та же байда...
_dimon_chick_
а тебе правда нужно решать эту проблему, я имею ввиду, часто ли у пользователя переполнен стек уведов ?
_dimon_chick_
да и обычно же сначала идет звук уведомления, а потом как ты уже написал оно появляется на экране
ALΣX
а тебе правда нужно решать эту проблему, я имею ввиду, часто ли у пользователя переполнен стек уведов ?
да, есть высокая вероятность. У нас приложение для печати и может быть несколько заданий за раз отправляться и для каждого нужно показать уведомление со статусом: удалось напечатать или нет.
И проблема как раз в том, что если уведомлений много и для них не создавать какуюто-то кастомную очередь, тогда все звуки воспроизводятся до того, как показывается хотя бы 3-4 уведомление, т.е. нет синхронна вообще никакого. Пробывал писать логику с кастомной очередю и задержкой на 3с, но все же хочется какое-то более красивое решение и чтобы после меня никто не ломал голову, что и для чего.
_dimon_chick_
нельзя показ сделать промисом ? что бы после него воспроизводить звук ?
ALΣX
_dimon_chick_
отпиши потом получилось или нет, самому интересно))
Сергей
Всем привет. Можете подсказать не совсем по электрону? Начинаю изучать всю кухню (js-elctron-react) и не могу понять, почему не перерисовывается компонент. Если в useEffect не обновлять переменную content, то установленный вначале через useState контент отрисовывается, но как только я выставляю контент в useEffect, страница пустая.
eden
Сергей
_dimon_chick_
_dimon_chick_
Сергей
Кинул бы скрины, но сейчас не за компом
_dimon_chick_
Мб из за того что Setting это объект, ты его не так менял и useEffect не замечал изменения ?
Сергей
Нет, сеттингс точно менялись, узнавал это путём вывода в консоль
_dimon_chick_
Так как это сложный тип данных, нужно полностью перезаписывать стейт, что бы поменять его (с полным глубоким копированием)
_dimon_chick_
Сергей
Вот и я о том же
_dimon_chick_
Да уж, этот реакт та еще штука 😅
Сергей
Эх.. Как же было всё просто и понятно в с#
eden
помогите, пожалуйста. Падает нотаризация приложения с такой ошибкой:
Error: HTTP status code: 403. A required agreement is missing or has expired. This request requires an in-effect agreement that has not been signed or has expired. Ensure your team has signed the necessary legal agreements and that they are not expired.
Захожу на сайт девелопера эпл, там ничего нового не появляется (раньше появлялось вроде). Как принять все соглашения?
10N37
eden
10N37
eden
10N37
Тоже самое, возможно проблема в чем-то другом
eden
eden
кажется подписалось. Я только сегодня оплатил аккаунт, видимо не сразу подцепилась оплата
Степан
Всем привет. Можно ли через электрон получить координаты(геопозицию) местоположения устройства, с которого производится работа приложения?
No
Степан
А если как-то через Яндекс пробивать, то тогда без участия электрона, правильно?
Стас
Стас
Через что ты ее пользуешь не имеет значения
Сергей
Ни у кого не завалялось туториала как сделать приложение с реактом без TS? А то я тут навертел чего-то с вебпаком и пока не разобрался что происходит) Сбилдил приложение, но идут ошибки пл доступу ws/0.0.0.0./ws
Стас
Стас
Ну или не убирай, технически оно тебе ничем не мешает
Сергей
А ещё вопросик, я могу как-то сбилдить под линукс на винде? Или мне тащить проект на линукс и там билдить?
No
Anonym Squad
Доброго времени суток, подскажите пожалуйста.
У меня сейчас есть наработка, приложения на электрон+реакт+экспресс(да я извращенец😅)
Задумался о том, что бы экспресс заменить на nest.js(просто потому что удобно), можете подсказать как это сделать? Или процедура ни чем не отличается с экспрессом?
Пысы- экспресс , у меня переведен в ts
🅰️nimeCoder
Anonym Squad
Я с экспрессом то с танцами и бубнами мучился.
Степан
Падажжи а зачем тебе нест на клиент-сайде...
🅰️nimeCoder
Ну так, отличий то нет, что на простой ноде, что в электроне. Ну в электроне доп апи есть, вот и все.
Nest это purejs нативок нет, в чем проблема
🅰️nimeCoder
🅰️nimeCoder
Тыж на нем пишешь бэк и тебе на нем легко. В электроне ничего не меняется.