You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Il nous permet de ne pas pourrir notre scope globale. En Javascript un scope est défini au niveau des fonctions. Pour éviter que nos variables arrivent dans le scope globale, il suffit de wrapper notre code autour d'une fonction et de l'exécuter tout de suite après.
19
19
20
20
{% highlight javascript %}
21
-
(function(){
22
-
var private = 'I am private, the global scope is free of me !';
23
-
24
-
function iAmPrivateToo(){
25
-
return 'This function is private and will not be avalaible via the global scope !'
26
-
}
27
-
})()
21
+
(function(){
22
+
var private = 'I am private, the global scope is free of me !';
23
+
24
+
function iAmPrivateToo(){
25
+
return 'This function is private and will not be avalaible via the global scope !'
26
+
}
27
+
})()
28
28
{% endhighlight %}
29
29
30
30
Object Litteral Pattern
@@ -35,33 +35,33 @@ Maintenant que nous savons isoler notre code, nous devons le découper pour évi
35
35
A partir du moment où l'on découpe notre code, nous allons avoir besoin d'exporter des fonctions et des attributs publiquement dans une variable globale (ça va une seule, on ne crie pas au scandale tout de suite).
36
36
37
37
{% highlight javascript %}
38
-
// script1.js
39
-
(function(){
40
-
var myApp = window.myApp = window.myApp || {};
41
-
42
-
var aPublicVariable = 'I am public, yeahhh';
43
-
44
-
function aPublicFunction(){
45
-
return 'This function will be public';
46
-
}
47
-
48
-
var aPrivateVariable = 'I am private, Yeahh !!!';
49
-
50
-
function aPrivateFunction(){
51
-
return 'I will never export this function';
52
-
}
53
-
54
-
// exports public functions and variables
55
-
myApp.aPublicVariable = aPublicVariable;
56
-
myApp.aPublicFunction = aPublicFunction;
57
-
})();
58
-
59
-
// script2.js use script1 functions
60
-
(function(){
61
-
var myApp = window.myApp = window.myApp || {};
62
-
63
-
console.log(myApp.aPublicFunction());
64
-
})();
38
+
// script1.js
39
+
(function(){
40
+
var myApp = window.myApp = window.myApp || {};
41
+
42
+
var aPublicVariable = 'I am public, yeahhh';
43
+
44
+
function aPublicFunction(){
45
+
return 'This function will be public';
46
+
}
47
+
48
+
var aPrivateVariable = 'I am private, Yeahh !!!';
49
+
50
+
function aPrivateFunction(){
51
+
return 'I will never export this function';
52
+
}
53
+
54
+
// exports public functions and variables
55
+
myApp.aPublicVariable = aPublicVariable;
56
+
myApp.aPublicFunction = aPublicFunction;
57
+
})();
58
+
59
+
// script2.js use script1 functions
60
+
(function(){
61
+
var myApp = window.myApp = window.myApp || {};
62
+
63
+
console.log(myApp.aPublicFunction());
64
+
})();
65
65
{% endhighlight %}
66
66
67
67
Attention script2 dépend de script1. Il y a un ordre à respecter au niveau de la déclaration des dépendances.
@@ -110,35 +110,35 @@ RequireJS est actuellement la solution mise en avant par :
110
110
Voici un exemple de code de RequireJS, suivez les commentaires pour les explications.
111
111
112
112
{% highlight javascript %}
113
-
/* js/script1.js */
114
-
define(
115
-
id, /* (optionnel) */
116
-
[ 'jquery', 'underscore' ], /* La liste des dépendances */
117
-
function($, _) {
118
-
/* on retrouve le module pattern ici */
119
-
var privateVariable = 'I am private';
120
-
function privateFunction(){ ... }
121
-
122
-
var publicVariable = 'I am public';
123
-
function publicFunction(){ ... }
124
-
125
-
/* Variables et functions à exporter */
126
-
return {
127
-
publicVariable: publicVariable,
128
-
publicFunction: publicFunction
129
-
}
130
-
}
131
-
)
132
-
133
-
/* bootstrap.js qui utilise la dépendance defini ci dessus. */
134
-
require({
135
-
paths: {
136
-
jquery: 'js/libs/jquery-1.7.1.min',
137
-
underscore: 'js/libs/underscore-min'
138
-
}
139
-
},['js/script1'], function(script1){
140
-
console.log(script.publicFunction());
141
-
})
113
+
/* js/script1.js */
114
+
define(
115
+
id, /* (optionnel) */
116
+
[ 'jquery', 'underscore' ], /* La liste des dépendances */
117
+
function($, _) {
118
+
/* on retrouve le module pattern ici */
119
+
var privateVariable = 'I am private';
120
+
function privateFunction(){ ... }
121
+
122
+
var publicVariable = 'I am public';
123
+
function publicFunction(){ ... }
124
+
125
+
/* Variables et functions à exporter */
126
+
return {
127
+
publicVariable: publicVariable,
128
+
publicFunction: publicFunction
129
+
}
130
+
}
131
+
)
132
+
133
+
/* bootstrap.js qui utilise la dépendance defini ci dessus. */
134
+
require({
135
+
paths: {
136
+
jquery: 'js/libs/jquery-1.7.1.min',
137
+
underscore: 'js/libs/underscore-min'
138
+
}
139
+
},['js/script1'], function(script1){
140
+
console.log(script.publicFunction());
141
+
})
142
142
{% endhighlight %}
143
143
144
144
Reprenons l'exemple précédent tout doucement.
@@ -153,30 +153,30 @@ RequireJs définie deux notions : `define` et `require`. Simple non :D
153
153
Si nous prenons l'exemple d'un module simple.
154
154
155
155
{% highlight javascript %}
156
-
define([
157
-
'jquery',
158
-
'underscore',
159
-
'js/myScript',
160
-
...
161
-
], function($, _, myScript, ...){
162
-
163
-
/* your private methods and variable here */
164
-
165
-
return { /* your public variables and functions here */ }
166
-
});
156
+
define([
157
+
'jquery',
158
+
'underscore',
159
+
'js/myScript',
160
+
...
161
+
], function($, _, myScript, ...){
162
+
163
+
/* your private methods and variable here */
164
+
165
+
return { /* your public variables and functions here */ }
166
+
});
167
167
{% endhighlight %}
168
168
169
169
Je n'ai pas spécifier l'ID, RequireJs va s'en occuper pour moi et je vous conseil de faire de même. Votre code sera réutilisable plus facilement.
170
170
171
171
Dans mon module, j'ai spécifié une liste de dépendances.
172
172
173
173
{% highlight javascript %}
174
-
[
175
-
'jquery',
176
-
'underscore',
177
-
'js/myScript',
178
-
...
179
-
]
174
+
[
175
+
'jquery',
176
+
'underscore',
177
+
'js/myScript',
178
+
...
179
+
]
180
180
{% endhighlight %}
181
181
182
182
Nous remarquons que pour myScript, le nom de la dépendance correspond à son chemin sans l'extension. Nous verrons par la suite comment configurer RequireJS afin de donner des chemins raccourcis (comme pour jQuery et underscore).
@@ -196,16 +196,16 @@ RequireJs va s'occuper de charger les dépendances des dépendances, ... et au f
196
196
Maintenant c'est sympa nous avons défini des modules, mais il nous manque un point d'entrée à notre application. C'est le rôle de `require` de faire ça. `require` va charger dynamiquement un module, puis ses dépendances, puis appeler la fonction passée en dernier paramètre.
@@ -214,10 +214,10 @@ Maintenant c'est sympa nous avons défini des modules, mais il nous manque un po
214
214
Comme vous l'avez remarqué le premier paramètre de requireJS est un objet de configuration :
215
215
216
216
{% highlight javascript %}
217
-
paths: {
218
-
jquery: 'js/libs/jquery-1.7.1.min',
219
-
underscore: 'js/libs/underscore-min'
220
-
}
217
+
paths: {
218
+
jquery: 'js/libs/jquery-1.7.1.min',
219
+
underscore: 'js/libs/underscore-min'
220
+
}
221
221
{% endhighlight %}
222
222
223
223
Le paramètre `paths` nous permet de définir l'emplacement des librairies utilisées
@@ -237,14 +237,14 @@ C'est le rôle de la configuration `paths: { jquery: 'js/libs/jquery-1.7.1.min',
237
237
Il faut rajouter dans le HTML les balises `script` pour RequireJS et notre bootstrap.js (celui faisant appel à toute nos dépendances) afin que le navigateur charge notre application.
238
238
239
239
{% highlight html %}
240
-
<html>
241
-
<head>...</head>
242
-
<body>
243
-
<!-- Ajoutons requireJS et notre script à la fin du body -->
244
-
<scriptsrc="require.js"></script>
245
-
<scriptsrc="bootstrap.js"></script>
246
-
</body>
247
-
</html>
240
+
<html>
241
+
<head>...</head>
242
+
<body>
243
+
<!-- Ajoutons requireJS et notre script à la fin du body -->
RequireJS rajoutera les dépendances chargées via des balises script dans
@@ -266,16 +266,16 @@ RequireJS arrive avec un [script de build](https://github.com/jrburke/r.js/) qui
266
266
Si on appelle r.js avec le paramètre -o et en lui spécifiant un fichier de configuration : `r.js -o build.js`. r.js va parcourir l'ensemble des scripts et les minifier, puis va parcourir nos dépendances afin de les grouper. Les fichiers résultant seront placés dans un nouveau répertoire afin de ne pas écraser les sources.
267
267
268
268
{% highlight javascript %}
269
-
({
270
-
appDir: './src', /* Repertoire des sources */
271
-
baseUrl: ".", /* Le repertoire racine */
272
-
dir: "./build", /* Repertoire de destination */
273
-
modules: [ {
274
-
name: 'bootstrap' /* Une dependance vers un module */
275
-
} ],
276
-
optimizeCss: "standard.keepLines", /* On va même optimiser les CSS */
277
-
dirExclusionRegExp: /node_modules|test|build/ /* on va exclure du processus de build certain repertoires. */
278
-
})
269
+
({
270
+
appDir: './src', /* Repertoire des sources */
271
+
baseUrl: ".", /* Le repertoire racine */
272
+
dir: "./build", /* Repertoire de destination */
273
+
modules: [ {
274
+
name: 'bootstrap' /* Une dependance vers un module */
275
+
} ],
276
+
optimizeCss: "standard.keepLines", /* On va même optimiser les CSS */
277
+
dirExclusionRegExp: /node_modules|test|build/ /* on va exclure du processus de build certain repertoires. */
278
+
})
279
279
{% endhighlight %}
280
280
281
281
Le fichier bootstrap.js du réperoire build contiendra l'ensemble de notre code js minifié.
@@ -313,9 +313,9 @@ Et voici une comparaisons des implémentations en terme de taille
313
313
Si vous utilisez Almond qui ne fait pas de chargement dynamique, vous aurez besoin en prod de remplacer 'RequireJS + votre code' par un seul fichier minifié contenant tout.
314
314
315
315
{% highlight html %}
316
-
- <scriptsrc="require.js"></script>
317
-
- <scriptsrc="boostrap.js"></script>
318
-
+ <scriptsrc="almond-and-bootstrap.js"></script>
316
+
- <scriptsrc="require.js"></script>
317
+
- <scriptsrc="boostrap.js"></script>
318
+
+ <scriptsrc="almond-and-bootstrap.js"></script>
319
319
{% endhighlight %}
320
320
321
321
Pour cela vous pouvez :
@@ -331,33 +331,33 @@ Voici un exemple de module RequireJS avec une dépendance texte (regardez
331
331
le préfixe text!) :
332
332
333
333
{% highlight javascript %}
334
-
/* bootstrap.js */
335
-
require([
336
-
'jquery',
337
-
'underscore',
338
-
'text!views/template.html'
339
-
], function($, _, tmpl){
340
-
var compiledTemplate = _.template(tmpl);
341
-
342
-
$(function(){
343
-
var $el = $('.injectHere');
344
-
$('.btn').click(function(){
345
-
$el.html(compiledtemplat({
346
-
firstName: firstName,
347
-
lastName: lastName
348
-
})));
349
-
});
350
-
});
351
-
})
334
+
/* bootstrap.js */
335
+
require([
336
+
'jquery',
337
+
'underscore',
338
+
'text!views/template.html'
339
+
], function($, _, tmpl){
340
+
var compiledTemplate = _.template(tmpl);
341
+
342
+
$(function(){
343
+
var $el = $('.injectHere');
344
+
$('.btn').click(function(){
345
+
$el.html(compiledtemplat({
346
+
firstName: firstName,
347
+
lastName: lastName
348
+
})));
349
+
});
350
+
});
351
+
})
352
352
{% endhighlight %}
353
353
354
354
Et voici le template en HTML utilisant le [micro templating underscore](http://documentcloud.github.com/underscore/#template)
355
355
356
356
{% highlight javascript %}
357
-
<!-- views/template.html -->
358
-
<divclass="personn">
359
-
<p>My name is <%= firstName %> <%= lastName %></p>
360
-
</div>
357
+
<!-- views/template.html -->
358
+
<divclass="personn">
359
+
<p>My name is <%= firstName %> <%= lastName %></p>
360
+
</div>
361
361
{% endhighlight %}
362
362
363
363
Si on faisait tourner le script de build r.js on obtiendrait dans le même fichier :
@@ -382,6 +382,8 @@ Si vous voulez voir des exemples de code utilisant RequireJS, j'ai créé
382
382
un repo pour ça : <https://github.com/Filirom1/requirejs-examples> à
383
383
l'occasion d'un talk à [LyonJS](http://lyonjs.org).
384
384
385
+
Et concernant les tests, jetez un oeil à [js-library-skeleton](https://github.com/tkellen/js-library-skeleton) qui est un exemple d'integration de RequireJs, r.js, Almond et le framework de test Jasmine.
386
+
385
387
Si vous souhaitez plus de ressources sur RequireJS :
386
388
387
389
*[Lisez le site officiel de RequireJS](http://requirejs.org/)
0 commit comments