Avantaje și dezavantaje ale implementării javascript pe server? Pluginuri și extensii de browser. Modele arhitecturale neclare

De la autor: trecând de la React la Vue, doi ani mai târziu. Alegerea de noi cadre și biblioteci este un proces interesant, dar și stresant. Chiar și după câteva cercetări, nu știi niciodată ce schelete vei găsi în dulapul tău.

Luna de miere durează mult. După aproximativ 2 ani de utilizare aproape zilnică a Vue, în sfârșit pot scrie despre asta cu o anumită perspectivă. Să ne uităm la avantajele inerente ale Vue js și să nu uităm de dezavantaje. ATENȚIE: Opinie personală.

Bun

Reactivitate

Legarea datelor este un lucru grozav în lumea interfețelor. În loc să microgestionăm DOM-ul așa cum am făcut-o cu jQuery, acum ne concentrăm pe date. Vue le gestionează cu grijă cu un sistem de legare a datelor reactiv în două sensuri.

Pentru a obține această reactivitate, Vue adaugă mai multe getter și setter la fiecare variabilă de stare, astfel încât să poată urmări modificările și să actualizeze automat DOM (tusea tuse, this.setState()). Această abordare nu este perfectă, așa cum vom vedea mai târziu.

Baterii incluse

Cu Vue, nu trebuie să apelăm la pachete neoficiale precum MobX sau React Router pentru părțile critice ale aplicației. Vue oferă Router-ul Vue și Vuex, un instrument reactiv asemănător Redux pentru gestionarea stării. Acestea sunt biblioteci grozave în sine, dar faptul că au fost concepute special pentru Vue le face și mai bune.

Viteză

Vue este foarte rapid. Poate că nu este cel mai rapid, dar performanța sa este suficientă pentru marea majoritate a proiectelor web. Când a fost ultima dată când ați avut nevoie să randați și să actualizați mii de elemente DOM pe secundă?

Șabloane HTML

Acesta este unul dintre subiectele care provoacă controverse în rândul dezvoltatorilor JavaScript. Indiferent de preferințele dvs., șabloanele HTML au fost dovedite de-a lungul deceniilor de utilizare în multe limbi și sunt alegerea principală pentru scrierea de markup dinamic în Vue.

Dar hei, Vue acceptă și JSX.

Alte lucruri frumoase:

Separați componentele fișierelor cu HTML, CSS și JavaScript.

Uşor. Aproximativ 20 KB (minimificat + gzip).

Foarte extensibil (mixine, pluginuri etc.).

Documentație excelentă (cu unele excepții menționate mai jos).

Poate fi adoptat treptat, chiar folosit ca înlocuitor pentru jQuery.

Doar începe să-l folosești.

Ambiguu

Șablon de componente

Trecerea de la React la Vue se simte ca o gură de aer proaspăt. Nu mai există nicio legătură (this) sau setState(). Ura! Dar după un timp, veți începe să puneți la îndoială sintaxa corectă a componentelor Vue. Componentele Vue sunt create folosind obiecte și iată un exemplu de definire a unei funcții componente:

export implicit (metode: ( increment () ( this.count++; ) ) )

