JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
JavaScript
- Mais à quoi ça sert ?
- Manipulation et animation dynamiques du contenu des pages Web
- Ouverture, fermeture de fenêtres
- Communication avec « le » serveur
- Warning : cross-domain scripting
- Enregistrement des actions de l'utilisateur (!)
- Réaction aux évènements utilisateur
- Sauvegarde de données...
Définition
JavaScript est un langage de programmation orienté objet développé par NETSCAPE dans les années 90, et s'appelait à l'origine LiveScript.
- Il fut adopté par la firme SUN (qui est à l'origine du langage JAVA) en 1995.
- Le JavaScript est une extension du langage HTML.
Popularité de JavaScript (1)
- JavaScript, le langage de programmation populaire avec la plus importante progression (mais pas le plus grand nombre de lignes de code déployées)
- JavaScript langage de l'année 2014 et 2015 selon l'Index TIOBE (nombre de développeurs + nombre de tutoriaux + nombre de vendeurs tiers, sur la base des recherches dans les moteurs Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube et Baidu)
Popularité de JavaScript (3)
- Autres indicateurs de popularité :
- GitHub (plus nombre de dépôts de source avec JavaScript et plus projets JavaScript les plus populaires)
Popularité de JavaScript (4)
- JavaScript présent dans tous les navigateurs web avec maintenant des implémentations à jour
- ECMAScript 6 disponible et implémentation progressive dans les différents moteurs
- Node.js et NPM à la base du nouveau succès de JavaScript (après avoir été le langage le plus détesté)
- Le plus de modules tiers disponibles grâce à NPM et GitHub. Il existe un module JavaScript existant pour quasiment chaque besoin, ou bien il est en train d'être écrit !
Node.js choisi par les entreprises du web
- Plus de téléchargements des modules NPM durant la semaine que le week-end et les vacances
- Les modules JavaScript sont plus utilisés et développés dans le cadre des entreprises que dans le cadre des loisirs
- Node.js utilisé en production par Dow Jones, eBay, Walmart, PayPal, LinkedIn, Yahoo!, The New York Times, Über, Airbnb, Groupon, SAP, Rakuten, TF1, Google
- Node.js supporté officiellement par Oracle (http://nodejs.org/industry/)
D'autres choix
- D'autres acteurs n'utilisent pas Node.js côté serveur :
- Chez Twitter c'est du Java (après avoir débuté avec du Ruby On Rails)
- Chez Facebook c'est du Hack (un nouveau PHP)
- Chez GitHub c'est du Ruby On Rails et du Erlang
- Google utilise d'autres langages que JavaScript et d'autres plateformes que Node.js : notamment Go (en remplacement de C++)
Ubiquité
- On peut utiliser JavaScript :
- Sur navigateur pour sites web et web apps
- Sur serveur pour applications web
- Sur navigateur + serveur pour applications isomorphiques
- Sur serveur et poste développeur pour scripts/batches systèmes (export CSV, transformation/conversion de données, etc.)
- Sur serveur et poste développeur pour scripts web (SlimerJS, PhantomJS, etc.)
JavaScript
- Spécification de référence: ECMAScript-262 (édition 6.0 – 2015)
- Fonctionnalités additionnelles incompatibles
- Caractéristiques :
- Langage interprété
- moteur intégré dans les navigateurs
- Basé objet mais orienté prototype
- Dynamique (typage, fonctions, code...)
- Événementiel
ECMAScript 6
- La spécification ECMAScript 6 est aussi appelée ES6, Harmony ou ES.next
- Finalisation de la spécification Juin 2015
- Les différents moteurs JavaScript implémentent déjà progressivement ECMAScript 6 depuis des années en évoluant en même temps que la spec
- Apporte ce qui manquait à JavaScript pour faciliter la vie des développeurs (et qu'on pouvait déjà trouver dans d'autres langages comme Python, Java, etc.) : modules, collections, template strings, iterateurs, générateurs, etc.
JavaScript
- Orienté “prototype” ???
- Basé objet mais pas orienté objet
- On déclare un objet générique, puis héritage
- Dynamique ???
- Typage, fonctions, code...
- Pratique mais dangereux...
- Événementiel ???
- Paradigme de programmation
- Attente” puis réaction aux actions “utilisateur”
Définition
Javascript
Java
Langage interprété
Langage compilé
Code intégré au HTML
Code (applet)
Langage peu typé
Langage fortement typé
Liaisons dynamiques: les références des objets sont vérifiées au chargement
Liaisons statiques: Les objets doivent exister au chargement (compilation)
Accessibilité du code
Confidentialité du code
Sûr: ne peut pas écrire sur le disque dur
Sûr: ne peut pas écrire sur le disque dur
JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
Syntaxe
- Intégration du script dans la page
*inline*
<script type=”text/javascript”>....</script>
Appel externe avec une réf. comme pour css
<script src=”/js/script.js” type=”text/javascript”/>
- Chargement du script
- Importance du placement dans la page
- Dans le header (délai)
- Dans le body, ou en fin de body
- Cache si appel externe (mieux), compression
Syntaxe
- Bonnes pratiques
- Lecture par événement “onload”
- “Separation of concerns” (Dijkstra)
- Pour le script principal
- Utilisation de fonctions
- chargement dynamique (cf plus tard)
Syntaxe
<script type="text/javascript" src="url/nomdufichier.js"> </script>
Syntaxe
- Les structures conditionnelles ou répétitives (boucles)ont la même syntaxe qu'en langage C.
- JavaScript est un langage faiblement typé.
Syntaxe
Portée des variables:
Syntaxe
- The JavaScript syntax is similar to C# and Java
- Operators (+, *, =, !=, &&, ++, …)
- Variables (typeless)
- Conditional statements (if, else)
- Loops (for, while)
- Arrays (my_array[]) and associative arrays (my_array['abc'])
- Functions (can return value)
- Function variables (like the C# delegates)
JavaScript data types
- Numbers (integer, floating-point)
- Boolean (true / false)
- String type – string of characters
var myName = "You can use both single
or double quotes for strings";
var my_array = [1, 5.3, "aaa"];
- Associative arrays (hash tables)
var my_hash = {a:2, b:3, c:"text"};
Everything is Object
- Every variable can be considered as object
- For example strings and arrays have member functions:
// file: objects.html
var test = "some string";
alert(test[7]); // shows letter 'r'
alert(test.charAt(5)); // shows letter 's'
alert("test".charAt(1)); // shows letter 'e'
alert("test".substring(1,3)); // shows 'es'
var arr = [1,3,4];
alert (arr.length); // shows 3
arr.push(7); // appends 7 to end of array
alert (arr[3]); // shows 7
String Operations
The + operator joins strings (slow)
string1 = "lol ";
string2 = "cats";
alert(string1 + string2); // lol cats
What is "11" + 11?
alert("11" + 11); // 1111
Converting string to number:
alert(parseInt("11") + 11); // 22
alert(parseInt("011",8) + 11); // 20 ???
alert(parseInt("011", 10) + 11); // 22
Arrays Operations and Properties
Declaring new empty array:
var arr1 = new Array(); var arr2 = [];
Declaring an array holding few elements:
var arr = [1, 2, 3, 4, 5];
Appending an element / getting the last element:
arr.push(3); var element = arr.pop();
Reading the number of elements (array length):
arr.length;
Finding element's index in the array:
arr.indexOf(1);
Conditional Statement (if)
unitPrice = 1.30;
if (quantity > 100) {
unitPrice = 1.20;
}
/*
Greater than: >
Less than: <
Greater than or equal to: >=
Less than or equal to: <=
Equal: ==
Not equal: !=
*/
Conditional Statement (if)
The condition may be of Boolean or integer type:
var a = 0;
var b = true;
if (typeof(a)=="undefined" || typeof(b)=="undefined") {
document.write("Variable a or b is undefined.");
}
else if (!a && b) {
document.write("a==0; b==true;");
} else {
document.write("a==" + a + "; b==" + b + ";");
}
Switch Statement
The switch statement works like in C#:
switch (variable) {
case 1:
// do something
break;
case 'a':
// do something else
break;
case 3.14:
// another code
break;
default:
// something completely different
}
Loops
Like in C# (for, while, do while)
/*
for loop
while loop
do … while loop
*/
var counter;
for (counter=0; counter<4; counter++) {
alert(counter);
}
for (var key in haystack);
while (counter < 5) {
alert(++counter);
}
Syntaxe
- Les chaînes de caractères:
- Pour manipuler des chaînes de caractères, il existe de nombreuses fonctions.
- Contrairement au langage C, il est possible de comparer deux chaînes de caractères à l'aide de l'opérateur ==.
Functions
- Code structure – splitting code into parts
- Data comes in, processed, result returned
function average(a, b, c) {
var total;
total = a+b+c;
return total/3;
}
- Anonymous functions
var average = function (a, b, c) { ... }
var res1 = average(1,2,3);
var myAvg = average;
var res2 = myAvg(1,2,3);
Function Arguments and Return Value
- Functions are not required to return a value
- When calling function it is not obligatory to specify all of its arguments
- The function has access to all the arguments passed via arguments array
function sum() {
var sum = 0;
for (var i = 0; i < arguments.length; i ++)
sum += parseInt(arguments[i]);
return sum;
}
alert(sum(1, 2, 4));
JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
Les objets
- L'utilisation principale de JavaScript est la manipulation des objets d'une page et plus particulièrement des objets des formulaires
- Il est possible d'interagir à deux niveaux:
- Au niveau du navigateur internet
- Au niveau de la page affichée dans le navigateur
Les objets
- Une page est composée de façon hiérarchique.
Les objets
leLogin=window.document.forms["monForm"].login.value;
Les objets
- Classes are functions
- Objects are associative arrays
-
this refers to the owning code
-
new copies the prototype into new reference
var person = new Object();
person.first = "Tim";
person.last = "Scarfe";
person.sayHello = function() {
console.log("Hello, " + this.first + " " + this.last);
};
person.sayHello();
Les objets
function User(first, last) {
this.first = first;
this.last = last;
this.sayHello = function() {
console.log("Hello, " + this.first
+ " " + this.last);
}
}
var svi = new User("Svi", "Ivanov");
var alex = new User("Alex", "Ivanova");
svi.sayHello();
alex.sayHello();
JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
Les évènements
- L'action sur un élément de la page se fait lors d'un événement particulier (clique de souris, changement de la valeur d'un champ, etc)
- Voici quelques évènements possibles pour une page WEB
- Click (onClick)
- Load (onLoad)
- Unload (onUnload)
- MouseOver (onMouseOver)
- MouseOut (onMouseOut)
- Focus (onFocus)
- Change (onChange)
- Submit (onSubmit)
Les évènements
- Pour qu'un objet réagisse à un événement, il faut lui associer une fonction de traitement.
- Exemple:
<html><body>
<script src="mesFonctions.js" type="text/javascript"></script>
<form name="monForm">
<label for="login">Votre login :</label>
<input type="text" name="login" id="login"
onchange="afficheLogin();">
<input type="text" name="loginBis" id="loginBis">
</form>
</body></html>
- Le fichier mesFonctions.js contient le code suivant:
function afficheLogin(){
window.document.forms["monForm"].loginBis.value =
window.document.forms["monForm"].login.value;
}
JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
Les boîtes de dialogue
- Il existe 3 types de boîtes de dialogue:
- alert : affiche un message et un bouton ok
- confirm : affiche un message et un bouton ok et annuler
Les boîtes de dialogue
- prompt : affiche une zone de saisie et un bouton ok.
- confirm retournera true ou false selon la réponse (ok ou annuler).
- prompt retournera le message contenu dans la zone de saisie.
JavaScript
- Définition
- Syntaxe
- Les objets
- Les évènements
- Les boîtes de dialogue
- Accès à un élément quelconque d'une page
Accès à un élément quelconque d'une page
-
La manière la plus simple pour avoir accès à un élément quelconque d'une page est d'utiliser son identifiant
var obj = document.getElementById("idelement") ;
-
Il est ainsi possible d'avoir des informations et d'agir sur l'élément
-
innerHTML : va recupérer/modifier le contenu HTML de l'élément
-
textContent : va recupérer/modifier le contenu de l'élément
-
nodeName : va recupérer le nom de l'élément
An example
<div id="div1"></div>
<input type="button" value="Vert" onclick="vert();"/>
<input type="button" value="Rouge" onclick="rouge();"/>
An example
#div1{
background-color:#ff0000;
width:200px;
height:200px;
}
An example
function vert(){
document.getElementById('div1').style.backgroundColor='#00ff00';
}
function rouge(){
document.getElementById('div1').style.backgroundColor='#ff0000';
}
Tools for JavaScript Development
Unleash the Power of JavaScript Tooling
Table of Contents
-
JavaScript Editors
- JetBrains WebStorm
- Sublime Text 2/3
- Atom
- Visual Code Editor
-
Project tools
- Package Management: NPM/Yarn & Bower
- Scaffolding: Yeoman
- Task Automation: Grunt && Gulp
JetBrains WebStorm
- JavaScript IDE suitable for both client-side JavaScript and server (Node.js) development
- Livereload
- Build
- Code highlighting/Intellisense for:
- LESS/SASS/Stylus CSS preprocessors
- CoffeeScript/TypeScript JavaScript preprocessors
- AngularJS directives
- Emmet Coding
- Has only 30-days-long free trial
Sublime Text 2/3
- Editor for scripting languages
- JavaScript, PHP, Python, Ruby, etc…
- Basic code highlighting with vanilla installation
- Endless number of configurable plugins
- Free product
- Paid only if used commercially
- With plugins support for:
- LESS/SASS/Stylus
- CoffeeScript/TypeScript
Atom: A hackable text editor
- Cross-platform editing
- Built-in package manager
- Smart autocompletion
- File system browser
- Under the hood
- Atom is a desktop application built with HTML, JavaScript, CSS, and Node.js integration. It runs on Electron, a framework for building cross platform apps using web technologies.
- Open source
Visual Code Editor
- Smart autocompletion with IntelliSense.
- smart completions based on variable types, function definitions, and imported modules.
- Debugging support
- Git commands built-in
- Extensible and customizable
- great integration of TypeScript and Angular 2
- Open source
Project Tools
No matter the Editor
Project Tools
- NPM, Yarn & Bower
- Install Node.js packages or client libraries
- Grunt & Gulp
- Tasks runner
- Create different tasks for build/development/test cases
- Yeoman
- Scaffolding of applications
- One-line-of-code to create a project template with views/routes/modules/etc…
Package Management
NPM, Yarn & Bower
Package Management: NPM
npm init
//enter package details
name: "NPM demos"
version: 0.0.1
description: "Demos for the NPM package management"
entry point: main.js
test command: test
git repository: http://github.com/user/repository-name
keywords: npm, package management
author: doncho.minkov@telerik.com
license: BSD-2-Clause
Package Management: NPM
- Installing modules
npm install package-name [--save][--save-dev][--save-optional]
# Installs a package to the Node.js project
-S, --save: Package will appear in your dependencies
in package.json
-D, --save-dev: Package will appear in
your devDependencies
-O, --save-optional: Package will appear in
your optionalDependencies.
npm install express --save-dev
Before running the project
npm install ## Installs all missing packages from package.json
Package Management: Bower
- Bower is a package management tool for installing client-side JavaScript libraries
- Asks for pretty much the same details as $ npm init
- Creates bower.json file to manage libraries
Package Management: Bower
- Searching for libraries
bower search kendo
- Installing libraries
bower install kendo-ui
Grunt & Gulp
Tasks Runner
Grunt
- Grunt is a Node.js task runner
- It can runs different tasks, based on configuration
- Tasks can be:
- Concat and minify JavaScript/CSS files
- Compile SASS/LESS/Stylus
- Run jshint, csshint
- Run Unit Tests
- Deploy to Git, Cloud, etc…
- And many many more
Grunt
- Why use a task runner?
- Task runners gives us automation, even for different profiles:
DEVELOPMENT
TEST
BUILD
jshint
jshint
jshint
stylus
stylus
stylus
csshint
csshint
csshint
connect
mocha
concat
watch
uglify
copy
usemin
Configuring Grunt
- To configure grunt, create a Gruntfile.js file in the root directory of your application
Configuring Grunt Plugins
- To use a plugin in grunt:
npm install grunt-contrib-jshint --save-dev
//inside the grunt module
grunt.loadNpmTasks('grunt-contrib-jshint');
//inside the grunt.initConfig()
grunt.initConfig({
jshint: {
app: ['Gruntfile.js',
'path/to/scripts/**/*.js']
}
});
Grunt Plugins: Build
-
jshint (grunt-contrib-jshint )
- Runs jshint for specified files
-
csslint(grunt-contrib-csshint)
- Runs csslint for specified files
-
stylus (grunt-contrib-stylus)
- Compiles STYL files into CSS files
-
uglify (grunt-contrib-uglify)
- Minifies configured JavaScript files
-
concat (grunt-contrib-concat)
- Concats configured JavaScript files
Grunt Plugins: Development
-
connect (grunt-contrib-connect)
- Stars a Web server on a given port and host
-
watch (grunt-contrib-watch)
- Watches for changes to configured files
- Can run other tasks on file changed
Gulp: The streaming build system
Streams come to us from the earliest days of unix and have proven themselves over the decades as a dependable way to compose large systems out of small components that do one thing well.
You can then plug the output of one stream to the input of another and use libraries that operate abstractly on streams to institute higher-level flow control.
Why streams?
Picture a build system in your head.
- It should take in files, modify them, and output the new ones
What is wrong with Grunt
- Plugins do multiple things
- Want a banner? Use the javascript minifier
- Plugins do things that don't need to be plugins
- Need to run your tests? Use a plugin
- Grunt config format is a mess that tries to do everything
- Not idiomatic with "the node way"
- Headache of temp files/folders due to bad flow control
Your build system should empower not impede
It should only manipulate files - let other libraries handle the rest.
Sample Gruntfile
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/**/*.js'],
dest: 'dist/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
qunit: {
files: ['test/**/*.html']
},
jshint: {
files: ['gruntfile.js', 'src/**/*.js', 'test/**/*.js'],
options: {
// options here to override JSHint defaults
globals: {
jQuery: true,
console: true,
module: true,
document: true
}
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'qunit']
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('test', ['jshint', 'qunit']);
grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
};
1. Runs tests
2. Lints code
3. Concats javascript
4. Minifies it
5. Runs again if files are changed
What's the difference?
- With Gulp your build file is code, not config
- You use standard libraries to do things
- Plugins are simple and do one thing - most are a ~20 line function
- Tasks are executed with maximum concurrency
- I/O works the way you picture it
Gulp does nothing but provide some streams and a basic task system
Gulp has only 5 functions you need to learn
gulp.task(name, fn)
- It registers the function with a name.
- You can optionally specify some dependencies if other tasks need to run first.
gulp.run(tasks...)
- Runs all tasks with maximum concurrency
gulp.watch(glob, fn)
- Runs a function when a file that matches the glob changes
- Included in core for simplicity
gulp.src(glob)
- This returns a readable stream.
- Takes a file system glob (like grunt) and starts emitting files that match.
- This is piped to other streams
gulp.dest(folder)
- This returns a writable stream
- File objects piped to this are saved to the file system
Yeoman
Application Scaffolding
Yeoman
- Yeoman is a Node.js package for application scaffolding
- Uses bower & NPM to install the js package
- Has lots of generators for many types of applications:
- MEAN, AngularJS, Kendo-UI, WebApp, WordPress, Backbone, Express, etc…
- Each generators install both needed Node.js packages and client-side JavaScript libraries
- Generated Gruntfile.js for build/test/serve
Yeoman
Install Yeoman:
npm install –g yo
Install Yeoman generator:
npm install –g generator-jhipster
Scaffold Express application:
cd path/to/app/directory
yo jhipster
Generates:
Présentation Node.js (1)
- Node.js, plateforme événementielle aux entrées-sorties non-bloquantes (asynchrone) pour développer des applications en JavaScript "côté serveur"
- Moteur léger et écologique !
- (peu gourmand en ressources, CPU, RAM)
- Noyau en JavaScript et C++ par-dessus le moteur JavaScript V8 de Google Chrome
- (moteur V8 régulièrement mis à jour dans Node.js)
- Logiciel libre à licence permissive (licence MIT) avec la quasi totalité des modules également à licence permissive (licence MIT ou BSD)
Présentation Node.js (2)
- Les méthodes de l'API sont asynchrones par défaut
- Le streaming au coeur de l'API
- Manipule nativement le JSON
- Sait gérer nativement toutes les requêtes HTTP
- (pour réaliser l'équivalent d'appels AJAX côté serveur)
- Développement aisé d'applications (grande agilité)
- Les applications réalisées sont extrêmement rapides
- Mettre frontal Nginx (basé événements) à la place de Apache (basé processus), sinon performances bridées
Utilisations de Node.js
- Node.js excellent pour :
- API web (REST, services JSON)
- Sites web (notamment streaming de bout en bout : par exemple streaming de fichiers depuis base de données puis streaming de ces fichiers dans archive ZIP puis streaming HTTP vers navigateur web)
- Très nombreuses connexions et montée en charge (gère des milliers de connexions simultanées à faible charge sur un seul processus)
- Communications temps réel (sockets, polling, etc.)
Limitations
- Node.js inadapté pour :
- Usage intensif du CPU : 3D, transcodage vidéo, et en général tout calcul mathématique non fourni par l'API du coeur (les fonctions cryptographiques font, elles, partie du coeur et sont rapides, en C++)
- Mise en mémoire de grande quantité de données (pas plus de 1Go augmentable à 1,7Go max). Mais de par programmation événementielle cette limite est moins gênante qu'elle le serait avec d'autres langages comme Java par exemple (qui consomme une très grande quantité de mémoire).
Philosophie de Node.js
Agilité maximale
Innovation rapide car décentralisée
Callback Node.js normalisé
- Un callback normalisé doit être passé comme argument à toutes les méthodes asynchrones
function(err, res) {
if (err) {
console.error("Failed:", err);
return;
}
console.info("Success with produced result:", res);
}
Mais on peut utiliser des promesses en « promisifiant » les méthodes de Node.js (cf. infra)
Modules serveur utiles (1)
-
Tracer : logs serveur
-
Commander : Gestion de la ligne de commande
-
Node-convict : lecture / enregistrement de configuration
-
Express : cadriciel web/REST (web framework)
-
Koa : cadriciel web/REST (web framework) utilisant les promesses et les générateurs
Modules serveur utiles (2)
-
Bookshelf.js : ORM fonctionnant avec PostgreSQL, MySQL, SQLite3, Oracle
-
Ldapjs : Client et serveur LDAP
-
Nodemailer : Envoi de courriels
-
Archiver : Génération d'archives ZIP, TAR en streaming
-
Fast-csv : création / lecture de CSV
Modules client et serveur utiles
-
Create-error : création nouveaux types d'erreur
-
Bluebird : Module pour promesses, ultra-rapide, avec plein d'utilitaires
-
Moment : affichage, manipulations dates et durées
-
Validator.js : Validation et nettoyage de chaînes de caractères
-
Nunjucks : template engine proposant layouts et streaming (développé par Mozilla)
-
Base64url : encode, decode, escape, unescape
Modules client utiles
-
Loglevel : logs en console débraillables à l'exécution et compatible avec tout navigateur web (idéal pour assurer du débogage et du support)
-
Dexie : API IndexedDB avec des promesses, permettant notamment la recherche plein texte
Bonnes pratiques avec modules NPM (1)
Bonnes pratiques avec modules NPM (2)
Bonnes pratiques avec modules NPM (3)
On trouve essentiellement des licences :
- MIT
- BSD
- Apache
Factoriser le code avec modules NPM (1)
- Avec NPM on peut utiliser (installer) un module présent dans le registre NPM mais pas que …
- Avec NPM on peut aussi utiliser (installer) un module présent sur un dépôt Git public, comme GitHub, ou privé
Factoriser le code avec modules NPM (2)
- Forme des URL de module sur dépôt Git :
git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish
- Exemple pour utiliser (installer) un module privé :
npm install git+ssh://git@git.entreprise.fr:module1.git --save-dev –save-exact
- Suppression du besoin d'utilisation de git-submodules dans beaucoup de cas
Modules CommonJS
- NPM et Node.js utilisent le standard CommonJS pour gérer les modules. La spec modules ES6 en est inspirée.
Exemple de module fourni (repository.js) et de module importé (behavior.js) :
// repository.js
exports.getDocsCount = getDocsCount;
function getDocsCount() {
return db.documents.count();
}
// behavior.js
var repository = require('./repository');
repository.getDocsCount();
Modules CommonJS pour code client (navigateur)
- Grâce à Browserify on peut utiliser les modules CommonJS avec tous les avantages que cela représente au niveau du code JavaScript déployé sur le client (navigateur)
- On peut ainsi disposer d'environ 80% des 120.000 modules NPM disponibles à ce jour côté client.
- Les développeurs peuvent utiliser les mêmes modules qu'ils connaissent côté client que côté serveur (et inversement :-) )
- Pour mettre en pratique lire absolument : https://github.com/substack/browserify-handbook
Autres gestionnaires de modules (bower, yeoman)
- Il y a actuellement plusieurs gestionnaires de modules JavaScript :
- Bower et Yeoman sont moins puissants que NPM et sont généralement utilisés par les développeurs connaissant peu (la puissance de) NPM et Browserify
- NPM a vocation à devenir l'unique gestionnaire de modules JavaScript. Mais Yarn est très populaire
Outils de construction d'applications
-
Grunt : Outil très célèbre, basé sur la configuration, pour construire des applications web.
- Facile à comprendre et à utiliser.
-
Désavantage : ne tire pas partie du streaming, fichiers lus et modifiés sur disque à chaque tâche.
-
Gulp : Outil de construction basé sur le code, plutôt que la configuration, et utilisant le streaming
-
NPM : NPM seul peut aussi servir à construire des applications (minification, etc.)
Promesses
- On peut gérer le code asynchrone avec des callbacks. C'est la pratique par défaut dans Node.js
- Mais peut devenir très pénible quand plusieurs actions asynchrones s’enchaînent ou se déroulent en parallèle
- La meilleure solution → les promesses (aussi appelées engagements ou futures)
- En anglais on parle de promises ou de thenables
Promesses
Exemple de code asynchrone classique :
fs.readFile('file.json', function(err, val) {
if (err) {
console.error("Unable to read file");
} else {
try {
val = JSON.parse(val);
console.log(val.success);
} catch( e ) {
console.error("Invalid JSON in file");
}
}
});
Promesses
var P = require('bluebird');
var fs = P.promisifyAll(require('fs'));
fs.readFileAsync('file.json').then(JSON.parse)
.then(function(val) {
console.log(val.success);
})
.catch(SyntaxError, function(err) {
console.error("Invalid JSON in file", err);
})
.catch(function(err) {
console.error("Unable to read file", err) ;
});
Veille sécurité et correctifs
NSP
npm install --prefix ~/ -g nsp
nsp audit-package
Name Installed Patched Vulnerable Dependency
connect 2.7.5 >=2.8.1 nodesecurity-jobs > kue > express
nsp audit-shrinkwrap
Name Installed Patched Vulnerable Dependency
connect 2.7.5 >=2.8.1 nodesecurity-jobs > kue > express
Mon premier programme en Node.js
// bonjour.js
console.log('Bonjour');
$ node bonjour.js
Early Web
- Web designed for documents
- Server creates pages / browser displays
- Data input sent to and processed by the server
- Updated pages created on the server and resent
First Example - PHP
<!doctype html>
<html>
<head>
</head>
<body>
<form method="post" action="hello.php">
<label>Name:</label>
<input type="text" id="yourName”>
<input type="submit" value="Say Hello" />
<hr>
<?php
echo "<h1>Hello ".$HTTP_POST_VARS["yourName"]."!</h1>";
?>
</form>
</body>
</html>
Web Evolution - AJAX
- Interactive client-side web
- Collect input from user
- Update display
- Communicate with server
- Client-side processing enabled by
- JavaScript
- DOM manipulation
- HTTP server messaging
First Example - jQuery
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function() {
$("#yourName").keyup(function () {
$("#helloName").text("Hello " + this.value + "!");
});
});
</script>
</head>
<body>
<div>
<label>Name:</label>
<input type="text" id="yourName">
<hr>
<h1 id="helloName"></h1>
</div>
</body>
</html>
jQuery
- Simplifies event binding and DOM manipulation
- Common API across multiple browsers
- Supports plug-in modules to extend functionality
- Requires writing JavaScript code to wire
Today’s Web – Can we do better?
- Follow good programming practices
- Separate: data / display / processing
- Simplify connecting data to display
- Let us focus on the technologies of the web
First Example - AngularJS
<html ng-app>
<head>
<script src="https://code.angularjs.org/1.5.3/angular.min.js"></script>
</head>
<body>
<div>
<label>Name:</label>
<input type="text" ng-model="yourName">
<hr>
<h1>Hello {{yourName}}!</h1>
</div>
</body>
</html>
Imperative vs. Declarative
<input type="text" id="yourName">
<h1 id="helloName"></h1>
<script type="text/javascript">
$(function() {
$("#yourName").keyup(function () {
$("#helloName").text("Hello " + this.value + "!");
});
});
</script>
to AngularJS declarative relationships
<input type="text" ng-model="yourName">
<h1>Hello {{yourName}}!</h1>
The DOM abstraction
- HTML is a declarative document language
- Browser translates HTML into a Document Object Model (DOM)
- DOM is the browser’s in-memory document representation
- JavaScript can manipulate the DOM
AngularJS "compiles" HTML
- Browsers send a document (i.e. DOM) ready event
- AngularJS can intercede and rewrite the DOM
- The rewrite is driven by markup in the DOM
Model-View-Controller (MVC)
MVC and Variations
- Different variations of the pattern
- Model-View-ViewModel (MVVM)
- Model-View-Presenter (MVP)
- Variations differ on…
- connectivity
- cardinality
- directionality
Model-View-Whatever
" MVC vs MVVM vs MVP. What a controversial topic that many developers can spend hours and hours debating and arguing about. For several years AngularJS was closer to MVC (or rather one of its client-side variants), but over time and thanks to many refactorings and api improvements, it's now closer to MVVM – the $scope object could be considered the ViewModel that is being decorated by a function that we call a Controller.
…I hereby declare AngularJS to be MVW framework - Model-View-Whatever.
…"
Igor Minar – Google AngularJS Development Team
Summary what is AngularJS?
- An MVC framework for efficiently creating dynamic views in a web browser (using HTML and JavaScript)
- Some highlights/focuses:
- Complete application framework
- From jQuery replacement to a massive enterprise Single Page Application (SPA)
- Fully dynamic MVVM with POJOs
- Low level-DOM manipulation/markup invention with directives and templates
- AJAX / REST API interaction
- Code organization, dependency injection, testability
- Comprehensive SPA and routing support
Why should we care?
- It's open source
- Actively developed by Google
- Google is paying devs to actively develop Angular
- Actively developed by open source community (on GitHub)
Angular.js #1?
- Angular.js appears to be winning the JavaScript framework battle (and for good reason)
- Lets see some evidence…
Why care? – GitHub Stats
Angular
Ember
Backbone
Knockout
Durandal
Stars
54,449
17,438
25,976
7,977
1,761
Watches
4,477
1,093
1,627
606
192
Forks
27,072
3,646
5,641
1,371
395
commit
8,329
13,969
3,337
1,484
1,189
release
185
232
30
38
6
contributors
1,562
638
292
62
70
Why care? – Google trends
AngularJS vs jQuery
- jQuery is a library meant for is DOM manipulation, animations and an AJAX wrapper. NOT an application framework
-
Pros
- None. Angular has built in ‘basic’ jQuery.
- If full-blown jQuery is added Angular will automatically use it. Generally full blown NOT needed.
-
Cons
- Horrible choice for creating dynamic UIs.
- Verbose code, hard to maintain, not organized
- Not MVVM or MVC
AngularJS vs BackBoneJS
-
Provides structure to web applications as well as model, view, templating, basic routing and RESTful interactions.
-
Pros
- Older and more mature, more people using it
-
Cons
-
Previous generation web app framework
- No MVVM w/o addons – use jQuery for DOM manip.
- No DI, not as easily testable
- Not a full-featured framework, meant to be ‘light’
- Extremely verbose for what you get
- Not actively developed
AngularJS vs Knockout.js
-
A library that provides MVVM data bindings using observables and dependency tracking
-
Pros
- Possibly more performant under some situations
-
Cons
- Complicated and error prone
- Dependency tracking, computeds get confusing
- “when complicated things break it's hard to figure out why”
- No POJO. Have to create “types” and ko.observable()s
- All it does is MVVM, not an app framework
- Testability, code organization etc. all potential issues
AngularJS vs Durandal.js
- Provides an app framework around Knockout
-
Pros
- Has a few features not baked into Angular (though readily available 3rd party from Angular community)
-
Cons
- Uses Knockout for data binding, suffers from same knockout issues
- Lacking many Angular.js features
- No one is using it
- Is mostly a 1 man show (Rob Eisenberg)
Why Angular can be good (2)
FLEXIBLE! As big or small as you want it to be- Two line jQuery replacement to a MASSIVE enterprise app
POJOs make life so easy. No ‘observables’, wrappers etc. Uses dirty checking for 2-way binding.- Fully embraces the dynamic nature of JavaScript
The community and popularity
DI, services, factories, providers offer flexibility and familiarity to traditionally server side paradigms
Directives offer DSL-like extension to HTML for your domain specific use cases
Scopes, although tricky, offer extreme flexibility
Why Angular can be good (2)
Efficient
Why I don't didn't like Angular
- Scopes are hard initially, but awesome
- Learning curve === eventual productivity
Code time! A simple example
<html>
<head>
<script src="https://code.angularjs.org/1.5.3/angular.min.js"></script>
</head>
<body ng-app="my-app">
<div ng-controller="exempleCtrl">
<label>Name:</label>
<input type="text" ng-model="yourName">
<hr>
<h1>Hello {{yourName}}!</h1>
</div>
</body>
</html>
Code time! A simple example
var app = angular.module("my-app", []);
app.controller("exempleCtrl", function($scope) {
$scope.yourName = "World"
});
Code time! A simple example
var app = angular.module("my-app", []);
app.controller("exempleCtrl", function($scope) {
$scope.yourName = "World";
var observeYourName = function(){
console.log('new value' + $scope.yourName);
};
$scope.$watch('yourName', observeYourName);
});
Simple example
- ng-app attribute causes Angular to scan children for recognized tokens
- Creates the “root scope” $rootScope
- $rootScope ≈ a ViewModel
( Angular sees three “directives”
- ({{yourName}}
- Evaluated against the current $rootScope and updates the DOM on any change. "1 – way bound"
- An input to be 2-way bound against $scope.yourName
- An input to be 2-way bound against $scope.yourName
What is Scope?
$scope.$watch("yourName", function(value) {
//update the DOM with the new value
});
What is a Directive?
- You can write your own directives for domain specific purposes (a ‘DSL’ for HTML). Ex:
<slideshow title="Shocked Cats">
<slide src="cat1.jpg"></slide>
<slide src="cat2.jpg"></slide>
…
</slideshow>
What is a Directive?
<input type="text" datepicker="" ng-model="aDate"/>
What is a Directive?
- HUGE amount of directives out there due to Angular's popularity. Rarely have to write your own other than domain specific directives
- EX: AngularUI
- Twitter bootstrap wrappers
- Select2
- Sorting
- Input masking
- Enhanced router
- Etc…
- Various wrappers for jQuery UI components (ex: datepicker)
Adding “message updates" with a Controller
What is a Controller?
- A controller is really just a fancy name for a "scope container" that prototypically inherits from its parent scope container.
- A controller can interact with $scope (the 'view model') which the view can also interact with.
Directives and Scope
- A controller is really a directive that is configured to prototypically inherit from its parent
- Directives can be configured for what type of scope they create and parent access they have
Use "AngularJS Batarang" plugin for Chrome to explore scopes
Services
- Software architectural components
- Services provide data and compute
- Exist across views
- Depend on other services
- AngularJS has 20+
-
$http – service to communicate with servers
-
$log – service to do pretty log messages
Server Communication
-
$http service
- Input config object
- Returns promise
- Communication is asynchronous
$http({method: ‘GET’, url: fetchUrl})
.success(function(data, status) {
// process the data here
})
.error(function(data, status) {
// error handling
});
Promises
-
Promises represent result of an action
- Particularly used with asynchronous actions
- They are either resolved or rejected
Dependency Injection (DI)
- DI is a software architectural pattern
- Separation of concerns
- Service creation independent from usage
- Good for
- Modular code
- Allows AngularJS to wire in correct order
- Supports substitution (for patching and testing)
DI and JavaScript Minification
- Services identified by parameter name
- Minification obfuscates the name
- Pass names as strings in array
angular.module('GoaleryServices')
.factory('StatusManager',
[