Utilisation de diverses technologies contributives
Cette présentation utilise la librairie web Reveal.js pour une navigation interactive.
🔗 Accédez au contenu ici : ige511.com
📂 Code source & exemples :
Disponible sur GitLab.
🖨️ Impression ou sauvegarde PDF :
Pour une version imprimable, cliquez ici (Google Chrome recommandé).
💡 Astuce navigation :
Utilisez les flèches du clavier pour naviguer ou la touche ESC
pour afficher le plan.
Tout au long du cours, je ferai référence à Mozilla et W3schools, deux pionniers et sources historiques au niveau de la documentation du web et de ses standards.
Web 1.0: Connecte l'information - hyperliens, pages web, portails
Web 2.0: Connecte les gens - courriels, réseaux sociaux
Web 3.0: Connecte le savoir - Métadonnées (ex: JSON-LD), AI
Web 4.0: Connecte les concepts - Big Data, Assistants (ex: Google home)
Exemple de la patate en classe!
Hypertext Markup Language
Le HTML est un langage de balisage (et non de programmation) qui a été créé afin de concevoir des documents hypertextes (pages web). Il sert à structurer l'information de manière sémantique.
1991-1996
1997
1998
2014
Terme | Exemple |
---|---|
Balise | <p></p> |
Balise ouvrante | <p> |
Balise fermante | </p> |
Attribut | <p class="a"></p> |
doctypes | <!DOCTYPE html> |
<!DOCTYPE html>
<html>
<head>
<title>Titre de ma page</title>
</head>
<body>
<h1>Titre</h1>
<p>Paragraphe</p>
</body>
</html>
Balise | Description |
---|---|
<html> |
Noeud racine (parent) du document HTML |
<head> |
Décris la page, ses méta données et son contexte technique (ex: encodage) |
<body> |
Tout ce qui se trouve à l'intérieur sera présenté par le navigateur |
Balise | Exemple |
---|---|
Entête | <h1>texte</h1> ... <h6>texte</h6> |
Paragraphe | <p>texte</p> |
Image | <img src="url" /> |
Lien | <a href="url">texte</a> |
Conteneur | <div></div> |
<!-- Ordonnée -->
<ol>
<li>Item 1</li>
<li>Item 2</li>
</ol>
<!-- Avec boulets -->
<ul>
<li>Item A</li>
<li>Item B</li>
</ul>
<table>
<thead>
<tr>
<th>Colonne A</th>
<th>Colonne B</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>B</td>
</tr>
</tbody>
</table>
Colonne A | Colonne B |
---|---|
A | B |
<form>
<input type="text" placeholder="Nom" />
<input type="email" placeholder="Courriel" />
<input type="checkbox" />
<input type="radio" />
<select>
<option>A</option>
<option>B</option>
</select>
<input type="submit" placeholder="Envoyer" />
</form>
Balise | Description |
---|---|
<header>...</header> |
Entête du document ou section |
<footer>...</footer> |
Pied de page du document ou section |
<nav>...</nav> |
Navigation via des liens (menu) |
<section>...</section> |
Regroupement thématique de contenu |
<article>...</article> |
Contenu indépendant et autonome |
<aside>...</aside> |
Section en dehors du contenu principal |
Code
<nav></nav>
<header></header>
<section>
<header></header>
<article></article>
<article></article>
</section>
<aside></aside>
<footer></footer>
Résultat
Varie selon le CSS!
Cascade Style Sheets
Le CSS a été créé afin de séparer la mise en forme (style) du contenu (HTML). Ainsi, un peut faire du code plus modulaire et dynamique.
Le CSS peut se retrouver imbriqué directement dans le HTML, mais idéalement il se retrouve dans des fichiers externes.
1996: environ 50 propriétés
1998: environ 120 propriétés
2010-2016: environ 300 propriétés
À venir dans un navigateur près de chez vous!
Terme | Définition | Exemple |
---|---|---|
Propriété | Caractéristiques modifiables via le CSS (plus de 300) | color |
Valeur | Donnée associée à une propriété | #ff0000 |
Déclaration | Association d'un couple propriété - valeur | color: #ff0000; |
Sélecteur | Pointeur vers un ou des éléments HTML | .nom-pertinent |
Classe | Identifiant CSS donné à des balises HTML | nom-pertinent |
Bloc de déclaration | Regroupement de déclarations et sélecteurs |
HTML
<p style="color: #ff0000;">Hello world!</p>
<p class="nom-pertinent">Le CSS est incroyable!</p>
CSS
.nom-pertinent {
color: #00ff00;
}
Résultat
Hello world!
Le CSS est incroyable!
<!DOCTYPE html>
<html>
<head>
<title>Titre de ma page</title>
<link href="url" type="text/css" rel="stylesheet" />
</head>
<body>
<h1>Titre</h1>
<p class="nom-pertinent">Paragraphe</p>
</body>
</html>
/* Fichier externe, exemple style.css */
h1 {
font-size: 24px;
}
.nom-pertinent {
color: #00ff00;
}
<ul id="identifiant-unique" class="ma-liste">
<li class="mon-item">Item A</li>
<li>Item B</li>
</ul>
Sélecteur | Exemple |
---|---|
Classe | .mon-item |
ID | #mon-item |
Élément | li |
Combinaison | .ma-liste, .mon-item |
Relationnel | .ma-liste .mon-item |
... | Liste des sélecteurs CSS |
<ul class="ma-liste">
<li>
<a href="http://google.com">Item A</a>
</li>
</ul>
Sélecteur | Exemple |
---|---|
État | a:hover |
Position | .maliste:first-child |
Négation | :not(.maliste:first-child) |
... | Liste des pseudo-sélecteurs CSS |
10%
10px
#ff0000
rgba(255, 0, 0, 1)
Quel ordre a préséance en cas de multiples déclarations?
!important
(à proscrire)Voir les fichiers /exemples/theme-6/box.html
et /exemples/theme-6/box.css
inline
: sur la même ligne (width
et height
n'ont pas d'influence)block
: conteneur sur une nouvelle ligneinline-block
: conteneur sur la même ligneflex
: conteneur basé sur des colonneswidth
et height
Voir les fichiers /exemples/theme-6/depassements.html
static
(défaut): suit le flow normal de la pagerelative
: par rapport à sa position normalabsolute
: par rapport à son parent le plus haut qui est positionnéfixed
: par rapport à la fenêtre, ne défile pasLes positions relative
, absolute
et fixed
sont déclarées de pair avec les propriété top
, right
, bottom
et left
Voir les fichiers /exemples/theme-6/position.html
et /exemples/theme-6/position.css
Permets de définir des styles différents selon des critères (média, taille d'écran, etc.). Respecte l'ordre en cascade.
Exemple
/* Style général */
.nom-pertinent {
color: #00ff00;
}
@media screen and (min-width: 480px) {
/* Style pour petit écran */
.nom-pertinent {
color: #ff0000;
}
}
Système de grille et librairies populaires
À l'heure actuelle (2019), la majorité du trafic web provient des mobiles et tablettes. Il est difficile d'avancer un chiffre exact, mais selon ce que je constate on pourrait estimer à 75%.
Comment alors pouvons-nous créer des pages web qui s'adaptent à l'infinité de tailles d'écrans et de densités de pixels?
Une approche populaire est d'utiliser un système de grille contenant des colonnes et des rangées. Cette approche permet de définir le nombre de colonnes à afficher selon la taille de l'écran. Traditionnellement, ces systèmes ont 12 colonnes (pourquoi?).
Une des librairies les plus populaires est Bootstrap. L'approche retenue par cette librairie est basée sur l'ajout de balises HTML auxquelles on donne des classes CSS spécifiques.
Voici un exemple de deux colonnes avec Bootstrap:
<div class="container">
<div class="row">
<div class="col-6">
Colonne A
</div>
<div class="col-6">
Colonne B
</div>
</div>
</div>
Voir le fichier /exemples/theme-6/bootstrap.html
Comme vous pouvez le constater, le balisage devient lourd et parfois complexe.
De plus, si vous voulez changer l'ordre des éléments, vous devrez changer l'ordre du DOM*.
L'idée d'un système de grille est en soit très bonne. Par contre, le style devrait être géré via le CSS et non le HTML.
C'est pourquoi le nouveau standard de grille CSS est apparu. Cependant, ce standard n'est pas encore supporté par tous les navigateurs, mais la situation évolue très rapidement!
<section>
<article></article>
<aside></aside>
</section>
section {
display: grid;
grid-gap: 25px;
grid-template-columns: repeat(12, 1fr)
}
article {
grid-column: span 8;
}
aside {
grid-column: span 4;
}
JS pour les intimes
Langage de programmation multiparadigmes (prototype, objet, impératif et fonctionnel) à typage dynamique faible. Sa syntaxe est inspirée de Java.
Initialement conçu pour faire des pages web dynamiques, il est maintenant aussi utilisé du côté serveur (NodeJS) et DB (MongoDB, CouchDB, etc.). Son écosystème est l'un des plus larges au monde notamment grâce à NPM.
1995
1997
2009
2015+
Dans un fichier HTML
<!-- Directement dans la page -->
<script>
// Votre code JS
</script>
<!-- Fichier externe -->
<script src="script.js"></script>
Dans la console d'un navigateur (démonstration en classe)
Nécessite l'installation d'une librairie comme NodeJS. Dans un terminal:
# Exécution d'un fichier
node script.js
# Console interactive
node
Type | Exemple |
---|---|
Boolean | true false |
Number | 1 1.234 +Infinity Nan |
String | 'hello' "world" |
Null | null |
Undefined | undefined |
Symbol (ES6) | Symbol() Symbol(1) Symbol('foo') |
Opérateurs | Exemples |
---|---|
Affectation | a = 1; |
Mathématiques | 1 + 1 1 - 1 1 * 1 1 / 1 1 % 1 |
Logiques | true && false 1 < 2 !true |
typeof | typeof 1 |
Pour rappel, JavaScript est un langage à typage dynamique faible. Qu'est-ce que cela implique? Il suffit d'interpréter les expressions suivantes dans une console afin de constater les pièges potentiels.
'2' + 1
'2' - 1
1 + []
0 == '0'
true + true
3 > 2 > 1
null == undefined
typeof []
9999999999999999
0.1 + 0.2 == 0.3
0.1 + 0.2
// Variable à portée de fonction
var a = 1;
// Constante
const b = 2;
// ES6: variable à portée de bloc
let c = 3;
Un objet peut être vu comme une collection de propriétés grâce à laquelle on associe une clé à une valeur afin de former une structure de données complète.
var mon_objet = {
nom: 'John Doe',
age: 29,
est_actif: true,
adresse: {
ville: 'Sherbrooke'
},
amis: []
}
Une fois une objet déclaré, il vous possible de le modifier ou de l'utiliser de la manière suivante:
var mon_objet = {
nom: 'John Doe',
adresse: {
ville: 'Sherbrooke'
}
}
console.log(mon_objet.nom);
console.log(mon_objet.adresse.ville);
mon_objet.nom = 'Dr John Doe';
mon_objet.nouvelle_propriete = 123;
Les tableaux sont une collection de données vous permettant d'emmagasiner des valeurs dans un certain ordre et d'y accéder selon leur position (index).
var mon_tableau = [1, false, {nom: 'John'}];
console.log(mon_tableau[0]);
console.log(mon_tableau[3]);
mon_tableau.push(4);
En JavaScript, les fonctions peuvent être déclarées, affectées à des variables et même utilisées comme valeur ou argument.
function ma_fonction (a, b) {
return a < b;
}
var comparateur = ma_fonction;
var un_objet = {
a: 1,
b: 2,
comparer: function () {
return this.a < this.b;
}
}
Elles servent entre autres à déclarer de courtes fonctions utilitaires, car elles n'ont pas accès aux contextes comme this
.
let mots = [
'hello',
'world'
];
mots.map(mot => mot.length);
// Méthode for traditionnelle (comme en Java ou C)
for (var i = 0; i < 10; i++) {
console.log(i);
}
// Méthode while traditionnelle (comme en Java ou C)
var i = 0;
while (i < 10) {
console.log(i++);
}
// Méthode for in
var mots = ['hello', 'world'];
for (var i in mots) {
console.log(i);
console.log(mots[i]);
}
// Méthode for of
for (var mot of mots) {
console.log(mot);
}
var mots = ['hello', 'world'];
// Itération via l'index
for (var i in mots) {
console.log(i);
console.log(mots[i]);
}
// Itération via la valeur
for (var mot of mots) {
console.log(mot);
}
// Itération fonctionnelle
mots.forEach(mot => console.log(mot));
Voici quelques librairies populaires:
Le JavaScript permet d'ajouter du dynamisme sur une page web. Comment? Il a accès au DOM (éléments du HTML) et peut le modifier afin ajouter des éléments, modifier les classes CSS, changer l'ordre, etc.
Voici quelques exemples d'utilisations:
HTML
<button onclick="ma_fonction()">Ouvrir une alerte</button>
JS
function ma_fonction () {
alert('Hello world!');
}
Démonstration:
En classe
NPM et Yarn
Comment faire lorsque vous souhaitez utiliser une librairie ou du code d'une tierce partie?
Il vous faut gérer les versions, sources, droits d'auteur et idéalement utiliser un protocole standardisé.
Droits d'auteur, mise è jour
Disponibilité, révision du code
Bower, NPM et Yarn
NPM vous permet d'installer et partager du code ainsi que de contribuer à différents projets. Une fois installé, il est utilisable via un terminal. Il est configurable à partir du fichier package.json
et installe les paquets dans le dossier node_modules
.
NPM est une initiative géniale, mais pas parfaite. Il est difficile de gérer les versions avec exactitude entre les membres d'une même équipe. Yarn a donc été développé afin d'étendre les fonctionnalités de NPM. Il ajoute un fichier autogénéré yarn.lock
qui gèle les versions des paquets. Il offre également un système de cache avancé et performant.
Un petit exemple en classe afin d'initialiser un projet et installer quelques dépendances.
# Initialisation et installation des paquets
yarn
# Installation d'un paquet
yarn add bootstrap
# Installation d'un paquet pour développement
yarn add webpack --dev
# Supression d'un paquet
yarn remove webpack
Webpack, babel et SASS
De ces outils à partir du code du TP3.
Clients et serveurs
Hypertext Preprocessor
Jusqu'à présent, nous avons vu comment concevoir un site web à l'aide de HTML, CSS et JS.
Mais que se passe-t-il si vous voulez le rendre dynamique ou encore confier l'édition à un non développeur?
PHP et MySQL sont deux technologies largement utilisées dans l'univers du web. Les grands CMS comme Wordpress et Magento ainsi que des sites web connus comme Facebook utilisent ces technologies.
1994
1998
2004
2014
Type | Exemple |
---|---|
Boolean | true false |
Integer | 1 |
Float | 1.5 |
String | 'hello' "world" |
Null | null |
Array | array(1, 2, 3) |
Object |
Les variables sont à typage dynamique et leur nom doit débuter par $
.
<?php
$nom = "John";
$age = 25;
?>
Pour écrire du PHP, il suffit de créer un fichier avec l'extension .php
et de l'interpréter avec un serveur.
Le code PHP doit se trouver à l'intérieur des balises <?php
et ?>
. Sinon, tout le texte à l 'extérieur sera envoyé tel quel.
Code PHP
<p>test</p>
<?php
echo "<p>Hello world!</p>";
?>
Une fois interprété, le rendu HTML:
<p>test</p>
<p>Hello world!</p>
Code PHP
<?php
echo "<p>Hello world!</p>";
?>
Une fois interprété, le rendu HTML:
<p>Hello world!</p>
Code PHP
<?php
$est_connecte = false;
if ($est_connecte) {
echo "<a href="logout.php">Se déconnecter</a>";
} else {
echo "<a href="signin.php">Se connecter</a>";
}
?>
Une fois interprété, le rendu HTML:
<a href="signin.php">Se connecter</a>
Code PHP
<?php
echo "<ul>";
for ($i = 0; $i < 3; $i++) {
echo "<li>" . $i . "</li>";
}
echo "</ul>";
?>
Une fois interprété, le rendu HTML:
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
</ul>
Système de gestion de bases de données relationnelles très utilisé dans l'univers du web, notamment par les CMS comme Wordpress.
Racheté en 2008 par Sun Microsystems, une nouvelle version open source du nom de MariaDB a été créée.
Code PHP naïf utilisant MySQLi (pourquoi?)
$connexion = new mysqli('servername', 'username', 'password');
$sql = "SELECT id, nom FROM usagers";
$resultats = $connexion->query($sql);
while($usager = $resultats->fetch_assoc()) {
echo $usager["id"] . " - " . $usager["nom"];
}
$conn->close();