bundle your WHATEVER

webpack

é um

bundler de módulos estáticos

que cria um

gráfico de dependências

que mapeia todos os

módulos

que teu projeto precisa

módulos

qualquer coisa que seja importada e processada por um loader

  • ES2015 import
  • CommonJS require()
  • AMD define e require
  • @import dentro de arquivos de estilo (css, sass, etc)
  • Arquivos de imagens (url(...) ou <img src="...">)

core concepts

entry

indica qual módulo o webpack deve usar para começar a criar seu gráfico de dependências interno

module.exports = {
    // string » default: './src/index.js'
    entry: "./app/module.js",
    
    // Array<string>
    entry: ["./app/module_1.js", "./app/module_2.js"],
    
    // {[name: string]: string | Array<string>}
    entry: {
        a: "./app/module_a.js",
        b: ["./app/module_b1.js", "./app/module_b2.js"]
    }
}

output

diz para o webpack onde colocar os bundles criados e como nomear esses arquivos

const path = require("path");

module.exports = {
    output: {
        // string » default: "main.js"
        filename: "bundle.js",


        // string » default: "./dist"
        path: path.resolve(__dirname, "static"),
    }
}

loaders

por padrão, o webpack só entende arquivos

JavaScript e JSON

os loaders permitem que o webpack processe outros tipos de arquivos e os converta em módulos que a aplicação possa consumir

module.exports = {
    module: {
        // Array<{
        //     test: RegExp,
        //     use: string | object | Array<string | object>
        // }>
        rules: [
            {
                test: /\.jsx?$/,
                use: "babel-loader",
            },
            {
                use: [
                    "style-loader",
                    "css-loader",
                    "sass-loader"
                ]
                test: /\.(s[ca]|c)ss$/,
            },
            {
                test: /\.woff$/i,
                use: [
                    {
                        loader: "file-loader",
                        options: {
                            name: "[name].[ext]"
                        }
                    }
                ]
            }
        ]
    }
}

plugins

são utilizados para personalizar o processo de build com tarefas como otimização, extração de arquivos, injeção de variáveis de ambiente, etc.

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // Array<{ /* plugin */ }>
  plugins: [
    new HtmlWebpackPlugin({
      template: "./src/index.html",
      filename: "index.html",
      apiURL: process.env.API_URL || "localhost:3000"
    })
  ]
};

instalação e configuração

pacotes

dependências de desenvolvimento:

// package.json

{
  "scripts": {
    "build": "webpack --config webpack.config.js"
  }
}
projeto
├── dist
│   └── index.html
├── package.json
├── package-lock.json
├── src
│   └── index.js
├── webpack.config.js
└── node_modules
    └── infinito e além
<!DOCTYPE html>
<html>
  <head>
    <title>webpack - building a project</title>
  </head>
  <body>
    <script src="main.js"></script>
  </body>
</html>
dist/index.html
document.body.innerHTML = "webpack!";
src/index.js
const path = require("path");

module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "main.js",
    path: path.resolve(__dirname, "dist")
  }
};
webpack.config.js
{
  "name": "projeto",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "build": "./node_modules/.bin/webpack --config webpack.config.js"
  },
  "license": "MIT",
  "devDependencies": {
    "webpack": "^4.29.0",
    "webpack-cli": "^3.2.1"
  }
}
package.json

webpack: bundle your whatever

By Gabriel Prates

webpack: bundle your whatever

  • 1,200