Browserify
Ta life
Pourquoi ?
Comment on fait aujourd'hui ?
<script src="scripts/jquery-1.10.1.min.js"></script>
<script src="scripts/slick.min.js"></script>
<script src="scripts/jquery-ui-1.10.3.custom.min.js"></script>
<script src="scripts/jquery.placeholder.js"></script>
<script src="scripts/fastclick.min.js"></script>
<script src="scripts/main.js"></script>
<script src="scripts/basket.js"></script>
<script src="scripts/home.js"></script>
<script src="scripts/modal.js"></script>
<script src="scripts/fancySelect.js"></script>
<script src="scripts/product.js"></script>
On inclut les scripts "à la main"
- on doit prévoir ce qui sera utilisé / plus utilisé
- on doit faire attention à l'ordre de déclaration sous peine de non fonctionnement
- donne une tendance à abuser des variables globales (closures)
- gestion du graphe de dépendances manuel
- ça passe pour des petits projets mais montre clairement ses limites au delà
Les Modules JS
(Aujourd'hui)
Le meilleur choix :
Les modules ES6 mais il faut ajouter une passe de compilation en plus
Le meilleur choix aujourd'hui :
Les modules CommonJS
- node style
- npm
- Browserify pour la partie client
- proche de l'api des modules ES6
À quoi ressemble le code 1/2
// assets/js/src/talker.js
// this vars are not accessible from outside
var count = 0,
enabled = false;
// This object will be exposed to the world
module.exports = {
say: function(what) {
console.log(what);
if(typeof document !== "undefined" && document) {
document.write(what);
}
count++;
},
sayCount: function(verbose) {
if(typeof verbose == "undefined" || verbose) {
console.log('I have been used ' + count + (count > 1 ? ' times' : ' time'));
} else {
return count;
}
}
};
Un module
À quoi ressemble le code 2/2
// assets/js/src/app.js
// require a local module
var talker = require('./talker.js');
talker.say('Hello ');
talker.sayCount();
talker.say('World ');
talker.sayCount();
talker.say('!');
talker.sayCount();
// example with an npm module
var slugify = require("underscore.string/slugify");
var print = console.log.bind(console, '>');
var testString1 = 'Hostels in Rio de Janeiro from $9.5/night',
testString2 = 'à l\'ouest rien de nouveau',
testString3 = 'une écharpe dorée et un œuf';
print(slugify(testString1));
print(slugify(testString2));
print(slugify(testString3));
if (typeof document !== "undefined" && document) {
var pre = document.createElement('pre');
pre.innerHTML += ((testString1)) + "\n";
pre.innerHTML += (slugify(testString1)) + "\n";
pre.innerHTML += "\n";
pre.innerHTML += (testString2) + "\n";
pre.innerHTML += slugify(testString2) + "\n";
pre.innerHTML += "\n";
pre.innerHTML += (testString3) + "\n";
pre.innerHTML += slugify(testString3) + "\n";
document.body.appendChild(pre);
}
Utilisation module local et module npm
Exécution dans nodejs
Comment qu'on fait pour
On installe
npm install -g browserify
On utilise
browserify assets/js/src/app.js -do assets/js/app.js
On inclut dans sa page
<script src="assets/js/app.js"></script>
que ça marche dans le navigateur
-d == sourcemaps js (yay)
Résultat
On y gagne quoi ?
- Possibilité d'utiliser des modules CommonJS pour écrire son code
- On peut inclure ses modules en local ( require "./mon-module.js" )
- Une gestion de ses dépendances clean
- Scope sain (scope local implicite par défaut)
- Possibilité d'avoir le même code pour le client et pour nodejs
- Accès aux 196 160 packages npm sur le client
- On peut gérer son js avec npm + packages.json ( ou pas )
One more thing ...
Un test
// assets/js/tests/talker.js
var test = require('prova'),
talker = require('../src/talker.js');
test('say test', function(t){
t.equal(talker.sayCount(false), 0);
talker.say('I love to talk');
t.equal(talker.sayCount(false), 1);
t.end();
});
bash$ node assets/js/tests/talker.js
I love to talk
2 passed assertions.
Node
Browser
Testing
Merci de votre attention
Ressources
Encore plus mieux
Browserify ta life
By Sylvain Combes
Browserify ta life
Une intro rapide à browserify
- 2,050