Michael
Если чел, владеющий английским, не смог найти себе туториал по электрону, то можешь не стараться
что-то это мне напомнило контрибьюторов из тикетов в репе электрона:
Michael
А кто-нибудь из здесь присутствующих собирал электрон самостоятельно? Я почти всё настроил и собрал, на пара файлов в CLion подсвечивается красным, что осложняет понимание всего кода
SKG
Если чел, владеющий английским, не смог найти себе туториал по электрону, то можешь не стараться
Oh lol , that’s not what I meant bro , I need channel or links verified by someone who he thinks they’re good and very informative
Michael
Спросил в Issues в репе, так мне его закрыли и отправили в дискорды. А в дискорде тоже молчок. Хотя сами контрибьюторы ведь точно всё настроили)
Michael
I understand bro
if you are already familiar with web development (basics js + html + css) I strongly recommend you to open documentation, create idea for you desktop-app-of-the-future and start development. There is almost nothing special in Electron comparison to regular web development :)
Unknown
Oh lol , that’s not what I meant bro , I need channel or links verified by someone who he thinks they’re good and very informative
got ya, sry, but i did't found any valuable videos on youtube. they looks legacy or just for newbies and like "how to use electron with react". i can only advise you to read some maybe articles or smth like that in google. it's will more productive for you. sorry
ALΣX
Yh I used to do it , it’s normal , wanted to know if anyone has some real source or good ebook or article they can send me link or file directly
The best way (at least in terms of time) to succeed in this is to try everything yourself, electron has really nice "Quick Start" and "Tutorial" sections. Everything else depends very much on what kind of program you are going to create. There're a lot of things you're unlikely to use while developing the app, so I think it's best to only check the documentation for the needed API (after getting past the basics). Electron changes too fast anyway, so if you check any video or book that was published about a year ago, it'll probably be out of date for the latest versions of Electron.
SKG
Aside the documentation, i need YouTube link, or paid videos, or ebooks or pdfs, any material you have on electron js please 🙏 send me , thank y’all
Unknown
а зачем вообще нужен сквиррел? есть хоть одна причина не использовать нсис?
JAMSHIDBEK
Хотите разместить бесплатную вакансию? Или вы ищете лучшие вакансии? тогда подпишитесь на @ayti_jobs и найдите нужную вам вакансию Разместить бесплатную вакансию или резюме — @ayti_jobs_vacansy
Andrey
Товарищи подскажите как прервать fetch запрос в electron. Пробую сделать паузу. Если вылетает ошибка, я могу докачивать с легкостью дальше, а вот прервать через abort не чего не дает. const pauseDownload = () =>{ console.log('Активация паузы'); // Abort. controller.abort() }
Andrey
const download_fetch = async (url: string, filePath: string, signal) => { setUIStatusDownload(statusDownload.download) let file: number | undefined const startTime = Date.now(); let prevDownloadedSize = 0 const listCookies = document.cookie.split(';').filter(cookie => cookie.startsWith('accessToken=')) const accessToken = listCookies.length ? listCookies[0].substring(12) : null const headers: HeadersInit = accessToken ? { 'Authorization': Bearer ${accessToken} } : {} url = url.replace('https://andrey.yuyux.xyz/', statics.host.api + '/api/v1/nexus/') // Проверяем, существует ли файл с информацией о загрузке if (fs.existsSync('resume_info.json')) { const resumeInfo = fs.readFileSync('resume_info.json', 'utf8'); const { downloaded_size } = JSON.parse(resumeInfo); saveResumeFrom(downloaded_size) prevDownloadedSize = downloaded_size; } try { setUIStatusDownload(statusDownload.pause) const response = await fetch(url, { method: 'GET', headers: { ...headers, 'Range': bytes=${resumeFrom}-, }, signal }) // если resumeFrom больше нуля, то идет докачка if (resumeFrom>0) { file = fs.openSync(filePath, fs.constants.O_WRONLY | fs.constants.O_CREAT); // докачивание } else { file = fs.openSync(filePath, fs.constants.O_APPEND | fs.constants.O_TRUNC | fs.constants.O_CREAT); } // file = fs.writeSync(file, value) const reader = response.body.getReader(); const total_size = Number(response.headers.get('Content-Length')); let downloaded_size = 0 let speed = 0 let download_percent = 0 let remaining_time = -1 let elapsed_time = -1 console.log(Начато ${total_size}) while (true) { const { done, value } = await reader.read(); if (done) { onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, true) break; } const currentTime = Date.now(); downloaded_size += value.length; const elapsedTime = (currentTime - startTime) / 1000; // Прошедшее время в секундах const currentDownloadedSize = downloaded_size - prevDownloadedSize; // Текущий размер загруженных данных speed = Math.fround(Number((currentDownloadedSize / elapsedTime))); // Скорость в байтах в секунду download_percent = Math.floor((downloaded_size / total_size) * 100); remaining_time = Math.floor((total_size - downloaded_size) / speed) fs.writeFileSync(file, value) onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, false) // console.log({ // downloaded_size, // speed, // download_percent, // remaining_time, // elapsed_time, // }) } } catch (err) { const relation = Date.now() - startTime if (relation > 1000) { controlDownload() } else{ setUIStatusDownload(statusDownload.error) console.error(err) } } finally { console.log('finaly'); if (file !== undefined && download_percent ==100) { fs.closeSync(file) console.log('finaly-end'); setUIStatusDownload(statusDownload.end) } } };
No
const download_fetch = async (url: string, filePath: string, signal) => { setUIStatusDownload(statusDownload.download) let file: number | undefined const startTime = Date.now(); let prevDownloadedSize = 0 const listCookies = document.cookie.split(';').filter(cookie => cookie.startsWith('accessToken=')) const accessToken = listCookies.length ? listCookies[0].substring(12) : null const headers: HeadersInit = accessToken ? { 'Authorization': Bearer ${accessToken} } : {} url = url.replace('https://andrey.yuyux.xyz/', statics.host.api + '/api/v1/nexus/') // Проверяем, существует ли файл с информацией о загрузке if (fs.existsSync('resume_info.json')) { const resumeInfo = fs.readFileSync('resume_info.json', 'utf8'); const { downloaded_size } = JSON.parse(resumeInfo); saveResumeFrom(downloaded_size) prevDownloadedSize = downloaded_size; } try { setUIStatusDownload(statusDownload.pause) const response = await fetch(url, { method: 'GET', headers: { ...headers, 'Range': bytes=${resumeFrom}-, }, signal }) // если resumeFrom больше нуля, то идет докачка if (resumeFrom>0) { file = fs.openSync(filePath, fs.constants.O_WRONLY | fs.constants.O_CREAT); // докачивание } else { file = fs.openSync(filePath, fs.constants.O_APPEND | fs.constants.O_TRUNC | fs.constants.O_CREAT); } // file = fs.writeSync(file, value) const reader = response.body.getReader(); const total_size = Number(response.headers.get('Content-Length')); let downloaded_size = 0 let speed = 0 let download_percent = 0 let remaining_time = -1 let elapsed_time = -1 console.log(Начато ${total_size}) while (true) { const { done, value } = await reader.read(); if (done) { onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, true) break; } const currentTime = Date.now(); downloaded_size += value.length; const elapsedTime = (currentTime - startTime) / 1000; // Прошедшее время в секундах const currentDownloadedSize = downloaded_size - prevDownloadedSize; // Текущий размер загруженных данных speed = Math.fround(Number((currentDownloadedSize / elapsedTime))); // Скорость в байтах в секунду download_percent = Math.floor((downloaded_size / total_size) * 100); remaining_time = Math.floor((total_size - downloaded_size) / speed) fs.writeFileSync(file, value) onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, false) // console.log({ // downloaded_size, // speed, // download_percent, // remaining_time, // elapsed_time, // }) } } catch (err) { const relation = Date.now() - startTime if (relation > 1000) { controlDownload() } else{ setUIStatusDownload(statusDownload.error) console.error(err) } } finally { console.log('finaly'); if (file !== undefined && download_percent ==100) { fs.closeSync(file) console.log('finaly-end'); setUIStatusDownload(statusDownload.end) } } };
Очень читаемо. Даже желания такую простыню разбирать нет. Хоть бы залил нормально на какой-нибудь патсбин
Александр
const download_fetch = async (url: string, filePath: string, signal) => { setUIStatusDownload(statusDownload.download) let file: number | undefined const startTime = Date.now(); let prevDownloadedSize = 0 const listCookies = document.cookie.split(';').filter(cookie => cookie.startsWith('accessToken=')) const accessToken = listCookies.length ? listCookies[0].substring(12) : null const headers: HeadersInit = accessToken ? { 'Authorization': Bearer ${accessToken} } : {} url = url.replace('https://andrey.yuyux.xyz/', statics.host.api + '/api/v1/nexus/') // Проверяем, существует ли файл с информацией о загрузке if (fs.existsSync('resume_info.json')) { const resumeInfo = fs.readFileSync('resume_info.json', 'utf8'); const { downloaded_size } = JSON.parse(resumeInfo); saveResumeFrom(downloaded_size) prevDownloadedSize = downloaded_size; } try { setUIStatusDownload(statusDownload.pause) const response = await fetch(url, { method: 'GET', headers: { ...headers, 'Range': bytes=${resumeFrom}-, }, signal }) // если resumeFrom больше нуля, то идет докачка if (resumeFrom>0) { file = fs.openSync(filePath, fs.constants.O_WRONLY | fs.constants.O_CREAT); // докачивание } else { file = fs.openSync(filePath, fs.constants.O_APPEND | fs.constants.O_TRUNC | fs.constants.O_CREAT); } // file = fs.writeSync(file, value) const reader = response.body.getReader(); const total_size = Number(response.headers.get('Content-Length')); let downloaded_size = 0 let speed = 0 let download_percent = 0 let remaining_time = -1 let elapsed_time = -1 console.log(Начато ${total_size}) while (true) { const { done, value } = await reader.read(); if (done) { onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, true) break; } const currentTime = Date.now(); downloaded_size += value.length; const elapsedTime = (currentTime - startTime) / 1000; // Прошедшее время в секундах const currentDownloadedSize = downloaded_size - prevDownloadedSize; // Текущий размер загруженных данных speed = Math.fround(Number((currentDownloadedSize / elapsedTime))); // Скорость в байтах в секунду download_percent = Math.floor((downloaded_size / total_size) * 100); remaining_time = Math.floor((total_size - downloaded_size) / speed) fs.writeFileSync(file, value) onStateChange({ resumeFrom, downloaded_size, speed, download_percent, remaining_time, elapsed_time, }, false) // console.log({ // downloaded_size, // speed, // download_percent, // remaining_time, // elapsed_time, // }) } } catch (err) { const relation = Date.now() - startTime if (relation > 1000) { controlDownload() } else{ setUIStatusDownload(statusDownload.error) console.error(err) } } finally { console.log('finaly'); if (file !== undefined && download_percent ==100) { fs.closeSync(file) console.log('finaly-end'); setUIStatusDownload(statusDownload.end) } } };
У аксиоса разве нет готовых решений?
Andrey
У аксиоса разве нет готовых решений?
не знаю, думал подскажут путь. просто думал кто то делал загрузку файлов
꧁༺ Володя ༻꧂
там весь проект кидать придется так как все испортится
А зачем весь проект, просто залей этот код и либо скрин сделай либо ссылку пришли, а вообще в VScode есть крутое расширение - Code Snap ты просто выделяешь код в редакторе, нажимаешь на кнопку и получаешь красивый скрин кода
Andrey
Andrey
No
А сигнал и контроллер откуда берутся?
No
А ты уверен, что у тебя с момента запроса не происходит ререндер и аборт контроллер не пересоздается?
No
Не уверен
ну так проверь) добавь console.log('render') после new AbortContoller() Если с момента клика по кнопке загрузки до нажатия кнопки отмены ты увидишь этот лог, то значит в этом причина
Alexey
Всем привет, а не подскажите, как мне перед закрытием приложения, дать сигнал фронту что то сделать, дождаться, что он это сделает и затем уже закрыть окно?
No
потом обработать его и вызвать app.quit()
No
потом обработать его и вызвать app.quit()
а, ну его вроде как можно даже и не вызывать руками
Alexey
у app есть событие before-quit. Там можешь послать во фронт событие
событие во фронт же посылается с помощью BrowserWindow объекта? у него метод send для этого есть, правильно? Когда пытаюсь послать событие, у меня win (BrowserWindow) уже null
Alexey
а win = null - это не я делал и не знаю зачем надо
Alexey
а даже если я пошлю во фронт событие после before-quit, это же не помешает электрону закрыться?
ALΣX
а win = null - это не я делал и не знаю зачем надо
Зачастую для того, чтобы создавался только один екземпляр главного окна (после его создания инстанс записывается в глобальную переменную - наподобие win - а во время попытки создать повторно окно, переменная используется для соответствующей проверки и развертывания окна или какая там логика). Ну, а после закрытия окна, собственно переменную нужно очистить.
No
а даже если я пошлю во фронт событие после before-quit, это же не помешает электрону закрыться?
ну закрытие произойдет только после завершения выполнения колбека
ALΣX
а даже если я пошлю во фронт событие после before-quit, это же не помешает электрону закрыться?
По идее, 'before-quit' не блокирует процесс закрытия приложения, соответственно оно закроется в любом случае, но, думаю, что проблемы могут возникнуть с обработкой события 'before-quit-test' в рендерер процессе (если оно занимает много времени и не успеет отработать до тех пор, пока само окно закроется)
Александр
Помоему моно на окно событие on close вешать и ему ретёрнить фолс
Александр
А с фронта получать через ipcmain и app.exit()
Nikulshin
Всем привет! Подскажите, такая ошибка возникает при попытке импорта ipcRender. Подскажите, как осуществить реднер?
Александр
const { ipcRenderer } = window.require(“electron”)
Nikulshin
Nikko
Подскажите, есть ли какие-то нюансы при работе на mac/linux/windows. Насколько я понимаю главное что бы одинаковая версия ноды стояла, верно?
Unknown
Нюансы при нативных зависимостях
Unknown
Но это +- решаемо
Bogaciuc
всем привет, может кто то подсказать, выходит ошибка при использовании serialport в проекте с electron-forge , electron, react, webpack App threw an error during load Error: No native build was found for platform=darwin arch=x64 runtime=electron abi=116 uv=1 libc=glibc node=18.15.0 electron=25.2.0 webpack=true loaded from: /Users/mac/Documents/sonar/.webpack
🅰️nimeCoder
нативки это беда, я бы начал с создания пустого обычного проекта на ноде чтоб удостоверится что с этой версией ноды и версией serial port'a все ок потом попробовать обычный проект на электроне без вебпака
Anonymous
Драсте
Anonymous
Прекращение работы программы "electron" Что делать? Если кто-то поможет,дам 50₽
Anonymous
Restart your pc sir
Рашен плис
SKG
Рашен плис
Use translator bro
Anonymous
Anonymous
Restart your pc sir
Пробовал,тоже самое. Антивирусы оффал
SKG
Пробовал,тоже самое. Антивирусы оффал
Disconnect your internet access and turn of pc or laptop for 10mins so memory looses all the temporary data
SKG
Антивирусы надо оффать?
Wait after 10mins then u decide what do next
Anonymous
До этого надо антивирусы оффнуть?
Anonymous
Ну
SKG
До этого надо антивирусы оффнуть?
Don’t turn off anything , once pc or laptop is shutdown, nothing is working
꧁༺ Володя ༻꧂
Попробуй полностью снести електрон(npm uninstall electron), перезагрузить компьютер и снова установить его
SKG
Нихуя не получается
After they u follow the message below .
꧁༺ Володя ༻꧂
Anonymous
Так мне чё делать?
꧁༺ Володя ༻꧂
Так мне чё делать?
Та не слушай ты этого иностранца
Anonymous
Удалить все файлы с електро и заново скачать? Или выключить инет и выключить пк
꧁༺ Володя ༻꧂
Так мне чё делать?
Попробуй сделать как я говорю, это явно проблема в еоектрроне