edge
Plus sur rubyonrails.org: Plus de Ruby on Rails

Webpacker

Ce guide vous montrera comment installer et utiliser Webpacker pour regrouper JavaScript, CSS et autres ressources pour le côté client de votre application Rails, mais veuillez noter que Webpacker a été retiré.

Après avoir lu ce guide, vous saurez :

1 Qu'est-ce que Webpacker ?

Webpacker est un wrapper Rails autour du système de construction webpack qui fournit une configuration webpack standard et des valeurs par défaut raisonnables.

1.1 Qu'est-ce que Webpack ?

L'objectif de webpack, ou de tout système de construction front-end, est de vous permettre d'écrire votre code front-end de manière pratique pour les développeurs, puis de regrouper ce code de manière pratique pour les navigateurs. Avec webpack, vous pouvez gérer JavaScript, CSS et des ressources statiques telles que des images ou des polices. Webpack vous permettra d'écrire votre code, de référencer d'autres codes de votre application, de transformer votre code et de combiner votre code en packs facilement téléchargeables.

Consultez la documentation webpack pour plus d'informations.

1.2 Comment Webpacker est-il différent de Sprockets ?

Rails est également livré avec Sprockets, un outil d'emballage des ressources dont les fonctionnalités se chevauchent avec celles de Webpacker. Les deux outils compileront votre JavaScript en fichiers compatibles avec les navigateurs et les minimiseront et les empreinteront également en production. Dans un environnement de développement, Sprockets et Webpacker vous permettent de modifier progressivement les fichiers.

Sprockets, qui a été conçu pour être utilisé avec Rails, est un peu plus simple à intégrer. En particulier, du code peut être ajouté à Sprockets via une gemme Ruby. Cependant, webpack est meilleur pour s'intégrer avec des outils JavaScript plus récents et des packages NPM, et permet une plus grande variété d'intégration. Les nouvelles applications Rails sont configurées pour utiliser webpack pour JavaScript et Sprockets pour CSS, bien que vous puissiez également utiliser webpack pour le CSS.

Vous devriez choisir Webpacker plutôt que Sprockets pour un nouveau projet si vous souhaitez utiliser des packages NPM et/ou si vous souhaitez accéder aux fonctionnalités et outils JavaScript les plus récents. Vous devriez choisir Sprockets plutôt que Webpacker pour les applications existantes où la migration pourrait être coûteuse, si vous souhaitez vous intégrer à l'aide de gemmes, ou si vous avez une très petite quantité de code à regrouper.

Si vous êtes familier avec Sprockets, le guide suivant pourrait vous donner une idée de la traduction. Veuillez noter que chaque outil a une structure légèrement différente, et les concepts ne se correspondent pas directement.

Tâche Sprockets Webpacker
Attacher JavaScript javascript_include_tag javascript_pack_tag
Attacher CSS stylesheet_link_tag stylesheet_pack_tag
Lier à une image image_url image_pack_tag
Lier à une ressource asset_url asset_pack_tag
Exiger un script //= require import or require

2 Installation de Webpacker

Pour utiliser Webpacker, vous devez installer le gestionnaire de paquets Yarn, version 1.x ou supérieure, et vous devez avoir Node.js installé, version 10.13.0 et supérieure.

REMARQUE : Webpacker dépend de NPM et Yarn. NPM, le registre du gestionnaire de paquets Node, est le principal référentiel pour la publication et le téléchargement de projets JavaScript open source, à la fois pour Node.js et les navigateurs. Il est analogue à rubygems.org pour les gemmes Ruby. Yarn est une utilité en ligne de commande qui permet l'installation et la gestion des dépendances JavaScript, tout comme Bundler le fait pour Ruby.

Pour inclure Webpacker dans un nouveau projet, ajoutez --webpack à la commande rails new. Pour ajouter Webpacker à un projet existant, ajoutez la gemme webpacker au fichier Gemfile du projet, exécutez bundle install, puis exécutez bin/rails webpacker:install.

L'installation de Webpacker crée les fichiers locaux suivants :

Fichier Emplacement Explication
Dossier JavaScript app/javascript Un endroit pour votre code source front-end
Configuration Webpacker config/webpacker.yml Configurer la gemme Webpacker
Configuration Babel babel.config.js Configuration pour le compilateur JavaScript Babel
Configuration PostCSS postcss.config.js Configuration pour le post-processeur CSS PostCSS
Browserlist .browserslistrc Browserlist gère la configuration des navigateurs cibles

L'installation appelle également le gestionnaire de paquets yarn, crée un fichier package.json avec un ensemble de packages de base répertoriés, et utilise Yarn pour installer ces dépendances.

3 Utilisation

3.1 Utilisation de Webpacker pour JavaScript

