Како направити Елецтрон Десктоп апликацију у ЈаваСцрипт-у: Мултитхреадинг, СКЛите, Нативе Модулес и друге уобичајене тачке бола

Као оквир за развој десктоп апликација, Елецтрон има много тога да понуди. Омогућава пуни приступ Ноде АПИ-ју и екосфери. Примењује се на свим главним оперативним системима (са једном базом кода). А са његовом веб заснованом архитектуром, можете да користите најновије функције ЦСС-а за стварање напредних корисничких интерфејса.

Много је чланака који се баве покретањем и радом са Елецтрон-ом, али мање посвећених употреби СКЛите-а или томе како се бавити мултитхреадингом. Погледаћемо како се Елецтрон користи за израду апликација које обрађују велике количине података или покрећу пуно задатака.

Конкретно, покрићемо:

  • Како Елецтрон ради (укратко) и како његова архитектура утиче на оно што можемо учинити
  • Мултитхреадинг
  • Коришћење локалних база података као што је СКЛите или писање у било коју датотеку у апликацији Елецтрон
  • Нативни модули
  • Неколико проблема којих треба да будете свесни
  • Паковање апликације помоћу изворних модула

Како Елецтрон ради - скраћено

Вреди поновити кључне принципе иза Елецтронове архитектуре. Апликација Елецтрон састоји се од најмање два процеса. Главна нит је улаз у вашу апликацију и обавља сав посао потребан за приказивање вашег процеса (или процеса) приказивања вашим корисницима. Икада може бити само један пример главног процеса.

Рендерер процеси користе Цхромиум за приказивање ваше апликације. Као што се свака картица покреће у свом процесу, тако ради и сваки приказивач. Учитавају се помоћу методе лоадУРЛ конструктора БровсерВиндов, која треба да укаже на локалну или удаљену ХТМЛ датотеку. То значи да је једини начин за покретање процеса приказивања употреба ХТМЛ датотеке као уноса.

Упозорења електронске архитектуре

Једноставност Елецтрона је једно од његових највећих богатстава. Ваш главни процес врши било коју потребну конфигурацију, а затим прослеђује ХТМЛ датотеку или УРЛ у процес приказивања. Ова датотека може учинити све што може уобичајена веб апликација - и добро је да кренете одатле.

Али чињеница да може бити само један главни процес чини нејасним начин примене мултитхреадинга. Елецтронова документација подразумева да су процеси приказивања строго дизајнирани за задатак приказивања корисничких интерфејса (што је, како ћемо видети, нетачно).

Важно је знати да ће радити било шта рачунски интензивно на главном процесу успорити (или замрзнути) ваше приказивачке процесе. Кључно је да се сваки рачунски интензиван рад помери са главне нити. Најбоље је препустити се само задатку да уради све што је потребно за покретање процеса приказивања. Будући да не можемо интензивно радити на истом процесу приказивања који приказује интерфејс апликације (јер ће ово такође утицати на кориснички интерфејс), потребан нам је други приступ.

Мултитхреадинг

Постоје три општа приступа мултитхреадинг-у у Елецтрону:

  • Користите веб раднике
  • Форк нове процесе за покретање задатака
  • Покрени (скривени) процес приказивача као раднике

Интернет радници

Пошто је Елецтрон изграђен на врху Цхромиум-а, све што се може урадити у прегледачу може се обавити у процесу приказивања. То значи да веб-раднике можете користити за покретање интензивних задатака у одвојеним нитима. Предност овог приступа је једноставност и задржавање изоморфизма са веб апликацијом.

Међутим, постоји једно врло велико упозорење - не можете да користите изворне модуле. Технички можете, али ако то учините, апликација ће се срушити. Ово је значајан проблем, јер ће било којој апликацији која треба мултитхреадинг можда требати да користи матичне модуле (као што је ноде-склите3).

Рачвање нових процеса

Елецтрон користи Ноде као рунтиме, што значи да имате пуни приступ уграђеним модулима попут кластера. Нови процеси се могу рачвати за покретање задатака, задржавајући интензиван рад изван главне нити.

