Webpack

M2 MIAGE NDTP

Oussama Nehouchi

Andy Rabadan

Pourquoi Webpack ?

  • Disposer les ressources statiques en modules
  • Intégrer des bibliothèques facilement en tant que modules
  • Séparer le build en plusieurs morceaux
  • Adapté pour les gros projets

Task runner

  • Modifier des configurations
  • Définir des étapes de se qu'ils doivent faire et comment le faire
  • Instable

Un exemple

// Concatenate JS Files
gulp.task('scripts', function() {
    return gulp.src('src/js/*.js')
      .pipe(concat('main.js'))
      .pipe(gulp.dest('dist/js'));
});

// Build CSS from SASS
gulp.task('sass', function() {
    return sass('src/scss/style.scss', {style: 'compressed'})
        .pipe(rename({suffix: '.min'}))
        .pipe(gulp.dest('dist/css'));
});
gulp.task('default', ['scripts', 'sass']);

Webpack

  • N'est pas un task runner
  • Analyse les dépendances
  • Génère des fichiers statiques

Fonctionnement

Principaux concepts

  • Entry points
    • Fichiers d'entrés à charger
  • Loaders
    • Injection de comportements supplémentaires (autre que du JS)
  • Plugins
    • S'injecte dans le processus de construction

Configuration

Ligne de commande

> webpack <entry> [<entry>] <output>

Fichier de configuration webpack.config.js

module.exports = {
    // configuration
};

Exemple

var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var extractCSS = new ExtractTextPlugin('bundle.css');
var path = require('path');
var src = path.join(__dirname, 'src');

module.exports = {
    context: src,
    entry: {
        app: ['./css/sky.css', './css/theme.css', './css/fonts.css', './app.js']
    },
    output: {
	path: "dist",
	filename: "bundle.js",
	publicPath: "/"
    },
    module: {
	loaders: [
	    {
	        test: /\.css$/,
		loader: extractCSS.extract("css")
	    }
        ]
    },
    plugins: [
	extractCSS,
	new webpack.optimize.UglifyJsPlugin({
	    comment: false
	}),
	new webpack.HotModuleReplacementPlugin()
    ]
};

Web + Pack

module.exports = "It works !";
var Reveal = require("reveal.js");
var chaine = require("./chaine.js");
require("reveal.js/css/reveal.css");

Reveal.initialize({...});
console.log(chaine);

chaine.js

app.js

reveal.js

sky.css

theme.css

fonts.css

bundle.css

bundle.js

reveal.css

<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        
        <link rel="stylesheet" href="bundle.css">
	<title>WebPack</title>
    </head>
    <body class="theme-font-montserrat theme-color-blue-yellow">
	<div class="reveal">
            ...
	</div>
	<script src="bundle.js"></script>
    </body>
</html>

Utilisations des packs

Dépendances

  • Fonctionne très bien avec des modules NPM
    • Installation du module
    • Utiliser le module dans l'application
> npm install --save reveal
var Reveal = require("reveal.js");

Reveal.initialize({
    ...
});
  • Intégration facile avec Bower

Webpack server

devServer: {
    contentBase: src,
    hot: true,
    inline: true,
    progress: true,
    colors: true
}
> npm install -g webpack-dev-server
  • Chargement à chaud
  • Chargement en mémoire des fichiers build

webpack.config.js

Des questions ?

Webpack presentation

By arabadan

Webpack presentation

  • 905