Avec Webpacker installé, tout fichier JavaScript dans le répertoire app/javascript/packs sera compilé par défaut dans son propre fichier pack. Donc, si vous avez un fichier appelé app/javascript/packs/application.js, Webpacker créera un pack appelé application, et vous pouvez l'ajouter à votre application Rails avec le code <%= javascript_pack_tag "application" %>. Avec cela en place, en développement, Rails recompilera le fichier application.js à chaque fois qu'il change, et vous chargez une page qui utilise ce pack. En général, le fichier dans le répertoire réel packs sera un manifeste qui charge principalement d'autres fichiers, mais il peut également contenir du code JavaScript arbitraire.

Le pack par défaut créé pour vous par Webpacker liera les packages JavaScript par défaut de Rails s'ils ont été inclus dans le projet:

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

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

Vous devrez inclure un pack qui nécessite ces packages pour les utiliser dans votre application Rails.

Il est important de noter que seuls les fichiers d'entrée webpack doivent être placés dans le répertoire app/javascript/packs; Webpack créera un graphe de dépendances distinct pour chaque point d'entrée, donc un grand nombre de packs augmentera les frais généraux de compilation. Le reste de votre code source d'actifs doit vivre en dehors de ce répertoire, bien que Webpacker ne place aucune restriction ou ne fasse aucune suggestion sur la façon de structurer votre code source. Voici un exemple:

app/javascript:
  ├── packs:
  │   # seulement les fichiers d'entrée webpack ici
  │   └── application.js
  │   └── application.css
  └── src:
  │   └── my_component.js
  └── stylesheets:
  │   └── my_styles.css
  └── images:
      └── logo.svg

Généralement, le fichier pack lui-même est principalement un manifeste qui utilise import ou require pour charger les fichiers nécessaires et peut également effectuer une certaine initialisation.

Si vous souhaitez modifier ces répertoires, vous pouvez ajuster source_path (par défaut app/javascript) et source_entry_path (par défaut packs) dans le fichier config/webpacker.yml.

Dans les fichiers source, les instructions import sont résolues par rapport au fichier effectuant l'importation, donc import Bar from "./foo" trouve un fichier foo.js dans le même répertoire que le fichier actuel, tandis que import Bar from "../src/foo" trouve un fichier dans un répertoire frère nommé src.

3.2 Utilisation de Webpacker pour CSS

Par défaut, Webpacker prend en charge CSS et SCSS en utilisant le processeur PostCSS.

Pour inclure du code CSS dans vos packs, incluez d'abord vos fichiers CSS dans votre fichier de pack de niveau supérieur comme s'il s'agissait d'un fichier JavaScript. Donc, si votre manifeste CSS de niveau supérieur est dans app/javascript/styles/styles.scss, vous pouvez l'importer avec import styles/styles. Cela indique à webpack d'inclure votre fichier CSS dans le téléchargement. Pour le charger réellement dans la page, incluez <%= stylesheet_pack_tag "application" %> dans la vue, où application est le même nom de pack que vous utilisiez.

Si vous utilisez un framework CSS, vous pouvez l'ajouter à Webpacker en suivant les instructions pour charger le framework en tant que module NPM en utilisant yarn, généralement yarn add <framework>. Le framework devrait avoir des instructions sur la façon de l'importer dans un fichier CSS ou SCSS.

3.3 Utilisation de Webpacker pour les ressources statiques

La configuration par défaut de Webpacker configuration devrait fonctionner avec les ressources statiques. La configuration inclut plusieurs extensions de formats de fichiers d'images et de polices, permettant à webpack de les inclure dans le fichier manifest.json généré.

Avec webpack, les ressources statiques peuvent être importées directement dans les fichiers JavaScript. La valeur importée représente l'URL de la ressource. Par exemple:

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

// ...
let myImage = new Image();
myImage.src = myImageUrl;
myImage.alt = "Je suis une image regroupée par Webpacker";
document.body.appendChild(myImage);

Si vous avez besoin de référencer des ressources statiques de Webpacker à partir d'une vue Rails, les ressources doivent être explicitement requises à partir de fichiers JavaScript regroupés par Webpacker. Contrairement à Sprockets, Webpacker n'importe pas vos ressources statiques par défaut. Le fichier app/javascript/packs/application.js par défaut contient un modèle pour importer des fichiers à partir d'un répertoire donné, que vous pouvez décommenter pour chaque répertoire dans lequel vous souhaitez avoir des fichiers statiques. Les répertoires sont relatifs à app/javascript. Le modèle utilise le répertoire images, mais vous pouvez utiliser n'importe quoi dans app/javascript:

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

Les ressources statiques seront générées dans un répertoire sous public/packs/media. Par exemple, une image située et importée à app/javascript/images/my-image.jpg sera générée à public/packs/media/images/my-image-abcd1234.jpg. Pour afficher une balise d'image pour cette image dans une vue Rails, utilisez image_pack_tag 'media/images/my-image.jpg.

Les helpers ActionView de Webpacker pour les ressources statiques correspondent aux helpers du pipeline d'actifs selon le tableau suivant: |ActionView helper | Webpacker helper | |------------------|------------------| |favicon_link_tag |favicon_pack_tag | |image_tag |image_pack_tag |

