Практический проект Electron
С помощью практических проектов вы сможете углубить понимание различных возможностей Electron, включая управление окнами, IPC-взаимодействие, операции с файлами, хранение данных и оптимизацию интерфейса.
Проект 1: настольное приложение для заметок
Проектирование функциональности
- Создание, редактирование и удаление заметок
- Автосохранение и локальное хранение
- Поддержка одновременного редактирования в нескольких окнах
- Чистый интерфейс, обеспечивает рендеринг Markdown
Выбор технологий
- Фронтенд-фреймворк: Vue или React
- Процесс рендеринга: отображает содержимое заметок, поддерживает форматированный текст / Markdown
- Хранение данных:
electron-storeСохранение данных заметок - главный процесс: Управление окнами, меню и сочетаниями клавиш
- Взаимодействие по IPC: Процесс рендеринга запрашивает у главного процесса чтение или сохранение данных
Шаги реализации
1. Создайте проект Electron
mkdir electron-notes cd electron-notes npm init -y npm install electron electron-store
2. Главный процесс main.js
Пример
const { app, BrowserWindow, ipcMain } = require('electron')
const Store = require('electron-store')
const store = new Store()
let mainWindow
app.whenReady().then(() => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: `${__dirname}/preload.js`
}
})
mainWindow.loadFile('index.html')
})
// IPC: Чтение заметок
ipcMain.handle('get-notes', () => store.get('notes', []))
// IPC: Сохранение заметок
ipcMain.handle('save-notes', (event, notes) => store.set('notes', notes))
const Store = require('electron-store')
const store = new Store()
let mainWindow
app.whenReady().then(() => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: `${__dirname}/preload.js`
}
})
mainWindow.loadFile('index.html')
})
// IPC: Чтение заметок
ipcMain.handle('get-notes', () => store.get('notes', []))
// IPC: Сохранение заметок
ipcMain.handle('save-notes', (event, notes) => store.set('notes', notes))
3. Скрипт предзагрузки preload.js
Пример
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('api', {
getNotes: () => ipcRenderer.invoke('get-notes'),
saveNotes: (notes) => ipcRenderer.invoke('save-notes', notes)
})
contextBridge.exposeInMainWorld('api', {
getNotes: () => ipcRenderer.invoke('get-notes'),
saveNotes: (notes) => ipcRenderer.invoke('save-notes', notes)
})
4. Процесс рендеринга index.html
Пример
<!DOCTYPE html>
<html>
<body>
<textarea id="note"></textarea>
<button id="saveBtn">Сохранить</button>
<script>
const textarea = document.getElementById('note')
const btn = document.getElementById('saveBtn')
window.api.getNotes().then(notes => {
textarea.value = notes.join('\n\n')
})
btn.addEventListener('click', async () => {
await window.api.saveNotes([textarea.value])
alert('Saved successfully')
})
</script>
</body>
</html>
<html>
<body>
<textarea id="note"></textarea>
<button id="saveBtn">Сохранить</button>
<script>
const textarea = document.getElementById('note')
const btn = document.getElementById('saveBtn')
window.api.getNotes().then(notes => {
textarea.value = notes.join('\n\n')
})
btn.addEventListener('click', async () => {
await window.api.saveNotes([textarea.value])
alert('Saved successfully')
})
</script>
</body>
</html>
Пояснение кода
electron-store: Отвечает за локальное хранение данных, автоматически сериализует JSONipcMain.handle/ipcRenderer.invoke: Реализует взаимодействие между процессом рендеринга и главным процессомcontextBridge: Безопасно предоставляет API процессу рендерингаtextarea+Button: Просто реализовать редактирование и сохранение содержимого заметок
Проект 2: Файловый менеджер
Дизайн интерфейса
- Дерево каталогов слева, список файлов справа
- Поддерживает файловые операции: создание, удаление, переименование
- Перетаскивание файлов в целевую директорию
- Простая функциональность поиска и сортировки
Реализация файловых операций
- Модуль fs Node.js: чтение, запись и удаление файлов
- модуль path: Обработка путей
- Взаимодействие по IPC: процесс рендеринга запрашивает у главного процесса выполнение файловых операций
Пример
// Основной процесс main.js
const fs = require('fs')
const path = require('path')
ipcMain.handle('read-dir', (event, dirPath) => fs.readdirSync(dirPath))
ipcMain.handle('create-file', (event, filePath) => fs.writeFileSync(filePath, ''))
ipcMain.handle('delete-file', (event, filePath) => fs.unlinkSync(filePath))
const fs = require('fs')
const path = require('path')
ipcMain.handle('read-dir', (event, dirPath) => fs.readdirSync(dirPath))
ipcMain.handle('create-file', (event, filePath) => fs.writeFileSync(filePath, ''))
ipcMain.handle('delete-file', (event, filePath) => fs.unlinkSync(filePath))
Пример
// процесс рендеринга
window.api.readDir('/Users/username/Documents').then(files => {
console.log(files)
})
window.api.readDir('/Users/username/Documents').then(files => {
console.log(files)
})
Функциональность перетаскивания
- Прослушивание процесса рендеринга
dragstartиdropEvents - Использование главного процесса
fs.renameилиfs.copyFileПеремещение файлов
Пример
// Событие drop в процессе рендеринга
const dropArea = document.getElementById('fileList')
dropArea.addEventListener('drop', (event) => {
event.preventDefault()
const filePath = event.dataTransfer.files[0].path
window.api.moveFile(filePath, targetDir)
})
const dropArea = document.getElementById('fileList')
dropArea.addEventListener('drop', (event) => {
event.preventDefault()
const filePath = event.dataTransfer.files[0].path
window.api.moveFile(filePath, targetDir)
})
Оптимизация производительности
- Используйте асинхронное чтение для больших каталогов, чтобы не блокировать процесс рендеринга
- Виртуализация списка файлов снижает нагрузку на рендеринг DOM
- Используйте пакетные обновления или Web Workers для частых операций
Итог
С помощью этих двух практических проектов вы сможете освоить:
- Работа с окнами и многопроцессное взаимодействие: родительские и дочерние окна, IPC
- Локальное хранение данных: electron-store, fs
- Оптимизация интерфейса и производительности: виртуальный список, ленивая загрузка, асинхронная обработка
- Интеграция нативных функций: файловые операции, перетаскивание, меню и сочетания клавиш
Эти проекты могут служить базовыми шаблонами для последующей разработки сложных десктопных приложений, помогая быстро создавать многофункциональные приложения Electron.
Другие расширения