O que é ?

O webpack é um module bundler semelhante ao browserify que disponibiliza conteúdos estáticos por módulos e dependências, abraçando o conceito de code-splitting. Simplesmente agrupar a codificação em um único arquivo é uma prática ineficiente para grandes aplicações, especialmente quando você tem uma codificação que será utilizada em ponto específico, este problema pode ser resolvido com o module bundler.

Module Bundler

A "modularização" está presente no mundo JavaScript há algum tempo. O RequireJS possibilita o carregamento de módulo e arquivos no client-side e também é compatível com NodeJs. O próprio NodeJs provê módulos no server-side. Já o Browserify garante que seus módulos NodeJs também rodem no navegador(client-side).

O webpack possui uma flexibilidade no carregamento de código que pode ser no padrão CommonJs, AMD ou ES6.

A grande sacada do webpack é foco no front-end você poderá criar bundles e suas dependências para JavaScript e Css.

Pré-requisitos

Se você não está familiarizado com o mundo NodeJs veja:

Vamos instalar?

Primeiramente instale o webpack como módulo global e depois instale como uma dependência de desenvolvimento.

Digite comando abaixo em sua linha de comando favorita:

sudo npm install webpack -g
npm install webpack --save-dev

Loaders

Que tal desenvolver aplicações usando todo o poder do EcmaScript 6 - ES6 ou TypeScript, criar folhas de estilo com Sass ou Less, codificar seu HTML com Jade ou Mustache. Este são os tipos de problema que o webpack resolve com diversos loaders, onde você poderá definir quais serão os padrões do seu projeto.

TypeScript na cabeça

O TypeScript possibilita uma escrita de JavaScript fortemente "tipada", compilando e mantendo a compatibilidade para qualquer navegador ou host compatível com o ES3, isso mesmo NodeJs e aquele seu navegador favorito Internet Explorer 8, rs.

Will Dancing

Primeiramente instale o Typescript.

Será instalado a versão 1.6.2 por questões de compatibilidade com o loader TypeScript do webpack

sudo npm install [email protected] -g

Existem algumas configurações necessárias para o intellisense do TypeScript.

O arquivo tsconfig.json configura o intellisense para o Editor de Códigos, no meu caso utilizo o Visual Studio Code, crie o arquivo abaixo na pasta raiz do projeto.

  • tsconfig.json

Clique aqui para maiores informações relacionadas as configurações deste arquivo.

{
  "compilerOptions": {
    "target": "es5",
    "noImplicitAny": false,
    "removeComments": true,
    "sourceMap": true,
    "module": "commonjs",
    "experimentalDecorators": true
  },
  "exclude": [
    "node_modules",
    "dist",
    "dev",
    "reports"
  ]
}

Além do intellisense, vamos configurar o tsd que torna qualquer framework JavaScript fortemente "tipado", Yes, TypeScript Rocks!

Será necessário instalar o tsd.

sudo npm install tsd -g

Pronto para inicializar, digite o comando abaixo na pasta do projeto, será criado o arquivo de configuração tsd.json e o arquivo de importação do "tsd" o typings/tsd.d.ts.

tsd init

Para este artigo iremos utilizar o jQuery, será necessário instalar o tsd do jQuery, que possibilitará o intellisense no editor e uma validação semântica.

tsd install jquery

A próxima etapa será instalar as dependências do projetos.

npm install webpack --save-dev
npm install ts-loader --save-dev
npm install jquery --save

Iniciando

Crie um arquivo chamado webpack.config.js e adicione o conteúdo abaixo.

var webpack = require('webpack'),
    path = require('path');

module.exports = {
    //Modo debug para facilitar nosso trabalho
    debug: true,
    //Define o arquivo de entrada da aplicação (main())
    entry: {
        main: './src/app.ts'
    },
    //Cria arquivos source-map para debug
    devtool: 'source-map',
    //Indica os arquivos que serão resolvidos como módulo
    resolve: {
        extensions: ['', '.webpack.js', '.web.js', '.ts', '.js']
    },
    //Arquivo de saída (bundle.js) na pasta dist
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
    },
    module: {
        //Define os loaders que serão utilizados, neste caso o ts-load (TypeScript)
        loaders: [
            { test: /\.ts?$/, loader: 'ts-loader' }
        ]
    }
};

Codificando

Vamos criar o arquivo ninjaTurtle.ts que será o módulo consumido pela aplicação.

  • ninjaTurtle.ts
import $ = require('jquery');

export interface INinjaTurtle {
    name: string;
    greeter(): void;
}

export class NinjaTurtle implements INinjaTurtle {
    public name: string;

    constructor(name: string) {
        this.name = name;
    }

    greeter() {
        return "Cowabunga, ".concat(this.name);
    }

    getImage() {
        return './images/'.concat(this.name.toLowerCase(), '.jpg');
    }
}

export class NinjasTurtles {
    private static turtles = ['Michelangelo', 'Donatello', 'Raphael', 'Leonardo'];
    private static index: number = 0;

    static start() {
        if (this.index > this.turtles.length - 1) {
            this.index = 0;
        }

        let ninjaTurtle = new NinjaTurtle(this.turtles[this.index]);

        $('#message').html(ninjaTurtle.greeter());
        $('#picture').attr("src", ninjaTurtle.getImage());

        this.index++;
    }
}

Agora crie o arquivo de entrada chamado app.ts.

  • app.ts
import {NinjaTurtle, INinjaTurtle, NinjasTurtles} from "./ninjaTurtle";
import $ = require('jquery');

$(() => {
    NinjasTurtles.start();
    setInterval(() => NinjasTurtles.start(), 5000);
});

O projeto utiliza algumas imagens, baixe o conteúdo no github.

Código fonte

Compilando

Existem alguns modos de compilação debug , produção e watcher.

  • Debug
webpack
  • Produção
webpack -p
  • Rodando com o "watcher"

O webpack possibilita que a cada modificação de código ocorra uma recompilação, porém esta funcionalidade fica mais interessante utilizando o browsersync, que recarrega o navegador também, este é um recurso muito conhecido por desenvolvedores do Meteor.

webpack --watch

Este será o resultado da compilação.

Compilação webpack

Abra a página index.html gerada na pasta dist e veja a aplicação.

Aplicação webpack

Conclusão

Esta breve introdução ao webpack mostrou o poder deste maravilhoso module bundler com automatizador de tarefas, que tem seu espaço reservado para compilação client-side. O webpack não subsistiu o Gulp ou Grunt, você pode até mesmo combiná-los com outros módulos que explicarei futuramente.

Até a próxima!