De plus, l'aide générique asset_pack_path prend l'emplacement local d'un fichier et renvoie son emplacement Webpacker pour une utilisation dans les vues Rails.

Vous pouvez également accéder à l'image en référençant directement le fichier à partir d'un fichier CSS dans app/javascript.

3.4 Webpacker dans les moteurs Rails

À partir de la version 6 de Webpacker, Webpacker n'est pas "aware" des moteurs, ce qui signifie que Webpacker n'a pas la même fonctionnalité que Sprockets lorsqu'il s'agit de l'utiliser dans les moteurs Rails.

Les auteurs de gemmes de moteurs Rails qui souhaitent prendre en charge les utilisateurs utilisant Webpacker sont encouragés à distribuer les ressources frontend sous forme de package NPM en plus de la gemme elle-même et à fournir des instructions (ou un installateur) pour montrer comment les applications hôtes doivent s'intégrer. Un bon exemple de cette approche est Alchemy CMS.

3.5 Hot Module Replacement (HMR)

Webpacker prend en charge HMR avec webpack-dev-server par défaut, et vous pouvez le basculer en définissant l'option dev_server/hmr dans webpacker.yml.

Consultez la documentation de webpack sur DevServer pour plus d'informations.

Pour prendre en charge HMR avec React, vous devrez ajouter react-hot-loader. Consultez le guide Getting Started de React Hot Loader.

N'oubliez pas de désactiver HMR si vous n'exécutez pas webpack-dev-server, sinon vous obtiendrez une erreur "not found" pour les feuilles de style.

4 Webpacker dans différents environnements

Webpacker a trois environnements par défaut : development, test et production. Vous pouvez ajouter des configurations d'environnement supplémentaires dans le fichier webpacker.yml et définir des valeurs par défaut différentes pour chaque environnement. Webpacker chargera également le fichier config/webpack/<environment>.js pour une configuration d'environnement supplémentaire.

5 Exécution de Webpacker en développement

Webpacker est livré avec deux fichiers binstub pour s'exécuter en développement : ./bin/webpack et ./bin/webpack-dev-server. Ce sont des wrappers minces autour des exécutables standard webpack.js et webpack-dev-server.js et garantissent que les bons fichiers de configuration et variables d'environnement sont chargés en fonction de votre environnement.

Par défaut, Webpacker compile automatiquement à la demande en développement lorsqu'une page Rails se charge. Cela signifie que vous n'avez pas à exécuter de processus séparés et que les erreurs de compilation seront consignées dans le journal standard de Rails. Vous pouvez modifier cela en passant à compile: false dans le fichier config/webpacker.yml. L'exécution de bin/webpack forcera la compilation de vos packs.

Si vous souhaitez utiliser le rechargement du code en direct ou si vous avez suffisamment de JavaScript pour que la compilation à la demande soit trop lente, vous devrez exécuter ./bin/webpack-dev-server ou ruby ./bin/webpack-dev-server. Ce processus surveillera les modifications apportées aux fichiers app/javascript/packs/*.js et recompilera automatiquement et rechargera le navigateur en conséquence.

Les utilisateurs de Windows devront exécuter ces commandes dans un terminal séparé de bundle exec rails server.

Une fois que vous avez démarré ce serveur de développement, Webpacker commencera automatiquement à acheminer toutes les demandes d'actifs webpack vers ce serveur. Lorsque vous arrêtez le serveur, il reviendra à la compilation à la demande.

La Documentation de Webpacker donne des informations sur les variables d'environnement que vous pouvez utiliser pour contrôler webpack-dev-server. Consultez les notes supplémentaires dans la documentation de rails/webpacker sur l'utilisation de webpack-dev-server.

5.1 Déploiement de Webpacker

Webpacker ajoute une tâche webpacker:compile à la tâche bin/rails assets:precompile, de sorte que tout pipeline de déploiement existant qui utilisait assets:precompile devrait fonctionner. La tâche de compilation compilera les packs et les placera dans public/packs.

6 Documentation supplémentaire

Pour plus d'informations sur des sujets avancés, tels que l'utilisation de Webpacker avec des frameworks populaires, consultez la Documentation de Webpacker.

Retour d'information

Vous êtes encouragé à contribuer à l'amélioration de la qualité de ce guide.

Veuillez contribuer si vous trouvez des fautes de frappe ou des erreurs factuelles. Pour commencer, vous pouvez lire notre contribution à la documentation section.

Vous pouvez également trouver du contenu incomplet ou des informations qui ne sont pas à jour. Veuillez ajouter toute documentation manquante pour la version principale. Assurez-vous de vérifier Edge Guides d'abord pour vérifier si les problèmes ont déjà été résolus ou non sur la branche principale. Consultez les Directives des guides Ruby on Rails pour le style et les conventions.

Si pour une raison quelconque vous repérez quelque chose à corriger mais ne pouvez pas le faire vous-même, veuillez ouvrir un problème.

Et enfin, toute discussion concernant la documentation de Ruby on Rails est la bienvenue sur le Forum officiel de Ruby on Rails.