DEV Community

Anag
Anag

Posted on

Shrink your Rails 7 application.js files

I discovered that my rails app was bundling a few too many stimulus controllers. Whoa! Slow down there buddy, save some of those controllers for individual pages! Here's my browser trying to download the deferred file...

Maybe you're like me and you thought... "you can choose which stimulus controllers to import?"

Yes. Obvs.

I followed the upgrade tutorials and my application.js using esbuild and js-bundling_rails loaded my new stimulus controllers like this:

import '@hotwired/turbo-rails';
import './controllers';
Enter fullscreen mode Exit fullscreen mode

I added a few more controllers and then BAM! I had a massive 4.5MB application.js file!

Turns out I had a couple pages that used a third party UI component and for reasons I couldn't stop using those components. So I loaded them into my controllers.

I didn't want to stop using the controllers in the same way, but I wanted to use them when I needed them. So I load my controllers dynamically now. But I still register them to the { Application }

Here is my current setup:

Image description

Anything in my controllers directory goes to application.js. I use active admin...(I know, I know, zip it.)

So I load jquery to the window when I'm on active admin pages.

I then bring in my other controllers individually and use `<%= javascript_include_tag 'preview(or upload)' %> where needed.

Here's what the preview directory looks like:

Image description

Here is what the index.js file looks like.

`javascript
import { application } from "../controllers/application"

import PreviewController from "./preview_controller"
application.register("preview", PreviewController)
`

So now my application.js file is 13x smaller. Maybe there is a better way to do it. I'm not entirely sure. But here I am putting out a way where it works for me. Lighthouse Performance score went from 33 to 93. I really don't need that much javascript globally so I'll be trying to deliver almost 0 javascript to the page over time. I'll have ChatGPT research the best admin, or roll my own for me 😂.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (2)

Collapse
 
konnorrogers profile image
Konnor Rogers

There’s an infinite number of ways to handle this with some techniques more advanced than others including lazy loading controllers based on controllers found in the DOM.

An easy win you could do is setup ESBuild to take in multiple entrypoints and set format to “ESM” and “splitting” to true so you can get a more granular cache and reuse code from your main application in your admin views.

Collapse
 
lucianghinda profile image
Lucian Ghinda

If you are looking for an alternative to active admin may I recommend avohq.io ?

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay