edge
Mais em rubyonrails.org: Mais Ruby on Rails

Webpacker

Este guia mostrará como instalar e usar o Webpacker para empacotar JavaScript, CSS e outros ativos para o lado do cliente da sua aplicação Rails, mas observe que o Webpacker foi descontinuado.

Após ler este guia, você saberá:

1 O que é o Webpacker?

O Webpacker é um wrapper do Rails em torno do sistema de compilação webpack que fornece uma configuração webpack padrão e valores padrão razoáveis.

1.1 O que é o Webpack?

O objetivo do webpack, ou qualquer sistema de compilação de front-end, é permitir que você escreva seu código de front-end de uma maneira conveniente para os desenvolvedores e, em seguida, empacote esse código de uma maneira conveniente para os navegadores. Com o webpack, você pode gerenciar JavaScript, CSS e ativos estáticos como imagens ou fontes. O webpack permitirá que você escreva seu código, referencie outro código em sua aplicação, transforme seu código e combine seu código em pacotes facilmente baixáveis.

Consulte a documentação do webpack para obter informações.

1.2 Como o Webpacker é diferente do Sprockets?

O Rails também vem com o Sprockets, uma ferramenta de empacotamento de ativos cujas funcionalidades se sobrepõem ao Webpacker. Ambas as ferramentas irão compilar seu JavaScript em arquivos compatíveis com o navegador e também irão minificá-los e adicionar um fingerprint na produção. Em um ambiente de desenvolvimento, o Sprockets e o Webpacker permitem que você altere os arquivos incrementalmente.

O Sprockets, que foi projetado para ser usado com o Rails, é um pouco mais simples de integrar. Em particular, o código pode ser adicionado ao Sprockets por meio de uma gem Ruby. No entanto, o webpack é melhor na integração com ferramentas JavaScript mais atuais e pacotes NPM e permite uma gama mais ampla de integração. Novos aplicativos Rails são configurados para usar o webpack para JavaScript e o Sprockets para CSS, embora seja possível usar o webpack para CSS.

Você deve escolher o Webpacker em vez do Sprockets em um novo projeto se quiser usar pacotes NPM e/ou ter acesso às funcionalidades e ferramentas JavaScript mais atuais. Você deve escolher o Sprockets em vez do Webpacker para aplicativos legados em que a migração pode ser custosa, se quiser integrar usando Gems ou se tiver uma quantidade muito pequena de código para empacotar.

Se você está familiarizado com o Sprockets, o guia a seguir pode lhe dar uma ideia de como traduzir. Observe que cada ferramenta tem uma estrutura ligeiramente diferente, e os conceitos não se mapeiam diretamente um para o outro.

Tarefa Sprockets Webpacker
Anexar JavaScript javascript_include_tag javascript_pack_tag
Anexar CSS stylesheet_link_tag stylesheet_pack_tag
Link para uma imagem image_url image_pack_tag
Link para um ativo asset_url asset_pack_tag
Requerer um script //= require import or require

2 Instalando o Webpacker

Para usar o Webpacker, você deve instalar o gerenciador de pacotes Yarn, versão 1.x ou superior, e também deve ter o Node.js instalado, versão 10.13.0 ou superior.

NOTA: O Webpacker depende do NPM e do Yarn. O NPM, registro do gerenciador de pacotes do Node, é o repositório principal para publicação e download de projetos JavaScript de código aberto, tanto para o Node.js quanto para navegadores. É análogo ao rubygems.org para gems Ruby. O Yarn é uma utilidade de linha de comando que permite a instalação e gerenciamento de dependências JavaScript, assim como o Bundler faz para Ruby.

Para incluir o Webpacker em um novo projeto, adicione --webpack ao comando rails new. Para adicionar o Webpacker a um projeto existente, adicione a gem webpacker ao Gemfile do projeto, execute bundle install e, em seguida, execute bin/rails webpacker:install.

A instalação do Webpacker cria os seguintes arquivos locais:

Arquivo Localização Explicação
Pasta JavaScript app/javascript Um local para o seu código de front-end
Configuração do Webpacker config/webpacker.yml Configura o gem Webpacker
Configuração do Babel babel.config.js Configuração para o compilador JavaScript Babel
Configuração do PostCSS postcss.config.js Configuração para o pós-processador CSS PostCSS
Browserlist .browserslistrc Browserlist gerencia a configuração dos navegadores alvo

A instalação também chama o gerenciador de pacotes yarn, cria um arquivo package.json com um conjunto básico de pacotes listados e usa o Yarn para instalar essas dependências.

3 Uso

3.1 Usando o Webpacker para JavaScript

