
Kao okvir za razvoj stolnih aplikacija, Electron ima puno toga za ponuditi. Omogućuje puni pristup Nodeovom API-ju i ekosferi. Primjenjuje se na svim glavnim operativnim sustavima (s jednom bazom koda). A sa svojom internetskom arhitekturom možete koristiti najnovije značajke CSS-a za stvaranje naprednih korisničkih sučelja.
Puno je članaka koji se bave postavljanjem i radom s Electronom, ali manje posvećenih upotrebi SQLitea ili načinu rada s višestrukim nitima. Pogledat ćemo kako koristiti Electron za izradu aplikacija koje obrađuju velike količine podataka ili pokreću puno zadataka.
Posebno ćemo pokriti:
- Kako Electron radi (ukratko) i kako njegova arhitektura utječe na ono što možemo učiniti
- Višenitnost
- Korištenje lokalnih baza podataka kao što je SQLite ili pisanje u bilo koju datoteku unutar aplikacije Electron
- Izvorni moduli
- Nekoliko problema kojih biste trebali biti svjesni
- Pakiranje aplikacije pomoću izvornih modula
Kako Electron djeluje - skraćeno

Vrijedno je ponoviti ključne principe iza Electronove arhitekture. Aplikacija Electron sastoji se od najmanje dva procesa. Glavna nit je ulaz u vašu aplikaciju i obavlja sav posao potreban da korisnicima prikaže vaš postupak (ili procese) prikazivanja. Glavni postupak može biti samo jedan primjer.
Renderer procesi koriste Chromium za generiranje vaše aplikacije. Baš kao što svaka kartica radi u svom procesu, tako to radi i svaki render. Učitavaju se pomoću metode loadURL konstruktora BrowserWindow, koja treba usmjeriti na lokalnu ili udaljenu HTML datoteku. To znači da je jedini način pokretanja postupka prikazivanja upotreba HTML datoteke kao unosa.
Upozorenja Electronove arhitekture
Jednostavnost Electrona jedna je od njegovih najvećih prednosti. Vaš glavni postupak izvodi bilo koju potrebnu konfiguraciju, a zatim prosljeđuje HTML datoteku ili URL u postupak prikazivanja. Ova datoteka može učiniti sve što može uobičajena web aplikacija - i dobro je otići odande.
No, činjenica da može postojati samo jedan glavni postupak čini nejasnim način na koji se primjenjuje multithreading. Electronova dokumentacija implicira da su procesi prikazivanja strogo dizajnirani za zadatak prikazivanja korisničkih sučelja (što će, kako ćemo vidjeti, nije istina).
Važno je znati da će radnja bilo čega računalno intenzivnog u glavnom procesu usporiti (ili zamrznuti) vaše prikazivačke procese. Ključno je da se svaki računski intenzivan rad pomakne s glavne niti. Najbolje je prepustiti samo zadaći da učini sve što je potrebno za pokretanje vaših procesa prikazivanja. Budući da ne možemo intenzivno raditi na istom postupku prikazivanja koji generira sučelje aplikacije (jer će to također utjecati na korisničko sučelje), potreban nam je drugi pristup.
Višenitnost

