Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 5.2+: why still use assets pipeline with webpacker?

I was reading the Rails webpacker gem documentation where it says:

Webpacker makes it easy to use the JavaScript pre-processor and bundler webpack 4.x.x+ to manage application-like JavaScript in Rails. It coexists with the asset pipeline, as the primary purpose for webpack is app-like JavaScript, not images, CSS, or even JavaScript Sprinkles (that all continues to live in app/assets).

However, it is possible to use Webpacker for CSS, images and fonts assets as well, in which case you may not even need the asset pipeline. This is mostly relevant when exclusively using component-based JavaScript frameworks.

I'm trying to understand the rationale behind using both the older assets pipeline for CSS/images/JS-sprinkles if webpacker is capable of handling all of this?

I've read some other articles that walk me through using webpacker for all of this, but I don't understand the reasoning behind this decision.

Is this just to support legacy applications and eventually the older assets pipeline will go away and webpacker will be used for everything in Rails apps?

like image 571
Dan L Avatar asked Mar 19 '19 01:03

Dan L


People also ask

What is assets pipeline in Rails?

The asset pipeline provides a framework to concatenate and minify or compress JavaScript and CSS assets. It also adds the ability to write these assets in other languages and pre-processors such as CoffeeScript, Sass, and ERB.

What does Webpacker do in Rails?

With webpack, you can manage JavaScript, CSS, and static assets like images or fonts. Webpack will allow you to write your code, reference other code in your application, transform your code, and combine your code into easily downloadable packs.

What does Rails assets Precompile do?

The Rails asset pipeline provides an assets:precompile rake task to allow assets to be compiled and cached up front rather than compiled every time the app boots. There are two ways you can use the asset pipeline on Heroku. Compiling assets locally.

Does Rails 7 Use Webpacker?

Taking into consideration all the major shifts in modern Javascript development, Rails 7 has decided to replace Webpacker with importmapped Hotwire as default the JavaScript setup. This means that a default Rails skeleton will not have to require the full JavaScript toolchain with Webpack by default.


1 Answers

As a maintainer of an app that existed before Webpacker, I can give you one reason:

It's hard to migrate an existing frontend from Sprockets to Webpack.

Sprockets builds all JS into one big file with shared scope. Webpack isolates the scope of every JS module. To migrate to Webpack, you need to make sure your code still works with the scope isolation.

Which is often problematic, because in the Sprockets times you didn't have proper JS requires, either, and had to rely on globals or top-scope variables to share code and data between your JS source files.

Rails doesn't offer a painless transition path from Sprockets compilation to Webpack. So, it must support both.

But to answer your other question - going forward, you should use Webpacker if you have enough JS to make it worthwhile.

If your frontend is simple, you will skip some JS nuisances if you use Sprockets. Like if you want to add 10 lines of JS to your app, you might not want to setup a whole JS environment with dependency management and node_modules etc - which is the price of using Webpack/Webpacker. It would be even more senseless to manage a JS environment if all you want is to compile CSS and add digests to your image filenames - which Sprockets is perfectly capable of, without a package.json and anything else JS related.

Therefore, there's a second reason:

Webpacker is good for apps that have a significant frontend codebase. Sprockets is good for adding a bit of JavaScript to a traditional server-rendered app, and for apps with no JavaScript at all.

like image 174
Leonid Shevtsov Avatar answered Oct 14 '22 01:10

Leonid Shevtsov