Com o Webpacker instalado, qualquer arquivo JavaScript no diretório app/javascript/packs será compilado para seu próprio arquivo de pacote por padrão. Então, se você tiver um arquivo chamado app/javascript/packs/application.js, o Webpacker criará um pacote chamado application e você pode adicioná-lo à sua aplicação Rails com o código <%= javascript_pack_tag "application" %>. Com isso, no desenvolvimento, o Rails recompilará o arquivo application.js toda vez que ele for alterado e você carregar uma página que usa esse pacote. Normalmente, o arquivo no diretório packs será um manifesto que carrega principalmente outros arquivos, mas também pode ter código JavaScript arbitrário.

O pacote padrão criado para você pelo Webpacker será vinculado aos pacotes JavaScript padrão do Rails se eles tiverem sido incluídos no projeto:

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
Turbolinks.start()
ActiveStorage.start()

Você precisará incluir um pacote que requer esses pacotes para usá-los em sua aplicação Rails.

É importante observar que apenas os arquivos de entrada do webpack devem ser colocados no diretório app/javascript/packs; o Webpack criará um gráfico de dependências separado para cada ponto de entrada, portanto, um grande número de pacotes aumentará a sobrecarga de compilação. O restante do código-fonte de seus ativos deve estar fora deste diretório, embora o Webpacker não imponha restrições ou faça sugestões sobre como estruturar seu código-fonte. Aqui está um exemplo:

app/javascript:
  ├── packs:
  │   # apenas arquivos de entrada do webpack aqui
  │   └── application.js
  │   └── application.css
  └── src:
  │   └── my_component.js
  └── stylesheets:
  │   └── my_styles.css
  └── images:
      └── logo.svg

Normalmente, o próprio arquivo de pacote é principalmente um manifesto que usa import ou require para carregar os arquivos necessários e também pode fazer alguma inicialização.

Se você quiser alterar esses diretórios, poderá ajustar o source_path (padrão app/javascript) e o source_entry_path (padrão packs) no arquivo config/webpacker.yml.

Nos arquivos de origem, as declarações import são resolvidas em relação ao arquivo que está importando, portanto, import Bar from "./foo" encontra um arquivo foo.js no mesmo diretório do arquivo atual, enquanto import Bar from "../src/foo" encontra um arquivo em um diretório irmão chamado src.

3.2 Usando o Webpacker para CSS

Por padrão, o Webpacker suporta CSS e SCSS usando o processador PostCSS.

Para incluir código CSS em seus pacotes, primeiro inclua seus arquivos CSS em seu arquivo de pacote de nível superior como se fosse um arquivo JavaScript. Portanto, se seu manifesto de nível superior CSS estiver em app/javascript/styles/styles.scss, você pode importá-lo com import styles/styles. Isso diz ao webpack para incluir seu arquivo CSS no download. Para realmente carregá-lo na página, inclua <%= stylesheet_pack_tag "application" %> na visualização, onde o application é o mesmo nome do pacote que você estava usando.

Se você estiver usando um framework CSS, poderá adicioná-lo ao Webpacker seguindo as instruções para carregar o framework como um módulo NPM usando o yarn, normalmente yarn add <framework>. O framework deve ter instruções sobre como importá-lo em um arquivo CSS ou SCSS.

3.3 Usando o Webpacker para Ativos Estáticos

A configuração padrão do Webpacker configuration deve funcionar sem problemas para ativos estáticos. A configuração inclui várias extensões de formato de arquivo de imagem e fonte, permitindo que o webpack os inclua no arquivo manifest.json gerado.

Com o webpack, ativos estáticos podem ser importados diretamente em arquivos JavaScript. O valor importado representa a URL do ativo. Por exemplo:

import myImageUrl from '../images/my-image.jpg'

// ...
let myImage = new Image();
myImage.src = myImageUrl;
myImage.alt = "Eu sou uma imagem empacotada pelo Webpacker";
document.body.appendChild(myImage);

Se você precisar referenciar ativos estáticos do Webpacker a partir de uma visualização Rails, os ativos precisam ser explicitamente requeridos dos arquivos JavaScript empacotados pelo Webpacker. Ao contrário do Sprockets, o Webpacker não importa seus ativos estáticos por padrão. O arquivo app/javascript/packs/application.js padrão possui um modelo para importar arquivos de um determinado diretório, que você pode descomentar para cada diretório em que deseja ter arquivos estáticos. Os diretórios são relativos a app/javascript. O modelo usa o diretório images, mas você pode usar qualquer coisa em app/javascript:

const images = require.context("../images", true)
const imagePath = name => images(name, true)

Os ativos estáticos serão gerados em um diretório em public/packs/media. Por exemplo, uma imagem localizada e importada em app/javascript/images/my-image.jpg será gerada em public/packs/media/images/my-image-abcd1234.jpg. Para renderizar uma tag de imagem para essa imagem em uma visualização Rails, use image_pack_tag 'media/images/my-image.jpg.

Os helpers do Webpacker para ativos estáticos no ActionView correspondem aos helpers do pipeline de ativos de acordo com a seguinte tabela: |Helper do ActionView | Helper do Webpacker | |------------------|------------------| |favicon_link_tag |favicon_pack_tag | |image_tag |image_pack_tag |