Tri su općenita pristupa multithreadingu u Electronu:
- Koristite web radnike
- Fork nove procese za pokretanje zadataka
- Pokreni (skriveni) renderer procese kao radnike
Web radnici
Budući da je Electron izgrađen na vrhu Chromiuma, sve što se može učiniti u pregledniku može se obaviti u postupku prikazivanja. To znači da web-radnike možete koristiti za pokretanje intenzivnih zadataka u zasebnim nitima. Prednost ovog pristupa je jednostavnost i zadržavanje izomorfizma s web aplikacijom.
Međutim, postoji jedno vrlo veliko upozorenje - ne možete koristiti izvorne module. Tehnički možete, ali to će uzrokovati pad aplikacije. To je značajan problem, jer će svaka aplikacija koja treba multithreading možda trebati koristiti i nativne module (poput node-sqlite3).
Račvanje novih procesa
Electron koristi Node kao vrijeme izvođenja, što znači da imate puni pristup ugrađenim modulima poput klastera. Novi procesi mogu se račvati za pokretanje zadataka, zadržavajući intenzivan rad izvan glavne niti.
Glavno je pitanje da, za razliku od procesa prikazivanja, podređeni procesi ne mogu koristiti metode iz Electron biblioteke. To vas prisiljava na održavanje komunikacijskog kanala s glavnim procesom preko IPC-a. Renderer procesi mogu pomoću udaljenog modula reći glavnom procesu da obavlja glavne zadatke bez ovog dodatnog koraka.
Drugi je problem da ako koristite ES module ili TC39 značajke JavaScripta, morat ćete osigurati pokretanje prevedenih verzija svojih skripti. Morat ćete ih uključiti i u svoju zapakiranu aplikaciju. Ovaj problem utječe na bilo koju Node aplikaciju koja račva procese, ali dodaje još jedan sloj vašem procesu gradnje. Također može postati nezgodno kada uravnotežite zahtjeve pakiranja vaše aplikacije pomoću razvojnih alata koji koriste značajke poput ponovnog učitavanja uživo.
Korištenje procesa prikazivanja kao radne niti
Procesi prikazivanja uobičajeno se tretiraju kao da se koriste za generiranje vašeg korisničkog sučelja. Međutim, oni nisu vezani za taj jedini zadatak. Mogu se sakriti i pokrenuti u pozadini konfiguriranjem zastave za prikaz proslijeđene u BrowserWindow.
Čineći to ima mnogo prednosti. Za razliku od web radnika, imate slobodu korištenja izvornih modula. I za razliku od račvastih procesa, i dalje možete koristiti biblioteku elektrona da biste glavnom procesu rekli da radi stvari poput otvaranja dijaloškog okvira ili stvaranja OS obavijesti.
Jedan od izazova kada se koristi Electron je IPC. Iako je jednostavan, zahtijeva pozamašnu količinu uzorka i nameće poteškoće u uklanjanju pogrešaka velikog broja slušatelja događaja. Također je još jedna stvar koju morate unit test. Korištenjem postupka prikazivanja kao radne niti možete to u potpunosti zaobići. Baš kao i na poslužitelju, možete slušati na lokalnoj luci i primati zahtjeve, omogućujući vam upotrebu alata poput GraphQL + React Apollo. Web komunikacije možete koristiti i za komunikaciju u stvarnom vremenu. Još je jedan bonus što ne trebate koristiti ipcRenderer i možete održavati svoj Electron i web aplikacije izomorfnim (ako želite koristiti zajedničku bazu koda za radnu površinu i web aplikaciju).
Za napredne slučajeve korištenja, ovaj se pristup može kombinirati s grupiranjem kako bi se dobilo najbolje od svih svjetova. Jedini nedostatak je taj što ćete trebati pružiti HTML datoteku kao unos za svoje radničke prikazivačke procese (što se čini poput hakiranja).
Kako koristiti SQLite (ili bilo što drugo na što trebate pisati)

Postoji nekoliko pristupa državnom upravljanju koji ne zahtijevaju izvorne module. Na primjer, rukovanje cijelom vašom državom u kontekstu rendera s Reduxom.
Međutim, ako trebate rukovati velikim količinama podataka, to neće biti dovoljno. Konkretno, razmotrit ćemo kako koristiti SQLite u aplikaciji Electron.
Da biste postavili svoju aplikaciju Electron, prvo ćete je morati spakirati. Za to postoji niz alata - najpopularniji je Electron Builder. Electron koristi ASAR format arhive za spajanje vaše aplikacije u jednu, nekomprimiranu datoteku. ASAR arhive su samo za čitanje - što znači da u njih ne možete upisati nikakve podatke. To znači da ne možete uključiti svoju bazu podataka u svoju ASAR arhivu zajedno s ostatkom koda (u graditelju elektrona to bi bilo pod "datotekama").
Umjesto toga, uključite svoju bazu podataka u direktorij Resursi vašeg elektronskog paketa. Struktura datoteke pakirane aplikacije Electron i gdje smjestiti bazu podataka možete vidjeti u nastavku:

