Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wellguimaraes/webpack-riot-sample
Um breve exemplo de uso do Webpack com Riot e Sass
https://github.com/wellguimaraes/webpack-riot-sample
Last synced: 12 days ago
JSON representation
Um breve exemplo de uso do Webpack com Riot e Sass
- Host: GitHub
- URL: https://github.com/wellguimaraes/webpack-riot-sample
- Owner: wellguimaraes
- Created: 2015-12-13T16:17:07.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2015-12-13T21:10:17.000Z (almost 9 years ago)
- Last Synced: 2024-04-13T04:57:52.548Z (7 months ago)
- Language: JavaScript
- Homepage:
- Size: 41 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Intro
De maneira simples, podemos definir o webpack como um empacotador de módulos (javascript e cia):
pega um asset aqui e outro ali e os transforma em algo que você possa rodar. Parece algo trivial,
mas pode ser trabalhoso. É aí que entra o webpack pra facilitar um pouco bastante a vida.
Se você já conhece/usa o Browserify, deve me perguntar por quê trocaria seis por meia dúzia.
Bom, embora o webpack seja “vendido” como um simples bundler, dois
pontos o tornam bem mais do que meia dúzia:
na maioria dos casos podemos abrir mão das ferramentas de automação de tarefas (Grunt/Gulp)
utilizando loaders, que fazem o pré-processamento de arquivos “diferentes”
(coffee, es6, ts, sass, less, jade, imagens, etc) e os tornam “utilizáveis” com um banal require;
em aplicações maiores, onde as coisas começam a ficar mais pesadas, o webpack
traz a possibilidade de carregar dependências sob demanda (code splitting), sem precisar
colocar tudo num grande e pesado bundle.
Quero ver na prática!
Para clarear o entendimento, vamos construir um exemplo de uso do webpack utilizando Riot (custom tags) e Sass.
A estrutura do nosso exemplo vai ficar assim:
webpack-sample/
app/
tags/
public/
bundles/
Com a estrutura pronta, crie o arquivo /public/main.html
<!DOCTYPE html>
<html>
<head>
<title>Webpack sample</title>
</head>
<body>
<my-app></my-app>
<script src="bundles/main/bundle.js"></script>
</body>
</html>
Você deve ter observado que foi usada a tag my-app, que é na verdade uma custom tag
que iremos criar mais a frente. Por enquanto, ela simplesmente não vai ter efeito.
Agora crie o arquivo app/main.js, que será o ponto de partida da aplicação.
document.write('deu certo!');
Agora que já temos alguns arquivos para experimentar o webpack, vamos aos preparativos.
Inicialize o npm no diretório raiz e instale os pacotes que iremos utilizar neste exemplo:
npm init
npm install -g webpack
npm install --save-dev webpack
npm install --save-dev riot riotjs-loader
npm install --save-dev css-loader style-loader node-sass sass-loader
O webpack pode ser utilizado sem um arquivo de configuração, mas vamos pular esse passo basicão e cair dentro
do jeito legal de usá-lo. Crie na raiz do projeto o arquivo webpack.config.js.
Vamos começar com a seguinte configuração:
module.exports = {
entry: {
main: './app/main.js'
},
output: {
path: __dirname + '/public/bundles',
filename: "[name]/bundle.js"
}
}
Criado o arquivo de configuração, podemos então rodar o webpack no diretório raiz com o comando:
webpack
Observe que o bundle foi gerado, e agora está no diretório /public/bundles/main, conforme havíamos configurado.
Ao abrir o arquivo /public/main.html agora, veremos um "deu certo" na tela, obra do main.js.
Bom, até aqui, nada de mais. Seguimos então para os passos mais legais. Criemos a tag my-app com o
arquivo /app/tags/my-app.tag:
Obs.: a sintaxe de custom tags do Riot é bem simples de entender, e para este exemplo, não é preciso
dominá-la. Mas caso queira conhecer melhor antes de continuar,
dê uma olhada no Riot guide.
<my-app>
<div>
Hello, I'm a custom tag.
<button onclick={toggleLipsum} class={active: lipsumVisible}>More info</button>
<lipsum if={lipsumVisible}></lipsum>
</div><style>{styles}</style>
<script>
// Aqui carregamos um arquivo SASS
this.styles = require('./my-app.scss');
this.lipsumVisible = false;this.toggleLipsum = function() {
this.lipsumVisible = !this.lipsumVisible;if (this.lipsumVisible)
// A tag <lipsum> será carregada sob demanda
// somente quando for necessária
require(['./lipsum.tag'], function() {
window.riot.mount("lipsum");
});
};
</script>
</my-app>
Observe que dentro da tag my-app utilizamos a custom tag lipsum e um botão cujo
clique executa a função toggleLipsum para habilitar/desabilitar a exibiçao da tag lipsum.
Sabendo que a tag lipsum não é necessária no momento em que a tag my-app é
renderizada (já que o comportamento padrão é ocultá-la), podemos optar por carregá-la somente quando houver
demanda. Para isso, como você pode observar no código acima, utilizamos require com um callback para
ser executado após a carga dos assets demandados.
Agora vamos criar as dependências que faltam. Ainda dentro do diretório /app/tags
crie os arquivos my-app.scss e lipsum.tag:
$default-color: blue;
$active-color: red;button {
background: $default-color;
border: 0;
color: white;
outline: none;&.active {
background: $active-color;
}
}
<lipsum>
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>
</lipsum>
Ahhh, e agora que temos as custom tags criadas, podemos substituir o conteúdo do /app/main.js
para renderizar as tags no devido lugar:
window.riot = require('riot');
require('./tags/my-app.tag');
window.riot.mount('*');
Se rodássemos o webpack novamente, não teríamos sucesso, já que ele ainda não sabe lidar com arquivos .scss
e .tag.
Para resolver, voltamos ao webpack.config.js:
var webpack = require('webpack');module.exports = {
entry: {
main: './app/main.js'
},
output: {
path: __dirname + '/public/bundles',
filename: '[name]/bundle.js',
chunkFilename: '[id]/bundle.js',
publicPath: '/public/bundles/'
},
plugins: [
new webpack.ProvidePlugin({ riot: 'riot' })
],
module: {
loaders: [
{ test: /\.tag$/, loader: 'riotjs-loader'},
{ test: /\.scss$/, loaders: ['style', 'css', 'sass'] }
]
}
};
As configurações cresceram um pouco, mas o entendimento continua fácil.
Adicionamos os pre-loaders para arquivos .tag e .scss, e como temos agora carga sob demanda, o
webpack criará bundles separados para estes assets, que serão nomeados conforme o
padrão definido por chunkFilename e estarão acessíveis a partir do diretório publicPath
(que poderia ser também uma URL apontando para um CDN).
Agora basta rodar o webpack novamente e abrir /public/main.html para ver tudo funcionando! ;)
Obs.: utilize a flag -p caso queira gerar o bundle minificado e --watch
para monitorar mudanças nas dependências e gerar novo bundle em caso de mudanças.
O código criado neste artigo está disponível no GitHub: https://github.com/wellguimaraes/webpack-sample