Além disso, o helper genérico asset_pack_path recebe a localização local de um arquivo e retorna sua localização do Webpacker para uso em visualizações do Rails.

Você também pode acessar a imagem referenciando diretamente o arquivo de um arquivo CSS em app/javascript.

3.4 Webpacker em Rails Engines

A partir da versão 6 do Webpacker, o Webpacker não é "consciente de engines", o que significa que o Webpacker não possui paridade de recursos com o Sprockets quando se trata de uso em Rails engines.

Os autores de gems de Rails engines que desejam oferecer suporte a consumidores que usam o Webpacker são incentivados a distribuir ativos de frontend como um pacote NPM, além da própria gem, e fornecer instruções (ou um instalador) para demonstrar como os aplicativos host devem integrar. Um bom exemplo dessa abordagem é o Alchemy CMS.

3.5 Hot Module Replacement (HMR)

O Webpacker suporta HMR com o webpack-dev-server por padrão, e você pode ativá-lo definindo a opção dev_server/hmr dentro do arquivo webpacker.yml.

Confira a documentação do webpack sobre o DevServer para obter mais informações.

Para oferecer suporte ao HMR com o React, você precisará adicionar o react-hot-loader. Confira o guia Getting Started do React Hot Loader.

Não se esqueça de desativar o HMR se você não estiver executando o webpack-dev-server; caso contrário, você receberá um "erro não encontrado" para folhas de estilo.

4 Webpacker em Diferentes Ambientes

O Webpacker possui três ambientes por padrão: development, test e production. Você pode adicionar configurações de ambiente adicionais no arquivo webpacker.yml e definir padrões diferentes para cada ambiente. O Webpacker também carregará o arquivo config/webpack/<environment>.js para configuração adicional do ambiente.

5 Executando o Webpacker em Desenvolvimento

O Webpacker é fornecido com dois arquivos binstub para execução em desenvolvimento: ./bin/webpack e ./bin/webpack-dev-server. Ambos são wrappers finos em torno dos executáveis webpack.js e webpack-dev-server.js padrão e garantem que os arquivos de configuração corretos e as variáveis de ambiente sejam carregados com base no seu ambiente.

Por padrão, o Webpacker compila automaticamente sob demanda no desenvolvimento quando uma página do Rails é carregada. Isso significa que você não precisa executar processos separados e os erros de compilação serão registrados no log padrão do Rails. Você pode alterar isso alterando para compile: false no arquivo config/webpacker.yml. Executar bin/webpack forçará a compilação de seus pacotes.

Se você deseja usar o carregamento de código ao vivo ou tem JavaScript suficiente para que a compilação sob demanda seja muito lenta, será necessário executar ./bin/webpack-dev-server ou ruby ./bin/webpack-dev-server. Esse processo observará as alterações nos arquivos app/javascript/packs/*.js e recompilará e recarregará automaticamente o navegador para corresponder.

Usuários do Windows precisarão executar esses comandos em um terminal separado do bundle exec rails server.

Depois de iniciar este servidor de desenvolvimento, o Webpacker começará automaticamente a encaminhar todas as solicitações de ativos do webpack para este servidor. Quando você parar o servidor, ele voltará à compilação sob demanda.

A Documentação do Webpacker fornece informações sobre as variáveis de ambiente que você pode usar para controlar o webpack-dev-server. Consulte as notas adicionais na documentação do rails/webpacker sobre o uso do webpack-dev-server.

5.1 Implantação do Webpacker

O Webpacker adiciona uma tarefa webpacker:compile à tarefa bin/rails assets:precompile, portanto, qualquer pipeline de implantação existente que estava usando assets:precompile deve funcionar. A tarefa de compilação irá compilar os pacotes e colocá-los em public/packs.

6 Documentação Adicional

Para obter mais informações sobre tópicos avançados, como usar o Webpacker com frameworks populares, consulte a Documentação do Webpacker.

Feedback

Você é incentivado a ajudar a melhorar a qualidade deste guia.

Por favor, contribua se encontrar algum erro de digitação ou factual. Para começar, você pode ler nossa contribuição à documentação seção.

Você também pode encontrar conteúdo incompleto ou desatualizado. Por favor, adicione qualquer documentação ausente para o principal. Certifique-se de verificar Guias Edge primeiro para verificar se os problemas já foram corrigidos ou não no branch principal. Verifique as Diretrizes dos Guias do Ruby on Rails para estilo e convenções.

Se por algum motivo você encontrar algo para corrigir, mas não puder corrigi-lo você mesmo, por favor abra uma issue.

E por último, mas não menos importante, qualquer tipo de discussão sobre a documentação do Ruby on Rails é muito bem-vinda no Fórum oficial do Ruby on Rails.