Pakirana ASAR arhiva nazvana app.asar postoji u ./Contents/Resources. U isti direktorij možete smjestiti svoju bazu podataka ili bilo koju datoteku u koju želite pisati, ali je uključiti u svoju zapakiranu aplikaciju. To se može postići pomoću Electron Builder pomoću konfiguracije “extraResources”.
Drugi je pristup u potpunosti stvoriti bazu podataka u drugom direktoriju. No, brisanje ove datoteke morat ćete uzeti u obzir na svim platformama ako korisnici odluče deinstalirati vašu aplikaciju.
Pakiranje s izvornim modulima
Velika većina Node modula su skripte napisane na JavaScript-u. Izvorni moduli su moduli napisani na jeziku C ++ koji imaju vezove za upotrebu s Nodeom. Oni djeluju kao sučelje s drugim knjižnicama napisanim na C / C ++ i obično su konfigurirani za kompajliranje nakon instalacije.
Kao moduli niske razine, trebaju se sastaviti za ciljane arhitekture i operativne sustave. Izvorni modul kompiliran na Windows računalu neće raditi na Linux stroju - iako bi to radio redoviti modul. To je problem za Electron, jer na kraju sve moramo spakirati u izvršnu datoteku .dmg (OSX), .exe (Windows) ili .deb (Linux).
Elektronske aplikacije koje koriste izvorne module moraju biti spakirane u sustav koji ciljaju. Budući da ćete želite automatizirati ovaj postupak u CI / CD cjevovodu, morat ćete izgraditi svoje matične ovisnosti prije pakiranja. Da biste to postigli, možete upotrijebiti alat koji je razvio Electronov tim, a zove se elektronska obnova.
Ako razvijate nekomercijalni projekt otvorenog koda, možete koristiti TravisCI (Linux, OSX) i Appveyor (Windows) za automatsku besplatnu izradu, testiranje i primjenu aplikacije.
Postavljanje za ovo može biti nezgodno ako imate integracijske testove, jer ćete morati instalirati određene ovisnosti da bi testovi bez glave funkcionirali. Primjer konfiguracije za OSX i Linux s TravisCI možete pronaći ovdje, a primjer Appveyor konfiguracije ovdje (ovi se primjeri temelje na konfiguraciji u projektu elektronsko reagiranje, uz dodatak OSX-a i implementaciju).
Shvaćam
Kad je vaša Electron aplikacija pakirana, neka ugrađena svojstva Nodea koja se odnose na staze možda se neće ponašati onako kako biste očekivali i neće se ponašati kao kad pokrenete unaprijed izrađenu binarnu datoteku koja služi vašoj aplikaciji.
Varijable poput __dirname, __filename i metode poput process.cwd neće se ponašati onako kako se očekuje u paketnoj aplikaciji (pogledajte probleme ovdje, ovdje i ovdje). Umjesto toga upotrijebite app.getAppPath.
Posljednja napomena o pakiranju
Dok razvijate Electron aplikaciju, možda ćete htjeti koristiti i produkcijski (posluživanje paketa u paketu s unaprijed izgrađenim binarnim programom) i razvojni (koristeći webpack-dev-server ili webpack-serve za gledanje datoteka).
Da biste sačuvali zdrav razum, izradite i poslužite svoje pakete iz istog direktorija kao i izvorni kod. To znači da kad odaberete ove datoteke za pakiranje, sve pretpostavke putanje datoteka ostaju dosljedne u tim načinima i vašem paketu.
U najmanju ruku, vaš glavni postupak morat će ukazati na put datoteke HTML datoteke vašeg procesa obrade renderera. Ako ovu datoteku premjestite u drugi direktorij kao dio vašeg procesa gradnje, bit ćete prisiljeni održavati pretpostavke o strukturi datoteka, a to može brzo postati još jedan sloj oporezivanja koji morate održavati.
Otklanjanje pogrešaka u vezi s pogrešnim stazama datoteka u paketnoj aplikaciji u velikoj je mjeri slučaj pokušaja i pogrešaka.
Sažetak

Postoji nekoliko pristupa multithreadingu u Electronu. Web zaposlenici su prikladni, ali nemaju mogućnost korištenja izvornih modula. Račvanje novih procesa djeluje kao u Nodeu, ali nedostatak mogućnosti korištenja Electronove knjižnice prisiljava upotrebu IPC-a za uobičajene zadatke i brzo se može zakomplicirati. Korištenje procesa generiranja kao radnici daje punu snagu svih raspoloživih alata Node poslužitelja kao zamjenu za komunikaciju preko IPC-a, zadržavajući pritom pristup izvornim modulima i metodama iz biblioteke Electron renderer.
Kako Electron pakira datoteke u ASAR arhivu samo za čitanje, nijedna datoteka u koju trebamo pisati (poput SQLite baze podataka) ne može biti uključena. Umjesto toga, oni se mogu smjestiti u direktorij Resursi gdje će ostati u pakiranoj aplikaciji.
Napokon, imajte na umu da se neka pakirana svojstva u paketnoj aplikaciji ne ponašaju onako kako biste očekivali. A radi jasnoće uma, prilagodite strukturu datoteka svoje zapakirane aplikacije svom izvornom kodu.