Главно питање је што, за разлику од процеса приказивања, подређени процеси не могу да користе методе из Елецтрон библиотеке. То вас приморава да одржавате канал комуникације са главним процесом преко ИПЦ-а. Рендерер процеси могу да користе удаљени модул да кажу главном процесу да обавља главне задатке без овог додатног корака.

Још једно питање је да ако користите ЕС модуле или ТЦ39 функције ЈаваСцрипт-а, мораћете да осигурате покретање преписаних верзија својих скрипти. Такође ћете их морати укључити у своју пакетну апликацију. Овај проблем утиче на било коју Ноде апликацију која рачва процесе, али додаје још један слој вашем процесу израде. Такође може постати незгодно када уравнотежите захтеве за паковањем ваше апликације помоћу развојних алата који користе функције као што је поновно учитавање уживо.

Коришћење процеса приказивања као радне нити

Процеси приказивања се уобичајено третирају као да се користе за приказивање вашег корисничког интерфејса. Међутим, они нису везани за овај једини задатак. Они се могу сакрити и покренути у позадини конфигурисањем ознаке схов прослеђене у БровсерВиндов.

То има много предности. За разлику од веб радника, имате слободу да користите матичне модуле. И за разлику од рачвастих процеса, и даље можете да користите библиотеку електрона да бисте главном процесу рекли да ради ствари попут отварања дијалога или креирања обавештења о ОС-у.

Један изазов када се користи Елецтрон је ИПЦ. Иако је једноставан, захтева велику количину узорка и намеће потешкоће у отклањању грешака великог броја слушалаца догађаја. Такође је још једна ствар коју морате да тестирате на јединици. Коришћењем процеса приказивања као радне нити можете ово у потпуности заобићи. Баш као што бисте то урадили са сервером, можете слушати на локалном порту и примати захтеве, омогућавајући вам употребу алата попут ГрапхКЛ + Реацт Аполло. Веб-утичнице такође можете користити за комуникацију у реалном времену. Још један бонус је што вам није потребно да користите ипцРендерер и можете одржавати своје Елецтрон и веб апликације изоморфним (уколико желите да користите заједничку базу кодова за радну површину и веб апликацију).

За случајеве напредне употребе, овај приступ се може комбиновати са груписањем како би се добило најбоље од свих светова. Једини недостатак је тај што ћете морати да наведете ХТМЛ датотеку као унос за процесе обраде вашег радника (што се осећа као нешто хакирање).

Како се користи СКЛите (или било шта на шта треба да пишете)

Постоји неколико приступа управљању државом који не захтевају матичне модуле. На пример, руковање свом државом у контексту приказа са Редук-ом.

Међутим, ако требате руковати великим количинама података, ово неће бити довољно. Конкретно, погледаћемо како се СКЛите користи у Елецтрон апликацији.

Да бисте применили своју Елецтрон апликацију, прво ћете је морати спаковати. За то постоји низ алата - најпопуларнији је Елецтрон Буилдер. Елецтрон користи формат АСАР архиве за спајање ваше апликације у једну, некомпримовану датотеку. АСАР архиве су само за читање - што значи да у њих не можете уписати никакве податке. То значи да не можете укључити базу података у своју АСАР архиву заједно са остатком кода (у програму за изградњу електрона то би било под „датотеке“).

Уместо тога, укључите своју базу података у директоријум Ресурси вашег електронског пакета. Структура датотеке упаковане Елецтрон апликације и где сместити базу података можете видети у наставку:

Пакована АСАР архива под називом апп.асар постоји у ./Цонтентс/Ресоурцес. У исти директоријум можете сместити своју базу података или било коју датотеку у коју желите да пишете, али је укључите у своју запаковану апликацију. То се може постићи помоћу Елецтрон Буилдер-а помоћу конфигурације „ектраРесоурцес“.

Други приступ је стварање базе података у другом директоријуму у потпуности. Али мораћете да водите рачуна о брисању ове датотеке на свим платформама ако корисници одлуче да деинсталирају вашу апликацију.

Паковање са матичним модулима

