Waħda mill-karatteristiċi sbieħ tat-teknoloġija 1C:Enterprise hija li s-soluzzjoni tal-applikazzjoni, żviluppata bl-użu tat-teknoloġija tal-formoli ġestiti, tista 'tiġi mnedija kemm f'klijent irqiq (eżekutibbli) għall-Windows, Linux, MacOS X, kif ukoll bħala klijent tal-web għal 5 browsers - Chrome, Internet Explorer, Firefox, Safari, Edge, u dan kollu mingħajr ma jinbidel il-kodiċi tas-sors tal-applikazzjoni. Barra minn hekk, esternament l-applikazzjoni fil-thin client u fil-browser taħdem u tidher kważi identika.
Sib 10 differenzi (2 stampi taħt il-qatgħa):
Tieqa tal-klijent irqiq fuq Linux:
L-istess tieqa fil-klijent tal-web (fil-browser Chrome):
Għaliex għamilna klijent tal-web? Biex ngħiduha kemmxejn patetika, iż-żmien stabbilixxa biċċa xogħol bħal din għalina. Ix-xogħol fuq l-Internet ilu prerekwiżit għall-applikazzjonijiet tan-negozju. L-ewwel, żidna l-abbiltà li naħdmu permezz tal-Internet għall-klijent irqiq tagħna (xi wħud mill-kompetituri tagħna, bil-mod, waqfu fuq dan; oħrajn, għall-kuntrarju, abbandunaw il-klijent irqiq u llimitaw ruħhom għall-implimentazzjoni ta 'klijent tal-web). Iddeċidejna li nagħtu lill-utenti tagħna l-opportunità li jagħżlu l-għażla tal-klijent li taqbelhom l-aħjar.
Iż-żieda ta 'kapaċitajiet ibbażati fuq il-web lill-thin client kien proġett kbir b'bidla sħiħa fl-arkitettura klijent-server. Il-ħolqien ta 'klijent tal-web huwa proġett kompletament ġdid, li jibda mill-bidu.
Dikjarazzjoni tal-problema
Għalhekk, ir-rekwiżiti tal-proġett: il-klijent tal-web għandu jagħmel l-istess bħall-klijent irqiq, jiġifieri:
Uri l-interface tal-utent
Eżegwixxi kodiċi tal-klijent miktub bil-lingwa 1C
L-interface tal-utent f'1C hija deskritta f'editur viżwali, iżda b'mod dikjarattiv, mingħajr arranġament pixel b'pixel tal-elementi; Jintużaw madwar tliet tużżani tipi ta’ elementi ta’ interface - buttuni, oqsma ta’ input (test, numeriku, data/ħin), listi, tabelli, graffs, eċċ.
Il-kodiċi tal-klijent fil-lingwa 1C jista 'jkun fih sejħiet għal server, li jaħdmu ma' riżorsi lokali (fajls, eċċ.), stampar, u ħafna aktar.
Kemm il-klijent irqiq (meta jaħdem permezz tal-web) kif ukoll il-klijent tal-web jużaw l-istess sett ta 'servizzi tal-web biex jikkomunikaw mas-server tal-applikazzjoni 1C. L-implimentazzjonijiet tal-klijenti, ovvjament, huma differenti - il-klijent irqiq huwa miktub f'C++, il-klijent tal-web huwa miktub f'JavaScript.
Ftit storja
Il-proġett tal-klijent tal-web beda fl-2006, b'tim ta' (medja) 5 persuni. F'ċerti stadji tal-proġett, l-iżviluppaturi kienu involuti biex jimplimentaw funzjonalità speċifika (dokument tal-ispreadsheet, dijagrammi, eċċ.); bħala regola, dawn kienu l-istess żviluppaturi li għamlu din il-funzjonalità fil-thin client. Dawk. l-iżviluppaturi reġgħu kitbu komponenti f'JavaScript li kienu ħolqu qabel f'C++.
Mill-bidu nett, irrifjutajna l-idea ta 'kwalunkwe konverżjoni awtomatika (anke parzjali) ta' kodiċi tal-klijent irqiq C++ f'klijent web JavaScript minħabba d-differenzi kunċettwali qawwija bejn iż-żewġ lingwi; il-klijent tal-web inkiteb bil-JavaScript mill-bidu.
Fl-ewwel iterazzjonijiet tal-proġett, il-klijent tal-web ikkonverti l-kodiċi tal-klijent fil-lingwa 1C integrata direttament f'JavaScript. Il-klijent irqiq jaġixxi b'mod differenti - il-kodiċi fil-lingwa 1C mibnija huwa kkompilat f'bytecode, u mbagħad dan il-bytecode jiġi interpretat fuq il-klijent. Sussegwentement, il-klijent tal-web beda jagħmel l-istess - l-ewwelnett, ta gwadann fil-prestazzjoni, u t-tieni, għamilha possibbli li tgħaqqad l-arkitettura tal-klijenti rqiqa u tal-web.
L-ewwel verżjoni tal-pjattaforma 1C:Enterprise b'appoġġ għall-klijent tal-web ġiet rilaxxata fl-2009. Il-klijent tal-web dak iż-żmien appoġġa 2 browsers - Internet Explorer u Firefox. Il-pjanijiet oriġinali kienu jinkludu appoġġ għal Opera, iżda minħabba problemi insormontabbli f'dak iż-żmien mal-handlers tal-għeluq tal-applikazzjoni f'Opera (ma kienx possibbli li jintraċċa b'ċertezza 100% li l-applikazzjoni kienet qed tagħlaq, u f'dak il-mument twettaq il-proċedura ta 'skonnettjar mill- 1C application server) minn dawn il-pjanijiet kellhom jiġu abbandunati.
Struttura tal-proġett
B'kollox, il-pjattaforma 1C:Enterprise għandha 4 proġetti miktuba bil-JavaScript:
Element ta' kontroll FormattedDocument (implimentat f'JavaScript kemm fil-klijent irqiq kif ukoll fil-klijent tal-web)
Element ta' kontroll Scheduler (implimentat f'JavaScript kemm fil-klijent irqiq kif ukoll fil-klijent tal-web)
Web client
L-istruttura ta 'kull proġett tixbaħ l-istruttura ta' proġetti Java (jew proġetti .NET - skond liema jkun l-eqreb); Għandna namespaces, u kull namespace jinsab f'folder separat. Ġewwa l-folder hemm fajls u klassijiet ta 'namespace. Hemm madwar 1000 fajl fil-proġett tal-klijent tal-web.
Strutturalment, il-klijent tal-web huwa maqsum fil-biċċa l-kbira fis-sottosistemi li ġejjin:
Interface ġenerali tal-applikazzjoni (menus tas-sistema, pannelli)
Interface ta' formoli ġestiti, inklużi, fost affarijiet oħra, madwar 30 kontroll (buttuni, diversi tipi ta' oqsma ta' input - test, numeriċi, data/ħin, eċċ., tabelli, listi, graffs, eċċ.)
Mudell tal-oġġett disponibbli għall-iżviluppaturi fuq il-klijent (aktar minn 400 tip b'kollox: mudell tal-oġġett tal-interface ġestit, settings tat-tqassim tad-dejta, stil kondizzjonali, eċċ.)
Interpretu tal-lingwa integrata 1C
Estensjonijiet tal-browser (użati għal funzjonalità mhux appoġġjata f'JavaScript)
Ħidma bil-kriptografija
Ħidma ma 'fajls
Teknoloġija ta 'komponenti esterni, li tippermettilhom li jintużaw kemm fil-klijenti rqiqa kif ukoll tal-web
Karatteristiċi ta' Żvilupp
L-implimentazzjoni ta 'dan kollu ta' hawn fuq f'JavaScript mhix faċli. Forsi l-klijent tal-web 1C huwa wieħed mill-akbar applikazzjonijiet fuq in-naħa tal-klijent miktuba b'JavaScript - madwar 450.000 linja. Aħna nużaw b'mod attiv approċċ orjentat lejn l-oġġetti fil-kodiċi tal-klijent tal-web, li jissimplifika l-ħidma ma 'proġett daqshekk kbir.
Biex innaqqsu d-daqs tal-kodiċi tal-klijent, l-ewwel użajna l-obfuscator tagħna stess, u bdejna bil-verżjoni tal-pjattaforma 8.3.6 (Ottubru 2014) bdejna nużaw Kompilatur tal-Għeluq tal-Google. L-effett tal-użu fin-numri - id-daqs tal-qafas tal-klijent tal-web wara l-obfuskazzjoni:
Obfuscator proprju – 1556 kb
Google Closure Compiler – 1073 kb
L-użu tal-Google Closure Compiler għenna ntejbu l-prestazzjoni tal-klijent tal-web bi 30% meta mqabbel mal-obfuscator tagħna stess. Barra minn hekk, l-ammont ta 'memorja kkunsmat mill-applikazzjoni naqas bi 15-25% (skont il-browser).
Google Closure Compiler jaħdem tajjeb ħafna b'kodiċi orjentat lejn l-oġġetti, għalhekk l-effiċjenza tiegħu għall-klijent tal-web hija għolja kemm jista 'jkun. Closure Compiler jagħmel ftit affarijiet tajbin għalina:
Iċċekkjar tat-tip statiku fl-istadju tal-bini tal-proġett (jiżgura li nkopru l-kodiċi b'annotazzjonijiet JSDoc). Ir-riżultat huwa typing statiku, qrib ħafna fil-livell tal-ittajpjar f'C++. Dan jgħin biex jinqabad persentaġġ pjuttost kbir ta 'żbalji fl-istadju tal-kumpilazzjoni tal-proġett.
Tnaqqis tad-daqs tal-kodiċi permezz ta 'obfuscation
Numru ta 'ottimizzazzjonijiet tal-kodiċi esegwit, pereżempju, bħal:
sostituzzjonijiet tal-funzjoni inline. Is-sejħa ta 'funzjoni f'JavaScript hija operazzjoni pjuttost għalja, u sostituzzjonijiet inline ta' metodi żgħar użati ta 'spiss iħaffu l-kodiċi b'mod sinifikanti.
Għadd tal-kostanti fil-ħin tal-kumpilazzjoni. Jekk espressjoni tiddependi fuq kostanti, il-valur attwali tal-kostanti jiġi sostitwit fiha
Aħna nużaw WebStorm bħala l-ambjent tagħna għall-iżvilupp tal-klijent tal-web.
Waqt l-implimentazzjoni tal-proġett, iltqajna ma’ numru ta’ problemi interessanti li kellna nsolvu.
Skambju ta' data mas-server u bejn twieqi
Hemm sitwazzjonijiet fejn it-tfixkil tal-kodiċi tas-sors jista' jinterferixxi mat-tħaddim tas-sistema. Kodiċi estern għall-kodiċi eżekutibbli tal-klijent tal-web, minħabba tfixkil, jista 'jkollu ismijiet ta' funzjonijiet u parametri li huma differenti minn dawk li l-kodiċi eżekutibbli tagħna jistenna. Il-kodiċi estern għalina huwa:
Kodiċi li ġej mis-server fil-forma ta 'strutturi tad-dejta
Kodiċi għal tieqa ta' applikazzjoni oħra
Biex tiġi evitata tfixkil meta jinteraġixxu mas-server, nużaw it-tikketta @expose:
U biex tiġi evitata l-obfuskazzjoni meta jinteraġixxu ma 'twieqi oħra, nużaw l-hekk imsejħa interfaces esportati (interfaces li fihom il-metodi kollha huma esportati).
/**
* Экспортируемый интерфейс контрола DropDownWindow
*
* @interface
* @struct
*/
WebUI.IDropDownWindowExp = function(){}
/**
* Перемещает выделение на 1 вперед или назад
*
* @param {boolean} isForward
* @param {boolean} checkOnly
* @return {boolean}
* @expose
*/
WebUI.IDropDownWindowExp.prototype.moveMarker = function (isForward, checkOnly){}
/**
* Перемещает выделение в начало или конец
*
* @param {boolean} isFirst
* @param {boolean} checkOnly
* @return {boolean}
* @expose
*/
WebUI.IDropDownWindowExp.prototype.moveMarkerTo = function (isFirst, checkOnly){}
/**
* @return {boolean}
* @expose
*/
WebUI.IDropDownWindowExp.prototype.selectValue = function (){}
Użajna DOM Virtwali qabel ma sar mainstream)
Bħall-iżviluppaturi kollha li jittrattaw UIs tal-Web kumplessi, aħna malajr indunajna li d-DOM mhux adattat tajjeb biex jaħdem ma 'interfaces tal-utent dinamiċi. Kważi immedjatament, analogu ta 'DOM Virtwali ġie implimentat biex jiġi ottimizzat ix-xogħol mal-UI. Matul l-ipproċessar tal-avvenimenti, il-bidliet DOM kollha huma maħżuna fil-memorja u, meta l-operazzjonijiet kollha jitlestew biss, il-bidliet akkumulati jiġu applikati għas-siġra DOM.
L-ottimizzazzjoni tal-klijent tal-web
Biex il-klijent tal-web tagħna jaħdem aktar malajr, nippruvaw nużaw il-kapaċitajiet standard tal-browser (CSS, eċċ.) sal-massimu. Għalhekk, il-pannell tal-kmand tal-formola (li jinsab fuq kważi kull forma tal-applikazzjoni) huwa magħmul esklussivament bl-użu ta 'għodod tal-browser, bl-użu ta' tqassim dinamiku bbażat fuq CSS.
Ittestjar
Għall-ittestjar funzjonali u tal-prestazzjoni, nużaw għodda proprjetarja (miktuba f'Java u C++), kif ukoll sett ta' testijiet mibnija fuq Selenju.
L-għodda tagħna hija universali - tippermettilek tittestja kważi kull programm windowed, u għalhekk hija adattata għall-ittestjar kemm ta 'klijent irqiq kif ukoll ta' klijent tal-web. L-għodda tirreġistra l-azzjonijiet tal-utent li nieda s-soluzzjoni tal-applikazzjoni 1C f'fajl b'kitba. Fl-istess ħin, immaġini taż-żona tax-xogħol tal-iskrin—standards—jiġu rreġistrati. Meta timmonitorja verżjonijiet ġodda tal-klijent tal-web, skripts jintlagħbu mingħajr il-parteċipazzjoni tal-utent. F'każijiet fejn il-screenshot ma taqbilx ma 'referenza waħda fi kwalunkwe pass, it-test jitqies fallut, u wara speċjalista tal-kwalità jwettaq investigazzjoni biex jiddetermina jekk dan huwiex żball jew bidla ppjanata fl-imġiba tas-sistema. F'każ ta' mġiba ppjanata, l-istandards jiġu sostitwiti awtomatikament b'oħrajn ġodda.
L-għodda tkejjel ukoll il-prestazzjoni tal-applikazzjoni bi preċiżjoni sa 25 millisekondi. F'xi każijiet, aħna loop partijiet ta 'l-iskrittura (per eżempju, tirrepeti d-dħul ta' l-ordni diversi drabi) biex tanalizza d-degradazzjoni tal-ħin ta 'eżekuzzjoni maż-żmien. Ir-riżultati tal-kejl kollu huma rreġistrati f'ġurnal għall-analiżi.
L-għodda tal-ittestjar tagħna u l-applikazzjoni taħt test
L-għodda tagħna u Selenju jikkumplimentaw lil xulxin; pereżempju, jekk xi buttuna fuq waħda mill-iskrins inbidlet il-post tagħha, Selenium jista' ma jsegwix dan, iżda l-għodda tagħna tinduna, għax jagħmel paragun pixel b'pixel tal-screenshot mal-istandard. L-għodda hija kapaċi wkoll issegwi problemi bl-input tal-ipproċessar mit-tastiera jew il-maws, peress li dan huwa eżattament dak li tirriproduċi.
It-testijiet fuq iż-żewġ għodod (tagħna u Selenium) imexxu xenarji tax-xogħol tipiċi mis-soluzzjonijiet tal-applikazzjoni tagħna. It-testijiet huma mnedija awtomatikament wara l-bini ta 'kuljum tal-pjattaforma 1C:Enterprise. Jekk l-iskripts huma aktar bil-mod (meta mqabbel mal-bini ta 'qabel), aħna ninvestigaw u nsolvu l-kawża tat-tnaqqis. Il-kriterju tagħna huwa sempliċi - il-bini l-ġdid m'għandux jaħdem aktar bil-mod minn dak ta 'qabel.
L-iżviluppaturi jużaw għodod differenti biex jinvestigaw inċidenti ta 'tnaqqis; prinċipalment użati Edizzjoni Dynatrace AJAX kumpanija tal-produzzjoni DynaTrace. Jiġu rreġistrati zkuk tal-eżekuzzjoni tal-operazzjoni problematika fuq il-bini preċedenti u ġodda, imbagħad jiġu analizzati z-zkuk. Fl-istess ħin, il-ħin ta 'eżekuzzjoni ta' operazzjonijiet singoli (f'millisekondi) jista 'ma jkunx fattur deċiżiv - proċessi ta' servizz bħall-ġbir taż-żibel huma mnedija perjodikament fil-browser, jistgħu jikkoinċidu mal-ħin ta 'eżekuzzjoni tal-funzjonijiet u jgħawġu l-istampa. Parametri aktar rilevanti f'dan il-każ ikunu n-numru ta 'struzzjonijiet JavaScript esegwiti, in-numru ta' operazzjonijiet atomiċi fuq id-DOM, eċċ. Jekk in-numru ta 'struzzjonijiet/operazzjonijiet fl-istess skript żdied f'verżjoni ġdida, dan kważi dejjem ifisser tnaqqis fil-prestazzjoni li jeħtieġ li tiġi kkoreġuta.
Ukoll, waħda mir-raġunijiet għat-tnaqqis fil-prestazzjoni tista 'tkun li Google Closure Compiler għal xi raġuni ma setax iwettaq sostituzzjoni inline tal-funzjoni (per eżempju, minħabba li l-funzjoni hija rikurrettiva jew virtwali). F'dan il-każ, nippruvaw nikkoreġu s-sitwazzjoni billi niktbu mill-ġdid il-kodiċi tas-sors.
Estensjonijiet tal-browser
Meta soluzzjoni ta' applikazzjoni teħtieġ funzjonalità li mhix disponibbli f'JavaScript, nużaw l-estensjonijiet tal-browser:
L-estensjonijiet tagħna jikkonsistu f'żewġ partijiet. L-ewwel parti hija dik li tissejjaħ estensjoni tal-browser (ġeneralment estensjonijiet għal Chrome u Firefox miktuba bil-JavaScript), li jinteraġixxu mat-tieni parti - estensjoni binarja li timplimenta l-funzjonalità li għandna bżonn. Għandu jissemma li niktbu 3 verżjonijiet ta 'estensjonijiet binarji - għall-Windows, Linux u MacOS. L-estensjoni binarja hija fornuta bħala parti mill-pjattaforma 1C:Enterprise u tinsab fuq is-server tal-applikazzjoni 1C. L-ewwel darba li tissejjaħ minn klijent tal-web, titniżżel fuq il-kompjuter tal-klijent u tiġi installata fil-browser.
Meta taħdem f'Safari, l-estensjonijiet tagħna jużaw NPAPI; meta jaħdmu f'Internet Explorer, jużaw it-teknoloġija ActiveX. Microsoft Edge għadu ma jappoġġjax estensjonijiet, għalhekk il-klijent tal-web fih jaħdem b'restrizzjonijiet.
Aktar żvilupp
Wieħed mill-kompiti għat-tim tal-iżvilupp tal-klijent tal-web huwa l-iżvilupp ulterjuri tal-funzjonalità. Il-funzjonalità tal-klijent tal-web għandha tkun identika għall-funzjonalità tal-klijent irqiq; il-funzjonalità l-ġdida kollha hija implimentata simultanjament kemm fil-klijent irqiq kif ukoll fil-web.
Ħidmiet oħra jinkludu l-iżvilupp tal-arkitettura, ir-refactoring, it-titjib tal-prestazzjoni u l-affidabbiltà. Pereżempju, waħda mid-direzzjonijiet hija aktar moviment lejn mudell ta 'xogħol mhux sinkroniku. Xi wħud mill-funzjonalità tal-klijent tal-web bħalissa hija mibnija fuq mudell sinkroniku ta 'interazzjoni mas-server. Il-mudell asinkroniku issa qed isir aktar rilevanti fil-browsers (u mhux biss fil-brawżers), u dan iġġiegħelna nimmodifikaw il-klijent tal-web billi nissostitwixxu sejħiet sinkroniċi b'dawk asinkroniċi (u nirrefactoring il-kodiċi kif xieraq). It-tranżizzjoni gradwali għal mudell mhux sinkroniku hija spjegata mill-ħtieġa li jiġu appoġġjati s-soluzzjonijiet rilaxxati u l-adattament gradwali tagħhom.