export implicit(

metode: (

increment() (

acest. numără++;

Veți adăuga un model similar pentru proprietățile calculate, starea componentelor, observatori etc. Aproape totul în Vue are propria sa sintaxă specială, cu o mulțime de modele. Și iată același lucru pentru Marco, dar este mult mai curat:

clasa ( increment() ( this.state.count++; ) )

clasă(

increment() (

acest. stat. numără++;

Acum nu vorbesc despre utilizarea sau neutilizarea claselor, ci despre faptul că Vue folosește structuri obiect arbitrare în loc de funcții de limbaj.

Nu te voi învinovăți dacă simți că e puțin dezordonat când creezi aceste obiecte enervante. Vue oferă, de asemenea, o sintaxă bazată pe clasă, dar mai multe despre asta mai târziu.

Comunitate de chat

Comunitatea Vue se întâlnește pe Discord, o cameră de chat dedicată comunităților de jucători. Dacă te afli într-o situație dificilă, chatul va fi probabil al tău cea mai bună soluție, deoarece forumurile oficiale sunt tărâmuri deșertice și nu doriți să puneți o întrebare pe Github.

Chaturile sunt murdare, dar principala problemă este că conținutul chatului nu poate fi indexat motoare de căutare. Aceleași întrebări (și discuțiile aferente) sunt sortite să fie repetate iar și iar și iar.

Această tendință de utilizare a camerelor de chat pentru întrebări este legată de proiecte open source și cred că trebuie abordată. Ele nu oferă oportunități de învățare colectivă.

Nu chiar atât de magic

Atâta timp cât rămâi în afara drumurilor bătute, vei fi bine, dar după un timp probabil vei găsi o mulțime de mici dacă și dar legate de Vue. Cateva exemple:

Un sistem reactiv urmărește modificările doar în anumite condiții. Nu vă așteptați să puteți intra în orice doriți. Destul de des, poate doriți să vă simplificați datele cât mai mult posibil pentru a evita durerile de cap. Desigur, toate acestea sunt explicate în literele mici din documentație.

Sistem de tranziție nu merge pentru liste. Chiar trebuie să folosești , care funcționează ușor diferit și introduce elemente noi în DOM. De asemenea, te-ai aștepta să existe o soluție excelentă pentru asta, dar va trebui să o implementezi singur.

Dacă aveți nevoie de o stare nereactivă într-o instanță de componentă, intrați pe un teritoriu neexplorat.

Și așa mai departe. Nu mă înțelege greșit, nu este o problemă atât de mare, dar se pare că de fiecare dată când începi să-ți dai seama de o problemă, apare un alt lucru enervant.

Rău

Modele arhitecturale neclare

Iată un exemplu: este mai bine să gestionați solicitările API în componente sau în Vuex? Documentația oferă exemple despre cum să gestionați logica API în Vuex. Există chiar și o diagramă drăguță și colorată:

Înseamnă asta că logica de autentificare este inclusă și în Vuex? Va începe managerul de stat să intercepteze toată logica aplicației?

Acestea nu sunt lucruri evidente. Majoritatea oamenilor vor începe să pună logica fără stat în acțiunile Vuex sau, mai rău, direct în componente, deoarece există un videoclip pe pagina de pornire Vue:

Pentru a răspunde la întrebarea inițială: logica API nu trebuie scrisă în Vuex sau componente. Există chiar și bun exemplu cum se face acest lucru în exemplele oficiale de cod.

Concluzie

Din ce în ce mai mulți oameni se mută la Vue și mă îndoiesc că această tendință se va opri în curând. Încă nu este nici pe departe la fel de acceptat ca React (cel puțin în afara Chinei) și se luptă constant pentru locul doi cu Angular.

În trecut, am susținut că Vue este o bibliotecă pragmatică, spre deosebire de React, care pare mai idealist („Suntem JavaScript pur!”). Încă cred că este o metaforă bună. Pe de altă parte, acum simt că pragmatismul lui Vue are nevoie de mult mai mult rafinament, eleganță și simplitate la nivelul utilizatorului.

Pe parcursul celor 2 ani, experiența mea cu Vue a fost pozitivă. Încă sunt sigur că a fost buna decizie Migrez echipa mea de la React la Vue. Nu pentru că Vue este mai bună, ci pentru că funcționează mai bine pentru noi.

Vue cu siguranță face lucrurile pentru care a fost conceput și reușește în domenii în care alții eșuează, dar astăzi nu cred că Vue este obiectiv mai bun sau mai rău decât alții. opțiuni posibile. Asta e tot.

Tocmai am început să experimentez cu Aptana Jaxer în lateral server javascript pentru următorul meu proiect. Și am câteva întrebări despre ce

    Utilizând JS pe partea de server, putem implementa întreaga aplicație web fără a folosi niciuna limbi ale serverului(de ex. C#, java etc.). Sau partea serverului JS este între serverul web și o altă stivă de limbi.

    Este aceasta cu adevărat cea mai bună abordare?

    Care sunt avantajele și dezavantajele?

    Cum funcționează bine acest lucru în ceea ce privește performanța?

    Există vreo implementare în timp real (site-uri web publice) folosind doar JS pe partea serverului (fără alte limbi)?

    Care sunt alternativele disponibile pentru Aptana jaxer (sursă deschisă)?

    Cât de bine putem implementa tranzacțiile și tranzacțiile maitain db? putem face asta pe serverele JS..?

    Este posibil să creați servicii RESTFul și SOAP pe serverele JS..?

Știu că este prea lung (și întrebări naive). Sper doar că cineva a dat deja peste toate acestea în timp ce implementa JS pe server.

Asta am de gând să întreb.

Este aceasta într-adevăr o abordare mai bună decât utilizarea limbajelor de pe partea serverului (să spunem C#), cum putem compara aceasta cu o implementare C# pe un site web (performanță, caracteristici ale limbii)? Și care dintre ele este mai bună, folosind doar JS pe servere sau JS în stratul mijlociu dintre o altă stivă de limbi și serverul web?

3 raspunsuri

    Instrumente. Limbile tipizate static, cum ar fi C# și Java, au instrumente excelente de proiectare și dezvoltare. Limbile dinamice, cum ar fi JS, nu au încă suport pentru instrumente. Personal, cred că o reducere semnificativă a codului de tip boilerplate și de tip fussy este importantă pentru acest lucru, dar este totuși un mare dezavantaj dacă ați făcut multă dezvoltare în IDE. Dacă utilizați un IDE, luați în considerare utilizarea jedit pentru limbaje dinamice

    Maturitate/standardizare: Serverside JS este încă o nouă paradigmă și există mulți jucători și niciun câștigător clar. ECMA nu are standarde pentru JS pe server. După cum sa menționat în răspunsul lui Brandon, grupul CommonJS încearcă să formeze servere JS standard, iar Myna are suport experimental CommonJS prin Narwhal

În viteza de calcul brută, mai multe limbaje dinamice pot potrivi limbaje compilate tipizate static, cum ar fi C# și Java. Acestea fiind spuse, chiar nu contează. Orice parte a aplicației dvs. care necesită calcul intensiv ar trebui probabil să fie scrisă în Java sau să folosească o bibliotecă Java existentă. Nu aș sugera nimănui să scrie o bază de date în JS, de exemplu. Pentru aplicații web reale/servicii SOA, principalul motiv pentru încetiniri nu este viteza brută de calcul, este codul ineficient, în special accesul la baza de date. Myna ajută la acest lucru făcând lucruri precum:

  • stocarea în cache internă a scripturilor JS compilate
  • Utilizarea internă a declarațiilor de tranzacție a bazei de date pregătite în cache
  • Memorarea în cache a fragmentelor de interogare și de ieșire
  • Pool de conexiuni la baza de date
  • Suport automat ETag hash
  • Instrumente de profilare

Dacă te referi la o tranzacție ca în „set Instrucțiuni SQL care poate fi anulat sau angajat”, atunci Myna nu acceptă încă tranzacții. Sunt deschis să implementez acest lucru dacă există suficient interes.

Dacă vrei să spui „ce suport pentru baze de date are JS pe server?” atunci răspunsul depinde de platformă. Platforma Myna oferă următoarele caracteristici de bază de date:

  • O aplicație de administrare web în care puteți defini „surse de date”, adică informații de conectare la baza de date. Apoi puteți interoga aceste surse de date după nume. Myna include drivere JDBC pentru H2, MySQL, Microsoft SQL Server și Postgresql, dar orice sursă de date JDBC sau ODBC poate fi utilizată
  • Myna.Database și Myna.Table oferă acces la baza de date fără metadate, precum și crearea și modificarea tabelelor.
  • Obiectul Myna Query acceptă maxRows, paginare, parametri SQL, handlere de rând personalizate, interogare de interogare, stocare în cache și multe altele
  • Obiectul Myna DataManager acceptă crearea de obiecte ORM.

este posibil să creați servicii RESTFul și SOAP pe serverele JS..

Suportul REST și SOAP sunt caracteristici specifice platformei. Myna WebService acceptă următoarele protocoale:

  • XML-RPC
  • JSON-RPC
  • Ext Direct
  • JSON-Mine (un protocol simplu care utilizează mesaje de formular obișnuite și returnează JSON. Ușor de utilizat din browser)

Myna înțelege, de asemenea, metodele de solicitare PUT și DELETE și oferă acces la conținutul corpului cererii atât sub formă de text, cât și în formă binară, astfel încât să puteți gestiona aceste metode RESTful într-un mod special.

Depanare

Depanarea tradițională a punctului de întrerupere este un adevărat apel pe server. Deși Rhino acceptă cârlige de depanare, utilizarea acestor facilități dintr-o aplicație web fără stat este destul de atractivă. Personal, nici măcar nu folosesc depanatoare de puncte de întrerupere, chiar și atunci când sunt disponibile (cum ar fi firebug). Prefer să scriu în jurnal.

Myna.log(tip, etichetă, detaliu)

va crea un fir cu prioritate scăzută pentru a scrie un mesaj de jurnal HTML în baza de date de înregistrare Myna. Aceste jurnalele pot fi apoi găsite prin intermediul administratorului Myna. Jurnalele înregistrează, de asemenea, marcaje temporale și milisecunde scurse pentru profilare. Myna.dump(obj) poate fi folosit și pentru a reprezenta vizualizarea tabelului HTML a oricărui obiect. Myna înregistrează, de asemenea, toate excepțiile netratate cu urme de stivă, contextul codului sursă și solicitări. Între dump(), log() și handlerul de erori implicit, nu am prea multe probleme la depanarea codului Myna

Folosind JS pe partea de server, putem implementa întreaga aplicație web fără a folosi niciun limbaj de pe partea serverului (cum ar fi C#, java etc.).

Nu este nevoie să codificați în alte limbi, deși multe servere JavaScript de pe partea de server folosesc motorul Rhino, care vă permite să apelați orice cod Java.

Este aceasta cu adevărat cea mai bună abordare?

Nu cred că JavaScript (ca limbă) este cu adevărat mai bun sau mai rău decât limbajele tradiționale de pe server. Are avantaje (împreună cu alte limbaje dinamice precum Ruby și Python) precum flexibilitate, prototipare rapidă (fără joc de cuvinte), flexibilitate etc. În dezavantaj, nu are suportul de bibliotecă pe care îl au Java și C#, sau tastare statică (nu voi intra într-o dezbatere despre care este mai bine aici; îmi plac ambele din motive diferite).

Dacă doriți tot ce este mai bun din ambele lumi, puteți utiliza JavaScript ca limbaj de scripting încorporat în aplicația dvs. Rhino pentru Java și JScript.NET facilitează manipularea obiectelor native în JavaScript. De exemplu, puteți scrie clasele de domeniu în Java sau C# și puteți scrie script cu folosind JavaScript unde vrei mai multă flexibilitate. Dacă ești suficient de confortabil cu JavaScript, scrierea într-o singură limbă poate fi mai ușoară, dar.

Nu am scris niciodată „adevărat” aplicație server folosind JavaScript, așa că nu pot judeca dacă este mai bun sau mai rău decât .NET (de asemenea, nu am folosit niciodată JScript.NET). M-am jucat cu câteva cadre pentru distracție, deși în prezent îmi rescriu site-ul personal folosind Helma NG. Până acum a fost experiență bună(mult mai bine decât PHP, care nu mi-a plăcut niciodată).

Care sunt avantajele și dezavantajele?

  • Este necesară o singură limbă pentru programarea serverului și clientului.
  • Posibilitatea de partajare a codului pentru lucruri precum validarea formularelor. Jaxer vă permite să rulați scripturi pe client, server sau ambele.
  • Obțineți un program JavaScript (presupunând că vă place limbajul).

Defecte:

  • Multe cadre sunt experimentale/nu foarte mature.
  • Trebuie să programați în JavaScript (dacă nu vă place limba respectivă).

cum functioneaza din punct de vedere al performantei?

Performanța ar trebui să fie aproximativ comparabilă cu alte limbaje de scripting.

Există o implementare în timp real (site-uri web publice) care utilizează numai JS pe partea serverului (fără alte limbi)?

Nu cunosc site-uri importante care să utilizeze JavaScript, dar pot fi câteva.

ce alternative sunt disponibile pentru Aptana jaxer (sursă deschisă)

Ca prefață, folosesc SSJS la munca mea de zi cu zi. Derulăm un site web destul de mare (în ceea ce privește complexitatea, precum și vizualizarea paginii) pe SpiderMonkey. Voi adăuga la răspunsul excelent al lui Matthew acolo unde am experiență.

Este aceasta într-adevăr o abordare mai bună decât utilizarea limbajelor de pe partea serverului (să spunem C#)

„Mai bine” depinde cu adevărat de ce vrei să faci cu el. JavaScript în sine are câteva caracteristici grozave, precum și unele destul de groaznice. Dacă sunteți serios în ceea ce privește dezvoltarea JS (client sau server), nu vă pot recomanda suficient să urmăriți prezentarea lui Douglas Crockford. Javascript: părțile bune dacă nu ai făcut-o deja. A făcut o treabă fantastică de a sorta răcoare și este un vorbitor grozav.

Cel mai mare lucru care îmi lipsește din lumea SSJS în acest moment este maturitatea. Nu sunt familiarizat cu C#, dar JavaScript nu are o bibliotecă standard matură și nu are instrumente mature de distribuire a pachetelor. Aceasta este o piesă mare a puzzle-ului pentru mine.

Cu toate acestea, aruncați o privire la grupul CommonJS. Ei lucrează pentru a determina exact aceste lucruri. În plus, documentația Jaxer Api listează modulele încorporate care sunt incluse în acest cadru.

cum functioneaza din punct de vedere al performantei?

JavaScript în sine nu este un limbaj lent și nici nu este deosebit de rapid. După cum a menționat Matthew, ar trebui să fie comparabil cu orice alt limbaj de scripting pe care l-ați folosi. Un război între furnizorii de browsere pentru a vedea cine poate construi cel mai mult browser rapid, va beneficia, de asemenea, mulțimea SSJS.

Colectarea colectivă de gunoi pe care echipa V8 o integrează în motorul lor este un exemplu excelent în acest sens. Încetarea mașină virtuală eliberarea obiectelor inaccesibile din heap și recuperarea memoriei lor poate fi oarecum lentă, dar au atenuat acest lucru prin reducerea numărului de obiecte care trebuie verificate atunci când rulează colectorul de gunoi.

cât de bine putem implementa și sprijini tranzacțiile db? putem face asta pe serverul JS..?

Jaxer are API-uri pentru baze de date MySQL și SQLite. După cum a remarcat Matthew, dacă utilizați Rhino, puteți utiliza API-ul JDBC.

Acum că am terminat cu sintaxa, să trecem în sfârșit la partea distractivă: a învăța avantajele și dezavantajele utilizării tipurilor statice.

Beneficiul #1: Puteți găsi erori și erori devreme

Verificarea tipului static ne permite să verificăm dacă un invariant pe care îl definim se evaluează la adevărat fără măcar să rulăm programul. Și dacă există vreo încălcare a acestor invarianți, aceasta va fi detectată înainte de a începe programul și nu în timp ce acesta rulează.

Un exemplu rapid: să presupunem că avem o funcție mică care ia raza și calculează aria:

Const calculateArea = (raza) => 3,14 * raza * raza; var area = calculateArea(3); // 28.26
Acum, dacă vrem să transmitem o rază unei funcții care nu este un număr (cum ar fi „intrus”)...

Var area = calculateArea("sunt rău"); // NaN
Vom primi NaN înapoi. Dacă o anumită funcționalitate se bazează pe funcția calculateArea care returnează întotdeauna un număr, atunci acest lucru va duce la o vulnerabilitate sau un accident. Nu prea frumos, nu?

Dacă am folosi tipuri statice, am defini tip specific parametrii transmisi și valorile returnate pentru această funcție:

Const calculateArea = (raza: număr): număr => 3,14 * rază * rază;
Acum încercați să treceți altceva decât un număr funcției calculateArea - și Flow va returna un mesaj convenabil și frumos:

CalculateArea(„Sunt rău”); ^^^^^^^^^^^^^^^^^^^^^^^^^ apelul funcţiei calculateArea(„Sunt rău”); ^^^^^^^^^^ șir. Acest tip este incompatibil cu const calculateArea = (radius: number): number => 3.14 * radius * radius; ^^^^^^ număr
Acum avem garanția că funcția va accepta doar numere valide ca intrare și va returna rezultatul numai ca numere valide.

Deoarece verificatorul de tip vă informează despre erori în timp ce scrieți codul, este mult mai convenabil (și mult mai ieftin) decât căutarea unei erori după ce codul a fost livrat clientului.

Beneficiul #2: aveți documente în viață

Tipurile acționează ca documente vii și respirabile atât pentru tine, cât și pentru ceilalți.

Pentru a înțelege cum, să ne uităm la o metodă pe care am găsit-o odată într-o bază de cod mare cu care lucram:

Funcția calculatePayoutDate(quote, amount, paymentMethod) (let payoutDate; /* logica de afaceri */ return payoutDate; )
La prima vedere (atât a doua cât și a treia), este complet neclar cum să utilizați această funcție.

Este citatul un număr? Sau o valoare logică? Metoda de plată este un obiect? Sau ar putea fi un șir care reprezintă tipul metodei de plată? Funcția returnează data ca șir? Sau este un obiect Date?

Nici o idee.

La acel moment, am decis să evaluez toată logica de afaceri și să grep baza de cod până mi-am dat seama de totul. Dar este prea multă muncă doar pentru a înțelege cum funcționează o funcție simplă.

Pe de altă parte, dacă ai scris așa ceva:

Funcția calculatePayoutDate(quote: boolean, amount: number, paymentMethod: șir): Data (let payoutDate; /* logica de afaceri */ return payoutDate; )
ar deveni imediat clar ce tip de date acceptă funcția și ce tip returnează. Acesta este un exemplu despre modul în care tipurile statice pot fi utilizate pentru a comunica ce funcție intenționează do. Putem spune altor dezvoltatori ce așteptăm de la ei și putem vedea ce așteaptă ei de la noi. Data viitoare, dacă cineva va folosi această funcție, nu vor mai fi întrebări.

Puteți paria că această problemă este rezolvată adăugând comentarii la cod sau documentație:

/* @function Determină data plății pentru o cotație @param (booleană) de achiziție - Este aceasta pentru o cotație de preț? @param (boolean) suma - Suma achiziției @param (șir) paymentMethod - Tipul metodei de plată utilizată pentru această achiziție */ function calculatePayoutDate(quote, amount, paymentMethod) ( lasă payoutDate; /* .... Logica de afaceri... . */ return payoutDate; );
Funcționează. Dar aici sunt multe mai multe cuvinte. Pe lângă faptul că sunt detaliate, astfel de comentarii în cod sunt greu de întreținut, deoarece nu sunt de încredere și nu au structură - unii dezvoltatori scriu comentarii bune, în timp ce alții pot scrie ceva de neînțeles, iar unii pot chiar uita să lase un comentariu.

Este deosebit de ușor să uiți să actualizezi un comentariu după o refactorizare. Pe de altă parte, adnotările de tip au o sintaxă și o structură bine definite și nu vor deveni niciodată învechite deoarece sunt codificate în codul însuși.

Beneficiul #3: elimină gestionarea confuză a erorilor

Tipurile ajută la eliminarea gestionării confuze a erorilor din codul dvs. Să ne întoarcem la funcția calculateArea și să vedem cum se întâmplă acest lucru.

De data aceasta, îi voi transmite o matrice de raze pentru a calcula zonele pentru fiecare rază:

Const calculateAreas = (razele) => ( var zone = ; for (fie i = 0; i< radii.length; i++) { areas[i] = PI * (radii[i] * radii[i]); } return areas; };
Această funcție funcționează, dar nu gestionează corect argumentele de intrare nevalide. Dacă vrem să ne asigurăm că funcția gestionează corect situațiile în care argumentele de intrare nu sunt matrice valide de numere, vom ajunge cu o funcție de genul acesta:

Const calculateAreas = (razele) =>< radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; };
Wow. Există mult cod pentru o astfel de mică bucată de funcționalitate.

Și cu tipurile statice scriem pur și simplu:

): Matrice => < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
Acum, funcția arată ca înainte de a adăuga tot gunoiul vizual din cauza gestionării erorilor.

Este ușor de înțeles beneficiile tipurilor statice, nu?

Beneficiul #4: Puteți refactoriza cu mai multă încredere

Lasă-mă să explic asta cu o poveste din viața mea. Într-o zi, lucram cu o bază de cod foarte mare și trebuia să actualizez o metodă setată în clasa User. În special, modificați unul dintre parametrii funcției din șir în obiect .

Am făcut schimbarea, dar mi-a fost teamă să mă commit - au fost atât de multe apeluri la această funcție împrăștiate în cod, încât nu eram sigur că am actualizat corect toate instanțele. Ce se întâmplă dacă un apel a fost lăsat undeva adânc într-un fișier auxiliar neverificat?

Singura modalitate de a testa este să trimiteți codul și să vă rugați să nu explodeze cu o grămadă de erori.

Când utilizați tipuri statice, această problemă nu va apărea. Acolo voi avea liniște că, dacă actualizez o funcție și definițiile de tip, verificatorul de tip va fi acolo pentru a detecta erorile pe care le-am ratat. Tot ce rămâne este să treci prin aceste erori de tip și să le corectezi.

Beneficiul #5: Separați datele și comportamentul

Un beneficiu rar menționat al tipurilor statice este că ajută la separarea datelor de comportament.

Să ne uităm din nou la funcția calculateArea cu tipuri statice:

Const calculateAreas = (razele: Matrice ): Matrice => ( var zone = ; pentru (var i = 0; i< radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
Luați în considerare modul în care am aborda compunerea acestei funcții. Deoarece specificăm tipuri de date, suntem forțați să ne gândim mai întâi la tipurile de date pe care urmează să le folosim, astfel încât să putem seta tipurile parametrilor trecuți și să returnăm valorile în consecință.

Abia după aceasta implementăm logica:

Capacitatea de a exprima datele cu acuratețe separat de comportament ne permite să ne explicăm presupunerile și să transmitem intenția mai precis, ceea ce elimină o parte din sarcina mentală și oferă programatorului o oarecare claritate mentală. Altfel, trebuie doar să păstrezi totul în minte cumva.

Beneficiul #6: elimină o întreagă categorie de bug-uri

Erorile de tip run-time sunt una dintre cele mai frecvente erori sau erori pe care le întâlnesc dezvoltatorii JavaScript.

De exemplu, să presupunem că starea inițială a aplicației a fost setată la:

Var appState = ( isFetching: false, mesaje: , );
Și să presupunem că facem apoi un apel API pentru a prelua mesajele și a popula appState. În continuare, aplicația noastră are o componentă de vizualizare prea simplificată care preia mesaje (enumerate în starea de mai sus) și afișează numărul de mesaje necitite și fiecare mesaj ca element de listă:

Import mesaj din „./Message”; const MyComponent = (( mesaje )) => ( return (

( messages.map(message => )}
); };
Dacă apelul API pentru preluarea mesajelor eșuează sau returnează nedefinit, atunci veți întâlni o eroare de tip în producție:

TypeError: Nu se poate citi proprietatea „lungime” nedefinită
... și programul tău se va bloca. Vei pierde un client. O perdea.

Să vedem cum vă pot ajuta tipurile statice. Să începem prin a adăuga tipuri de flux la starea aplicației. Folosesc un alias de tip AppState pentru a defini starea:

Tastați AppState = ( isFetching: boolean, mesaje: ?Matrice ); var appState: AppState = ( isFetching: false, mesaje: null, );
Deoarece se știe că API-urile pentru preluarea mesajelor nu funcționează în mod fiabil, vom specifica tipul poate pentru valoarea mesajelor pentru o matrice de șiruri.

La fel ca data trecută, luăm mesaje prin intermediul API-ului nesigur și le folosim în componenta de vizualizare:

Import mesaj din „./Message”; const MyComponent = (( mesaje )) => ( return (

Aveți ( mesaje.lungime ) mesaje necitite

( messages.map(message => )}
); };
Dar în acest moment Flow va detecta o eroare și va plânge:

^^^^^^ proprietate `lungime`. Proprietatea nu poate fi accesată pe o valoare posibilă nulă

Aveți mesaje (message.length) necitite

^^^^^^^^^ nul

Aveți mesaje (message.length) necitite

^^^^^^ proprietate `lungime`. Proprietatea nu poate fi accesată pe o valoare posibil nedefinită

Aveți mesaje (message.length) necitite

^^^^^^^^ nedefinit ( messages.map(message => )) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ apel a metodei `hartă`. Metoda nu poate fi apelată pe o valoare posibilă nulă ( messages.map(message => )) ^^^^^^^^ null ( messages.map(message => )) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ apel a metodei `hartă`. Metoda nu poate fi apelată pe o valoare posibil nedefinită ( messages.map(message => )) ^^^^^^^^ nedefinit
Stai puțin, amice!

Deoarece am definit mesajele să fie de tip poate , le permitem să fie nul sau nedefinit . Dar acest lucru nu ne dă dreptul de a efectua operații asupra acestuia (cum ar fi .length sau .map) fără să verificăm nul, deoarece dacă valoarea mesajelor este de fapt nulă sau nedefinită, atunci va apărea o eroare de tip atunci când vom încerca să operăm. aceasta.

Deci, să revenim și să ne actualizăm funcția de vizualizare la ceva de genul acesta:

Const MyComponent = (( mesaje, isFetching ): AppState) => ( if (isFetching) ( return ) else if (mesaje === null || mesaje === nedefinit) ( return

Nu s-au încărcat mesajele. Încearcă din nou.
) altfel ( întoarcere (

Aveți ( mesaje.lungime ) mesaje necitite

( messages.map(message => )}
); } };
Flow știe acum că am luat în considerare toate situațiile în care mesajele sunt nule sau nedefinite, astfel încât verificarea tipului de cod eșuează cu 0 erori. Adio erori de rulare!

Beneficiul #7: Reduceți numărul de teste unitare

Am văzut înainte cum tipurile statice pot ajuta la eliminarea analizei erorilor confuze, deoarece garantează tipurile de parametri transmise unei funcții și returnează valori. În consecință, tipurile statice reduc și numărul de teste unitare.

De exemplu, să revenim la funcția calculateAreas cu tipuri dinamice și gestionarea erorilor.

Const calculateAreas = (radii) => ( // Gestionează intrările nedefinite sau nule dacă (!radii) ( throw new Error("Argument lipsește"); ) // Gestionează intrările non-matrice dacă (!Array.isArray(radii) ) ( throw new Error("Argumentul trebuie să fie o matrice"); ) var zone = ; for (var i = 0; i< radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; };
Dacă am fi programatori sârguincioși, am putea lua în considerare testarea parametrilor trecuți nevalidi pentru a verifica dacă aceștia sunt gestionați corect de programul nostru:

It("nu ar trebui să funcționeze - cazul 1", () => ( aștept(() => calculateAreas()).to.throw(Eroare); )); it("nu ar trebui să funcționeze - cazul 2", () => ( așteptați(() => calculateAreas(undefined).to.throw(Eroare); )); it("nu ar trebui să funcționeze - cazul 2", () => ( așteaptă(() => calculateAreas(„bună ziua”)).to.throw(Eroare); ));
… și așa mai departe. Dar este foarte probabil să uităm să testăm niște cazuri de margine – iar clientul nostru va fi cel care va descoperi problema. :(

Deoarece testele se bazează exclusiv pe situațiile pe care am venit să le testam, ele sunt existențiale și, în practică, sunt ușor de ocolit.

Pe de altă parte, când trebuie să setăm tipuri:

Const calculateAreas = (razele: Matrice ): Matrice => ( var zone = ; pentru (var i = 0; i< radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
... nu numai că obținem o garanție că scopul nostru corespunde realității, dar astfel de teste sunt pur și simplu mai fiabile. Spre deosebire de testele cu reguli de bază, tipurile sunt universale și mai greu de învins.

Dacă îl priviți în ansamblu, imaginea este următoarea: testele sunt bune pentru verificarea logicii, iar tipurile sunt bune pentru verificarea tipurilor de date. Când sunt combinate, suma pieselor produce un efect și mai mare.

Beneficiul #8: Instrumentul de modelare a domeniului

Unul dintre exemplele mele preferate de utilizare a tipurilor statice este modelarea domeniului. În acest caz, se creează un model care include atât datele, cât și comportamentul programului pe baza acestor date. ÎN în acest caz, Cel mai bine este să înțelegeți cu un exemplu cum să folosiți tipurile.

Să presupunem că aplicația oferă utilizatorului una sau mai multe metode de plată pentru a face achiziții pe platformă. Utilizatorului i se permite să aleagă dintre trei metode de plată (Paypal, Card de credit, Cont bancar).

Deci, mai întâi vom aplica aliasuri de tip pentru trei metode de plată:

Tastați Paypal = ( id: număr, tip: „Paypal” ); tip CreditCard = ( id: număr, tip: „CreditCard” ); tip Bank = ( id: număr, tip: „Bank” );
Acum puteți seta tipul PaymentMethod să fie un set disjunc cu trei cazuri:

Tip PaymentMethod = Paypal | Card de credit | Bancă;
Acum să creăm un model de stare pentru aplicația noastră. Pentru a menține lucrurile simple, să presupunem că aceste aplicații constau doar din metode de plată disponibile utilizatorului.

Tip Model = ( paymentMethods: Array };
Este acceptabil? Ei bine, știm că pentru a obține metodele de plată ale utilizatorului, trebuie să faceți o solicitare către API și, în funcție de rezultatul și stadiul procesului, aplicația poate accepta diferite state. În realitate, sunt posibile patru stări:

1) Nu am primit metode de plată.
2) Suntem în proces de obținere a metodelor de plată.
3) Am primit cu succes metode de plată.
4) Am încercat să obținem metode de plată, dar a apărut o eroare.

Dar tipul nostru simplu de model cu metode de plată nu acoperă toate aceste cazuri. În schimb, presupune că metodele de plată există întotdeauna.

Hmmmm. Există o modalitate de a construi un model astfel încât starea aplicației să ia una dintre aceste patru valori și numai ele? Să aruncăm o privire:

Tastați AppState = (tip: „NotFetched” ) | ( tip: „Preluare”) | ( tip: „Eșec”, eroare: E) | ( tip: „Succes”, Metode de plată: Matrice };
Am folosit tipul de set disjunct pentru a seta AppState la una dintre cele patru stări descrise mai sus. Observați cum folosesc proprietatea type pentru a determina în care dintre cele patru stări se află aplicația. Această proprietate de tip este cea care creează un set disjuns. Folosind-o putem analiza și stabili când avem metode de plată și când nu.

Veți observa, de asemenea, că trec tipul parametrizat E și D în starea aplicației. Tipul D va reprezenta metoda de plată a utilizatorului (Metoda de plată definită mai sus). Nu am setat tipul E să fie tipul nostru de eroare, așa că hai să facem asta acum:

Tastați HttpError = ( id: șir, mesaj: șir);
Acum puteți modela domeniul aplicației:

Tip Model = AppState ;
În general, semnătura pentru starea aplicației este acum AppState unde E are forma HttpError și D este PaymentMethod. Și AppState are patru (și doar aceste patru) stări posibile: NotFetched, Fetching, Failure și Success.

Găsesc astfel de modele de domenii utile pentru a gândi și a proiecta interfețe de utilizator conform anumitor reguli de afaceri. Regulile de afaceri ne spun că o aplicație poate fi doar într-una dintre aceste stări, iar acest lucru ne permite să expunem în mod explicit un AppState și să ne asigurăm că va fi doar într-una dintre aceste stări predefinite. Și când dezvoltăm conform acestui model (de exemplu, creând o componentă de vizualizare), devine absolut evident că trebuie să ne ocupăm de toate cele patru stări posibile.

În plus, codul se documentează în sine - doar uitați-vă la seturile disjunse și devine imediat clar cum este structurat AppState.

Dezavantajele utilizării tipurilor statice

Ca orice altceva în viață și programare, verificarea tipului static necesită unele compromisuri.

Este important să înțelegem și să recunoaștem aceste deficiențe, astfel încât să putem lua o decizie în cunoștință de cauză atunci când are sens să folosim tipuri statice și când pur și simplu nu merită.

Iată câteva dintre aceste considerații:

Dezavantajul #1: Tipurile statice necesită învățare prealabilă

Unul dintre motivele pentru care JavaScript este un limbaj atât de fantastic pentru începători este că începătorii nu trebuie să învețe sistemul complet de tipări înainte de a deveni productivi.

Când am învățat pentru prima dată Elm (un limbaj funcțional tipizat static), tipurile au fost adesea în cale. Am continuat să întâlnesc erori de compilator din cauza definițiilor mele de tip.

A învăța să folosească tipurile în mod eficient a fost jumătate din bătălie în învățarea limbii în sine. Drept urmare, curba de învățare a lui Elm este mai abruptă decât cea a JavaScript din cauza tipurilor sale statice.

Acest lucru este important în special pentru începători, care au cea mai mare sarcină cognitivă din sintaxa de învățare. Adăugarea de sintaxă la acest mix poate fi copleșitoare pentru un începător.

Dezavantajul #2: Poate fi blocat în verbozitate

Tipurile statice fac adesea ca programele să pară mai detaliate și mai aglomerate.

De exemplu, în schimb:

Funcția asincronă amountExceedsPurchaseLimit(amount, getPurchaseLimit)( var limit = await getPurchaseLimit(); return limit > amount; )
Trebuie sa scriem:

Funcția asincronă amountExceedsPurchaseLimit(amount: number, getPurchaseLimit: () => Promis ): Promisiune ( var limit = await getPurchaseLimit(); return limit > amount; )
Și în schimb:

Var user = ( id: 123456, nume: "Preethi", oraș: "San Francisco", );
Trebuie sa scrii asta:

Tip User = ( id: număr, nume: șir, oraș: șir, ); var user: User = ( id: 123456, nume: "Preethi", oraș: "San Francisco", );
Evident, sunt adăugate linii suplimentare de cod. Dar există câteva argumente împotriva considerării acestui dezavantaj.

În primul rând, așa cum am menționat mai devreme, tipurile statice distrug o întreagă categorie de teste. Unii dezvoltatori pot considera acest lucru un compromis perfect rezonabil.

În al doilea rând, așa cum am văzut mai devreme, tipurile statice pot elimina uneori nevoia unei gestionări complexe a erorilor, iar acest lucru, la rândul său, reduce foarte mult aglomerația de coduri.

Este greu de spus dacă verbozitatea este un argument real împotriva tipurilor, dar merită reținut.

Dezavantajul #3: Este nevoie de timp pentru a deveni priceput în utilizarea tipurilor.

Este nevoie de mult timp și practică pentru a învăța cum să selectezi cel mai bine tipurile dintr-un program. Mai mult, dezvoltarea unui bun simț a ceea ce merită urmărit static și a ceea ce este mai bine lăsat dinamic necesită, de asemenea, o abordare atentă, practică și experiență.

De exemplu, o abordare este de a codifica logica de afaceri critică cu tipuri statice, dar lăsați piese de logică de scurtă durată sau neimportante pentru a evita complexitatea inutilă.

Cunoașterea diferenței poate fi dificilă, mai ales dacă un dezvoltator mai puțin experimentat trebuie să ia decizii din mers.

Dezavantajul #4: Tipurile statice pot întârzia dezvoltarea rapidă

După cum am menționat mai devreme, m-am împiedicat puțin cu tipurile în timp ce învățam Elm - mai ales când adăugam cod sau facem modificări. Fiind distras în mod constant de erorile compilatorului, este dificil să terminați munca și să simțiți progresul.

Argumentul aici este că verificarea tipului static poate face ca un programator să-și piardă concentrarea prea des - și știi, concentrarea este factorul cheie pentru a scrie un program bun.

Nu este doar atât. De asemenea, controlerele de tip static nu sunt întotdeauna ideale. Uneori apare o situație când știi ce să faci, dar verificarea tipului te împiedică și te împiedică.

Sunt sigur că am omis alte defecte, dar acestea sunt cele mai importante pentru mine.

Ar trebui să folosesc sau nu tipuri statice în JavaScript?


Primele limbaje de programare pe care le-am învățat au fost JavaScript și Python, ambele limbaje tipizate dinamic.

Dar stăpânirea tipurilor statice a adăugat o nouă dimensiune modului în care mă gândesc la programare. De exemplu, deși la început mi s-au părut copleșitoare mesajele constante de eroare ale compilatorului lui Elm, descoperirea tipurilor și plăcerea compilatorului a devenit o a doua natură și mi-a îmbunătățit efectiv abilitățile de programare. În plus, nu există nimic mai eliberator decât un robot inteligent care să-mi spună ce greșesc și cum să o repar.

Da, există compromisuri inevitabile cu tipurile statice, cum ar fi faptul de a fi prea pronunțat și de a petrece timp învățându-le. Dar tipurile adaugă securitate și corectitudine programelor, ceea ce elimină semnificația acestor „dezavantaje” pentru mine personal.

Tipurile dinamice par mai rapide și mai simple, dar pot eșua atunci când puneți efectiv programul în acțiune. În același timp, poți vorbi cu orice dezvoltator Java care se ocupă de tipuri mai complexe parametrizate și îți vor spune cât de mult îi urăsc.

În cele din urmă, aici nu există o soluție unică. Personal, prefer să folosesc tipuri statice în următoarele condiții:

  1. Programul este esențial pentru afacerea dvs.
  2. Programul va fi probabil refactorizat pentru a se potrivi noilor nevoi.
  3. Programul este complex și are multe părți mobile.
  4. Programul este susținut de o echipă mare de dezvoltatori care trebuie să înțeleagă codul rapid și precis.
Pe de altă parte, aș refuza tipurile statice în următoarele condiții:
  1. Codul este de scurtă durată și nu este critic pentru misiune.
  2. Faci un prototip și încerci să avansezi cât mai repede posibil.
  3. Programul este mic și/sau simplu.
  4. Sunteți singurul dezvoltator.
Frumusețea dezvoltării JavaScript în zilele noastre este că, datorită instrumentelor precum Flow și TypeScript, avem în sfârșit posibilitatea de a alege să folosim tipuri statice sau JavaScript vechi.

Concluzie

Sper că aceste articole te-au ajutat să înțelegi importanța tipurilor, cum să le folosești și cel mai important... *Când* utilizati-le.

Capacitatea de a comuta între tipurile dinamice și statice este un instrument puternic pentru comunitatea JavaScript și unul interesant :)

24.11.14 15.6K

Programarea nu este doar o modalitate de a câștiga bani mari și nici măcar nu este o muncă în întregime mentală. Aceasta este o oportunitate de a înțelege în ce constă lumea din jurul nostru, de a o descompune în particule mici și apoi de a o reasambla, ghidați de propria noastră logică și cunoștințe.

Limbajele de programare sunt doar un instrument cu care o persoană construiește reguli în sistemele create.

Internetul prezintă o mulțime de oportunități pe care mințile strălucitoare și întreprinzătoare le profită. Desigur, dezvoltarea web are și propriile instrumente pentru a da viață ideilor. Unul dintre ele este limbajul de programare JavaScript, care va fi discutat în acest articol:

Informații generale

Mulți oameni, chiar și cei care nu au nimic de-a face cu domeniul IT, au auzit cuvântul Java. Un limbaj revoluționar, independent de platformă, în care aplicațiile pentru sistemele mobile sunt scrise în mod activ. A fost dezvoltat de compania promițătoare Sun, care a intrat apoi sub aripa Oracle. Dar nicio companie nu are nimic de-a face cu JavaScript:

Tot ceea ce i s-a cerut de la Sun era permisiunea de a folosi o parte a numelui. În mod surprinzător, JavaScript nu este deținut de nicio companie.

Când scrieți aplicații web, programarea JavaScript este folosită cel mai des. Dacă enumeram pe scurt caracteristicile cheie ale acestui limbaj, ar trebui să evidențiem următoarele:

  • Orientarea obiectelor. Execuția programului reprezintă interacțiunea obiectelor;
  • Conversia tipului de date se realizează automat;
  • Funcțiile acționează ca obiecte clasa de bază. Această caracteristică face JavaScript similar cu multe limbaje de programare funcționale, cum ar fi Lisp și Haskell;
  • Ștergerea automată a memoriei. Așa-numita colectare de gunoi face JavaScript similar cu C# sau Java.

Dacă vorbim despre esența utilizării JavaScript, atunci acest limbaj vă permite să „reînvie” paginile site-ului web nemișcate folosind cod care poate fi executat ( așa-numitele scripturi). Adică putem face o analogie cu desenele animate, unde html și css sunt personajele desenate, iar JavaScript este ceea ce le face să se miște.

Dacă vorbesc despre Sintaxa JavaScript, atunci are următoarele caracteristici:

  • Înregistrarea este importantă. Funcțiile numite func() și Func() sunt complet diferite;
  • Operatorii trebuie să fie urmați de punct și virgulă;
  • Obiecte și operații încorporate;
  • Spațiile nu sunt numărate. Puteți folosi câte indentări doriți, precum și întreruperi de linie, pentru a vă formata codul.

Cel mai simplu cod JavaScript arată astfel:

Scopul aplicatiei

Pentru a înțelege de ce este nevoie de JavaScript și cât de necesar este să-l înveți, ar trebui să evidențiem câteva domenii în care este folosit limba dată programare.

  • Dezvoltare de aplicatii web. Doriți să instalați un contor simplu, să organizați transferul de date între formulare sau să plasați un joc pe site-ul dvs.? Apoi JavaScript va prelua asistent fidelîn acest caz;
  • „Participarea activă” în AJAX. Această tehnologie a făcut posibilă accelerarea semnificativă a funcționării aplicațiilor prin schimbul de date cu serverul în modul „în fundal”:

  • OS. Este posibil ca unii oameni să nu fi știut, dar Windows, Linux și Mac au propriii lor concurenți în browser, dintre care partea leului este scrisă în JavaScript;
  • Aplicatii mobile;
  • Domeniu de studiu. Orice specialitate de programare la o universitate include într-o măsură sau alta studiul JavaScript. Acest lucru se datorează faptului că limbajul a fost dezvoltat inițial pentru programatori nu foarte puternici. Lecțiile JavaScript sunt țesute logic în cursul HTML de bază, așa că învățarea este destul de simplă.

Avantaje și dezavantaje

Nu credeți că JavaScript este un fel de panaceu pentru toate problemele și fiecare programator folosește acest limbaj cu zâmbetul pe buze. Totul în lume are pozitivul său și laturile negative. În primul rând, să remarcăm deficiențele.

  • Necesitatea de a oferi compatibilitate între browsere. Deoarece JavaScript acționează ca o tehnologie de internet, trebuie să suportați regulile pe care le stabilește World Wide Web. Codul trebuie să ruleze corect în toate, sau cel puțin în cele mai populare, browsere;
  • Sistemul de moștenire într-o limbă face dificilă înțelegerea a ceea ce se întâmplă. JavaScript implementează moștenirea bazată pe prototip. Oamenii care au studiat alte limbaje de programare orientate pe obiecte sunt obișnuiți cu familiarul " clasa descendentă moşteneşte clasa de părinți " Dar în JavaScript, astfel de lucruri sunt gestionate direct de obiecte, iar acest lucru este dincolo de înțelegerea ta;
  • Nu există o bibliotecă standard. JavaScript nu oferă nicio posibilitate de lucru cu fișiere, fluxuri I/O sau alte lucruri utile;
  • Sintaxa în general face dificil de înțeles. Frumusețea codului nu este în mod clar punctul forte al JavaScript, dar se respectă regula principală a programatorilor: „ Lucrări? Nu atinge!».

Acum merită remarcat câteva avantaje

  • JavaScript oferă un numar mare de oportunități de a rezolva o mare varietate de probleme. Flexibilitatea limbajului permite utilizarea multor modele de programare în raport cu condițiile specifice. Mintea inventiva va avea o adevarata placere;
  • Popularitatea JavaScript deschide un număr considerabil de biblioteci gata făcute pentru programator, care pot simplifica semnificativ scrierea codului și pot nivela imperfecțiunile de sintaxă;
  • Aplicare în multe domenii. Lat Capabilitati JavaScript oferiți programatorilor șansa de a se încerca ca dezvoltatori ai unei game largi de aplicații, iar acest lucru, desigur, alimentează interesul pentru activitățile profesionale.

Nu ar trebui să acordați atenție faptului că au existat mai multe minusuri decât plusuri. JavaScript este ferm înrădăcinat în nișa sa și nicio critică nu îl va scoate de acolo în acest moment.

Pentru cei care vor să studieze

Complex și un drum lung pentru cei care decid să studieze temeinic JavaScript. Pentru începători, există recomandări de bază, în urma cărora îți poți simplifica semnificativ învățarea.

  • În primul rând, HTML. Nu poți începe să faci nimic pentru internet fără elementele de bază. Foile de stil în cascadă (CSS) vor fi, de asemenea, foarte utile;
  • Folosiți literatură nouă. Programarea nu este fizică, ale cărei legi sunt inviolabile, iar manualele noi sunt cele vechi. Tehnologiile IT sunt în continuă evoluție, iar actualizările utile nu trebuie neglijate;
  • Încercați să scrieți singur toate secțiunile programului. Dacă ceva nu funcționează deloc, puteți împrumuta codul altcuiva, dar numai după ce mai întâi înțelegeți fiecare linie pentru dvs.;
  • Depanarea este cel mai bun prieten al tău. Găsirea rapidă a erorilor este una dintre cele cele mai importante momenteîn programare;
  • Nu ignora regulile de formatare. Desigur, codul nu se va îmbunătăți sau mai rău de la cantități diferite indentări și spații, dar ușurința de citire și înțelegere de către programator este, de asemenea, un punct important. Codul de mai jos? foarte greu de perceput, mai ales dacă nu ești el

  • Numele de variabile trebuie să aibă sens lexical. În procesul de scriere a programelor simple, acest lucru nu pare deloc important, dar când numărul de linii de cod depășește o mie, toți diavolii își rup picioarele;

dezvoltare web

Vue.JS: caracteristici, avantaje și dezavantaje

Vue.JS este numele acestui framework front-end pe care îl auzim din ce în ce mai des. Pentru a spune pompos, el este acum în vârful popularității sale. Acest fapt nu a putut scăpa echipei noastre de front-end. Am decis să înțelegem cu atenție de ce a apărut Vue.JS și ce probleme rezolvă.

Introducere

Implementarea interfeței de utilizare web se confruntă cu provocări din ce în ce mai complexe, care necesită utilizarea unor instrumente din ce în ce mai sofisticate. Să adăugăm aici tendința de îndepărtare de arhitectura aplicației MVC și obținem o tendință destul de interesantă. Dezvoltatorii moderni tind să folosească biblioteci separate pentru fiecare strat de sarcini. Pe fondul acestor modificări, a apărut framework-ul Vue.JS și a început să câștige popularitate.

Pur teoretic, este o alternativă la jQuery. Dar, în realitate, Vue.JS concurează cu destul de mult succes cu React.JS, liderul evident în spațiul View. Printre tehnologiile populare moderne care rezolvă probleme similare, putem evidenția și Angular și Ember. Fiecare dintre ele are propriile sale avantaje și dezavantaje. Cu toate acestea, toate aceste cadre pot fi aduse la un numitor comun - complexitatea relativă a dezvoltării.

Caracteristicile Vue.JS

Vue.JS a fost creat cu un ochi pe cele mai bune practici ale tehnologiilor enumerate. Echipa Vue a împrumutat ideea unui DOM virtual de la React.JS. Această abordare elimină interacțiunea directă cu nodurile de interfață. Lucrarea inițială este efectuată cu o copie ușoară (DOM virtual). Și numai după ce această modificare este aplicată nodurilor interfeței reale. În același timp, are loc o comparație între arborele DOM real și copia sa virtuală. Astfel, se identifică diferența și se redesenează doar ceea ce s-a schimbat.

Am împrumutat legare de date bidirecțională de la Angular Vue.JS. Acest lucru vă permite să proiectați interfețe: în primul rând, declarativ; în al doilea rând, folosind Vue în motoarele de șabloane. Cum ar fi Haml sau Pug. Cu toate acestea, observăm că această abordare a fost practicată înainte. De exemplu, în cadrul Knockout.JS.

Nucleul Vue.JS, precum React, conține doar funcționalitatea necesară pentru a lucra cu interfața. Prin urmare, este compact, ușor de integrat cu alte tehnologii, inclusiv jQuery, și poate fi folosit chiar în schimb (pentru dezvoltarea interfețelor simple).

În plus, Vue are disponibile o serie de plugin-uri care implementează o abordare modernă a dezvoltării de aplicații web. Despre ce vorbim? De exemplu, aproape toate aplicațiile React sunt proiectate în tandem cu tehnologia de control al stării Redux, care este o bibliotecă separată și implementează arhitectura flux. Abordarea adoptată de biblioteca Redux s-a dovedit a fi destul de convenabilă și de succes. Prin urmare, Vue.JS a dezvoltat propria tehnologie pentru monitorizarea stării aplicației - Vuex. Vuex împrumută complet idei de la Redux, dar gradul de integrare a acestei biblioteci cu Vue este mult mai mare decât în ​​cazul React și Redux. Și asta se traduce în viteză și comoditate.

Nu trebuie să uităm că succesul unei tehnologii depinde direct de activitatea utilizatorilor ei. Adică comunitatea de dezvoltatori. Deci React, fiind poate cea mai populară tehnologie, are un număr mare de extensii la funcționalitatea principală. Sunt create de membrii comunității, iar dezvoltatorii React au un set de instrumente pentru fiecare ocazie. Vue.JS nu merge atât de bine în acest sens. Cel putin pentru moment. Cu toate acestea, această tehnologie câștigă amploare și are deja multe biblioteci utile care rezolvă majoritatea problemelor stringente ale dezvoltatorilor.

Experiență de utilizare pe un proiect real

Ne-am confruntat cu sarcina de a dezvolta o interfață care să conțină o hartă, filtre, rezultate de filtrare și o serie de elemente de interacțiune pe o singură pagină. Eram conștienți de faptul că utilizarea simplă a JavaScript Vanilla sau jQuery poate duce la dificultăți de dezvoltare. De ce nu React.js? Pentru că Vue.JS este mai simplu și mai ușor. De ce să vă deranjați cu un cadru mai greu pentru a dezvolta o singură interfață?

Ne uităm îndeaproape la Vue.JS de mult timp și ne-am dat seama că avantajele sale ne pot oferi un profit real. Ca urmare, a fost luată o decizie fundamentală de a „testa” această tehnologie în practică.

Iată un mic exemplu de inițializare a unei aplicații Vue.

În app.js, variabila aplicație este creată ca obiect Vue. Constructorul parcurge șablonul template.haml și face legăturile necesare.

Declarativitatea în Vue este atât de ușoară încât ne-a permis să o integrăm într-o aplicație web monolitică folosind motorul de șabloane Haml.

Aici, în funcție de veridicitatea indicatorului „filtersOpen”, clasa „rentbuy__filters—open” este adăugată sau eliminată elementului

Vue.JS pe lângă implementează totul abordări moderneîn dezvoltarea interfeței de utilizare web, este un cadru incredibil de ușor de învățat, flexibil și foarte integrat cu tehnologii terțe. Șablonul lui Vue ne-a oferit posibilitatea de a asocia elementele câmpului de filtrare cu câmpurile unui singur obiect. Acest lucru a făcut posibil să aveți întotdeauna opțiuni de selecție actualizate la îndemână și a făcut mai ușoară validarea și curățarea filtrului.

Aici, valorile câmpurilor de intrare sunt legate de câmpurile obiectului „date” folosind legarea în două sensuri. Acest lucru face ca câmpul obiect să se schimbe atunci când valoarea din câmpul de intrare se modifică și invers.

Datorită reactivității Vue.JS, am scăpat de duplicarea codului. Cum sa întâmplat asta? Într-un număr de cazuri, setul de câmpuri de filtrare a coincis parțial (în funcție de starea aplicației). Există o amenințare reală de duplicare masivă a codului. Cu toate acestea, folosind predicate simple definite în șablon, puteți comuta rapid și convenabil între seturi de câmpuri.

Aici blocul cu câmpul de introducere este vizibil pe pagină când condiția este îndeplinită

De asemenea, datorită flexibilității Vue.JS, am putut profita de dezvoltarea bazată pe componente în elementele listei de rezultate de filtrare. După cum vă amintiți, cadrul nostru folosește tehnologia DOM virtuală. În consecință, odată cu sosirea de noi rezultate, componentele actuale pur și simplu nu sunt redesenate. Ceea ce se traduce în viteză și confort pentru utilizatori.

Elementele din matricea „proprietăți” sunt redate ca „propunere” a componentei Vue. Setul de elemente de pe pagină se modifică automat în funcție de modificările din matrice. Componenta „propunere” este obișnuită șablon HTML, al cărui cod este inclus într-o etichetă de script cu tipul „text/x-template”

De asemenea, rețineți că Vue urmărește ciclu de viață componente. Adică, le puteți aplica orice metode (modificare, ștergere etc.) după inițializare și atașare la arborele DOM. În special, putem inițializa cu ușurință aplicația atunci când pagina se încarcă în browser. De exemplu, solicitați o selecție inițială de elemente, în funcție de dimensiunea actuală a hărții de pe pagina utilizatorului.

Arhitectura aplicației Vue oferă o separare simplă și clară a metodelor, componentelor și datelor. Codul devine mult mai lizibil, ușor de extensibil și vă permite să integrați tehnologii terțe direct în metodele de aplicare Vue. Ca rezultat, dezvoltarea interfeței a durat relativ puțin. Codul s-a dovedit a fi compact și ușor de extensibil. Iar flexibilitatea Vue.JS a contribuit la combinarea sa cu alte tehnologii.

Beneficiile Vue.JS

După ce am studiat caracteristicile cheie ale tehnologiei și le-am testat în practică, putem enumera principalele avantaje ale cadrului Vue:

  • Biblioteca este destul de simplă și funcțională. Pentru a-l înțelege, aveți nevoie de o cantitate minimă de cunoștințe.
  • Nu există cerințe de stivă, așa că Vue.JS poate fi folosit pe orice proiect.
  • Cadrul cântărește destul de mult. Economisim timp de încărcare a paginii și obținem o mulțime de beneficii: plus la conversie, plus la UX, plus la clasarea căutării etc.
  • Viteză de dezvoltare destul de rapidă. Datorită utilizării oricăror șabloane și disponibilității documentației, majoritatea problemelor care apar sunt rezolvate destul de rapid. Inclusiv în comparație cu React, deoarece în majoritatea aplicațiilor care nu au interfețe complexe, toată puterea acestui framework este puțin redundantă.
  • Abilitatea de a găsi și conecta la proiect aproape orice dezvoltator care este cel puțin puțin familiarizat cu dezvoltarea front-end. Bariera scăzută la intrare permite atât dezvoltatorilor front-end, cât și back-end să lucreze cu cadrul.

Vue vă permite să creați aplicatii functionale, potrivindu-se cu toate standarde moderne, cu conexiune minimă de noi resurse și, de fapt, mai ieftine.

Dezavantajele Vue.JS

Există și dezavantaje. În special în comparație cu React.JS.

  • Lucrul la starea de aplicare are loc „sub capotă”. ÎN proiecte de anvergură acest lucru poate duce la ca funcționarea componentelor să nu fie evidentă, ceea ce creează adesea probleme cu depanarea și dezvoltarea eficientă.
  • Abordarea componentelor din Vue.JS nu este la fel de flexibilă și evidentă ca în React.
  • Sistemul de randare React este mai funcțional. Oferă mai multe opțiuni de depanare.
  • Șablonul React este mult mai flexibil (JS vs DSL).

Concluzie

Vue.JS implementează toate abordările moderne ale dezvoltării UI web și este un cadru ușor de învățat, flexibil și foarte integrat cu tehnologii terțe. Desigur, în ceea ce privește crearea de interfețe complexe (de exemplu, pentru site-urile web corporative), React este superior. Dar pentru rezolvarea unor probleme relativ simple, utilizarea Vue pare nu doar justificată, ci și de preferat.

Am pregătit articolul

Departamentul Dezvoltare Web

Dezvoltare profesională de site-uri web și aplicații pe partea de server și client. Design, aspectul paginii și întreținere proiecte finalizate.