[JS] Veel objecten, autoloading?, best-practice?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • SvMp
  • Registratie: September 2000
  • Niet online
Ik ben een back-office systeem in Javascript aan het schrijven. Gegevensuitwisseling met database verloopt via Ajax en PHP.

Voor elk user-interface onderdeel heb ik een class, bijvoorbeeld invoervelden, selecties, maar ook geavanceerdere dingen zoals een datum-picker en een interface om afbeeldingen te linken aan content. Elke ui heeft ook weer ui-objecten in zich, zo bestaat de ui om users toe te voegen uit een flinke verzameling invoervelden.

Het werkt allemaal prima.

Maar.. het aantal objecten wordt wel groot. Ik laad nu alle Javascript-files in via de html. Dat is voor de definitieve site niet wenselijk (veel te veel requests naar server) maar tijdens development wel gemakkelijk.

Ik moet een keuze maken voor als ik 'live' ga:
- Alle Javascript-bestanden in één groot bestand plaatsen
- Kleinere Javascript-bestanden handhaven, maar dan alleen laden als ze nodig zijn

Ik neig naar alles in één groot bestand, maar vreet dat geen geheugen. Ik heb namelik het idee dat klassen definiëren ook veel geheugen kost.

Bijvoorbeeld:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// UI abstract class

ui = function() { }

ui.prototype.set_error = function(msg) {
 // code
}

ui.prototype.destroy = function() {
 // code
}


// UI-class voor invoerveld

ui_invoerveld = function(jqo, params) {
    // constructor code
}

ui_invoerveld.prototype = new ui();

ui_invoerveld.prototype.select_all = function() {
 // code
}

ui_invoerveld.prototype.val = function(nieuw) {
 // code
}


// UI-class voor selectie

ui_selectie = function(jqo, params) {
    // constructor code
}

ui_selectie.prototype = new ui();

ui_selectie.prototype.optie_toevoegen = function(waarde, tekst) {
 // code
}


Code is fictief puur om te laten zien wat mijn overweging is.
Ik wil abstract klassen gebruiken. Dat gebeurt in Javascript met prototype. Om een prototype te geven moet ik van een abstract klasse bij overerving iedere keer een object maken om te voorkomen dat (in dit voorbeeld) de ui_invoerveld en ui_selectie elkaars methoden krijgen.

Stel ik heb een stuk of 30 ui-classes, wordt het geheugengebruik dan niet groot? Zelfs als ik geen objecten maak (een dialoog gebruikt maar een klein deel van de beschikbare ui-componenten), nemen de klassen al geheugen omdat bij de definitie van de overerving objecten worden gemaakt.

Als ik er voor zorg dat klassen van ui's alleen worden geladen als ze nodig zijn, dan is dat bezwaar weg, maar dan krijg je wel veel requests naar de server.

Wat is in dit geval de beste optie?

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
SvMp schreef op zaterdag 16 maart 2013 @ 16:44:
Wat is in dit geval de beste optie?
Het Aysnchronous Module Definition (AMD) patroon is wat je zoekt.
Kijk eens naar RequireJS.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

SvMp schreef op zaterdag 16 maart 2013 @ 16:44:
Ik neig naar alles in één groot bestand, maar vreet dat geen geheugen. Ik heb namelik het idee dat klassen definiëren ook veel geheugen kost.
Meten is weten. Zit je nou niet moeilijk te doen voordat je weet of het nodig is? Ik zou eens beginnen met het maken van een pagina waarop je twee keer zo veel als gemiddeld aan UI-elementen aanmaakt, gebruik makend van dat grote JS-bestand. Kijk even wat dat doet met je geheugengebruik en als dat niet acceptabel is kun je dan altijd nog exotische dingen gaan doen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NiteSpeed
  • Registratie: Juli 2003
  • Laatst online: 11-07 22:52
Duidelijk een gevalletje AMD dit. Niet alleen houd je rekening met load/bandwidth, je maakt het ook makkelijk voor jezelf om het overzicht te bewaren door allemaal losse JS files te hanteren.

Acties:
  • 0 Henk 'm!

  • curvemod
  • Registratie: Maart 2009
  • Laatst online: 16-07 07:44
AMD lijkt me in dit geval een mooie oplossing, waarschijnlijk wordt je code daar ook een stukje overzichtelijker van tov. één groot bestand. Als je echt exotisch wilt zou je voor de aardigheid eens naar 'Architect' van Cloud9 kunnen kijken, naar de manier waarop daarin dependencies gebruikt worden.

Acties:
  • 0 Henk 'm!

  • pingwings
  • Registratie: Mei 2009
  • Laatst online: 01-06 00:15
Je zou eventueel ook een buildtool kunnen gebruiken (bijvoorbeeld http://gruntjs.com/), waarmee je de bestanden samenvoegd en minified.

Het inladen via een AMD achtige oplossing maakt het aantal requests naar de server niet minder, maar verdeeld het alleen. Een AMD-oplossing is alleen efficienter als je de meeste resources maar in sommige edge-cases inlaadt.

Wat ik meestal doe is een map maken (logic.js oid) met daarin verschillende files, zodat je de logica alsnog kan verdelen in logische stukken.

[ Voor 16% gewijzigd door pingwings op 20-03-2013 22:01 ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
pingwings schreef op woensdag 20 maart 2013 @ 22:00:
Het inladen via een AMD achtige oplossing maakt het aantal requests naar de server niet minder, maar verdeeld het alleen. Een AMD-oplossing is alleen efficienter als je de meeste resources maar in sommige edge-cases inlaadt.
*kuch*

Acties:
  • 0 Henk 'm!

Anoniem: 2935

NMe schreef op zaterdag 16 maart 2013 @ 20:25:
Meten is weten. Zit je nou niet moeilijk te doen voordat je weet of het nodig is? Ik zou eens beginnen met het maken van een pagina waarop je twee keer zo veel als gemiddeld aan UI-elementen aanmaakt, gebruik makend van dat grote JS-bestand. Kijk even wat dat doet met je geheugengebruik en als dat niet acceptabel is kun je dan altijd nog exotische dingen gaan doen.
Ik vond dat dit nog wel herhaald mocht worden.
Pagina: 1