Велика већина Ноде модула су скрипте написане на ЈаваСцрипт-у. Изворни модули су модули написани на језику Ц ++ који имају везе за употребу са Ноде-ом. Они делују као интерфејс за друге библиотеке написане на Ц / Ц ++ и обично су конфигурисани за компајлирање након инсталације.

Као модули ниског нивоа, морају се компајлирати за циљне архитектуре и оперативне системе. Изворни модул компајлиран на Виндовс машини неће радити на Линук машини - иако би то радио редовни модул. Ово је проблем за Елецтрон, јер на крају морамо све да спакујемо у извршну датотеку .дмг (ОСКС), .еке (Виндовс) или .деб (Линук).

Електронске апликације које користе изворне модуле морају да се спакују у систем који циљају. Будући да ћете желети да аутоматизујете овај процес у ЦИ / ЦД цевоводу, мораћете да направите своје матичне зависности пре паковања. Да бисте то постигли, можете користити алат који је развио Елецтрон тим, а зове се електронска обнова.

Ако развијате некомерцијални пројекат отвореног кода, можете да користите ТрависЦИ (Линук, ОСКС) и Аппвеиор (Виндовс) за аутоматску бесплатну изградњу, тестирање и примену апликације.

Постављање за ово може бити незгодно ако имате интеграционе тестове, јер ћете морати да инсталирате одређене зависности да би тестови без главе могли да раде. Пример конфигурације за ОСКС и Линук са ТрависЦИ можете пронаћи овде, а пример Аппвеиор конфигурације овде (ови примери се заснивају на конфигурацији у пројекту електронско реаговање, уз додатак ОСКС-а и примену).

Имам те

Када је ваша Елецтрон апликација спакована, нека уграђена својства Ноде-а која се односе на путање можда се неће понашати онако како бисте очекивали и неће се понашати онако како се понашају када покренете унапред изграђену бинарну датотеку да служи вашој апликацији.

Променљиве попут __дирнаме, __филенаме и методе попут процесс.цвд неће се понашати онако како се очекује у пакетној апликацији (погледајте проблеме овде, овде и овде). Уместо тога користите апп.гетАппПатх.

Завршна напомена о паковању

Док развијате Елецтрон апликацију, можда ћете желети да користите и производни (послуживање пакета у пакету са унапред изграђеним бинарним датотекама) и развојни (помоћу вебпацк-дев-сервера или вебпацк-сервера за гледање датотека).

Да бисте сачували здрав разум, направите и послужите своје снопове из истог директоријума као и изворни код. То значи да када одаберете ове датотеке за паковање, све претпоставке путање датотека остају доследне у свим режимима и вашем пакету.

У најмању руку, ваш главни процес мораће да укаже на путању датотеке ХТМЛ датотеке вашег процеса приказивања. Ако ову датотеку преместите у други директоријум као део процеса израде, бићете присиљени да задржите претпоставке о структури датотека, а ово може брзо постати још један слој опорезивања који требате одржавати.

Отклањање грешака у вези са погрешним стазама датотека у пакетној апликацији је у великој мери случај покушаја и грешака.

Резиме

У Елецтрону постоји неколико приступа мултитхреадинг-у. Веб радници су згодни, али им недостаје способност да користе изворне модуле. Форкинг нових процеса ради као у Ноде-у, али недостатак могућности коришћења Елецтрон библиотеке приморава употребу ИПЦ-а за уобичајене задатке и може брзо да се искомпликује. Коришћење процеса обраде као радници даје пуну снагу свих расположивих Ноде серверских алата као замену за комуникацију преко ИПЦ-а, задржавајући истовремено приступ матичним модулима и методама из библиотеке Елецтрон рендерер.

Како Елецтрон пакује датотеке у АСАР архиву само за читање, ниједна датотека у коју морамо да упишемо (као што је СКЛите база података) не може бити укључена. Уместо тога, они се могу сместити у директоријум Ресурси где ће остати у упакованој апликацији.

На крају, имајте на уму чињеницу да се у пакетној апликацији нека својства Ноде-а не понашају онако како бисте очекивали. А ради јасноће ума, упоредите структуру датотека своје упаковане апликације са изворним кодом.