After a few hours searching / reading blogs to make the Ruby On Rails project work integrated with the Webpack I decided to document the process.
First at all my project was generated at version 5.0.0, now is using ROR 5.1.4 (last stable) and Ruby 2.5.0.
What I’ll show in this post?
- Installing Node.js
- Installing Yard
- Installing Webpacker
- Removing Assets Pipeline
- Configuring Environment files
- Installing Javascript and CSS compilers and transpilers
- Installing Babel ECMAScript 5
- Configuring Webpack to use Babel
- Webpack: Runnig first pack
- Webpack: Resolving older assets
- Webpack: Compiling and transpiling assets
Before start installing Webpack we need to install the requirements (Node.js, Yarn).
Installing Node.js
My machines are running Debian “Strech” (stable), so I’ve need to update Node.js, I installed the newer version of package available on the maintainer’s website
Installing Yarn
Later I installed the Yarn package from maintainer’s website
Installing Webpacker
In Gemfile add Webpacker gem
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem 'webpacker', '~> 3.0'
Update Gems
bundle install
Now we can install Webpack at project
bundle exec rails webpacker:install
Running this command will create some files and others will be modified
create config/webpacker.yml Copying webpack core config create config/webpack create config/webpack/development.js create config/webpack/environment.js create config/webpack/production.js create config/webpack/test.js Copying .postcssrc.yml to app root directory create .postcssrc.yml Copying .babelrc to app root directory create .babelrc Creating JavaScript app source directory create app/javascript create app/javascript/packs/application.js Installing binstubs run bundle binstubs webpacker from "." Adding configurations append .gitignore Installing all JavaScript dependencies run yarn add @rails/webpacker coffeescript@1.12.7 from "." yarn add v1.3.2 info No lockfile found. [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Saved lockfile. success Saved 620 new dependencies. [...] Done in 18.71s. Installing dev server for live reloading run yarn add --dev webpack-dev-server from "." yarn add v1.3.2 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Saved lockfile. success Saved 117 new dependencies. [...] Done in 5.85s. Webpacker successfully installed 🎉 🍰
Configuring the webpack
Note: Before attempting to run the project you will need to create the webpack configuration file, without this file the application will freeze
At project root create a file called webpack.config.js and add that code
'use strict'; const webpack = require("webpack"); module.exports = { context: __dirname + "/app/assets/javascripts", entry: { application: "./application.js", }, output: { path: __dirname + "/public", filename: "javascripts/[name].js", }, };
Removing the Assets Pipeline
With Webpack providing our new foundation, we can start removing the old asset pipeline.
The Gemfile
Let’s delete some gems used in the past
Comment or delete the following gems from your Gemfile then run bundle
- coffee-rails
- jquery-rails
- sass-rails
- turbolinks
- uglifier
These gems are no longer needed, being replaced or deprecated by Webpack and the Javascript libraries we’ll install later
Configuring Environment files
Now we need to tell Rails to ignore assets in both development.rb
and production.rb
files at config/environments
folder (test.rb
will be left untouched)
At config/environments/development.rb
config.assets.debug = false config.assets.compile = false config.assets.quiet = true
At config/environments/production.rb
# To serve static files out of the /public directory. config.public_file_server.enabled = true # config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass
Installing Javascript and CSS compilers and transpilers
After removing jquery we ended up getting in trouble, we get stuck with raw CSS and JavaScript.
Babel ECMAScript 5 (ES5)
First, I really tried to program in CoffeScript but I didn’t like it the syntax.
Babel is the library we’ll use to transpile ES6 to pure Javascript. We can install it with the following command:
yarn add --dev babel-core babel-preset-env babel-polyfill babel-loader
More about the packages you can read at YarnPkg site:
Configuring Webpack to use Babel
After install the packages we need to configure the webpack to use Babel, we’ll do that by adding the loader do the module
section in webpack.config.js
file.
Add this
module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel', query: { presets: ['env'] } }, ] },
The file must be like this
'use strict'; const webpack = require("webpack"); module.exports = { context: __dirname + "/app/assets/javascripts", entry: { application: "./application.js", }, output: { path: __dirname + "/public", filename: "javascripts/[name].js", }, module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel', query: { presets: ['env'] } }, ] }, };
Webpack: Running first pack
At this point you could test webpack working, add the folling lines to your app/javascript/packs/application.js
file and run webpack
.
var name = "Fabian"; var place = "Porto Alegre"; `Hello ${name}, ready for ${place}?`; [1, 2, 3].map(n => n ** 2);
You’ll see it output into pure JavaScript in the public/packs
directory
var name = "Fabian"; var place = "Porto Alegre"; "Hello " + name + ", ready for " + place + "?"; [1, 2, 3].map(function (n) { return Math.pow(n, 2); });
Cool, It’s works
Wait!!!
The project we are working on already exists, with it we have many sources (JavaScript and Stylesheet) in the default assets directory app/assets
.
How can I use them?
Webpack: Resolving older assets
Now we’ll configure webpack to read older sources from the previous assets directory, at config/webpacker.yml
add this:
resolved_paths: ['app/assets']
Just this? Nooooo
After add 'app/assets'
to webpacker.yml
each file on app/assets
you must import in the new application.js
at app/javascripts/packs
The file may be like this
import 'javascripts/admin/brands' import 'javascripts/admin/dashboard' var name = "Fabian"; var place = "Porto Alegre"; `Hello ${name}, ready for ${place}?`; [1, 2, 3].map(n => n ** 2);
Webpack: Compiling and Transpiling Assets
After each file modification you’ll need to run the webpack
in console to compile/transpile assets.
But to automate this process we’ll pass watch
parameter to webpack.
When passing this parameter, the webpack will be watching the files for changes
webpack --watch
Deixe um comentário