DEV Community

Alex Aslam
Alex Aslam

Posted on

Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby?

"We deleted our node_modules folderโ€”and nothing broke."

For over a decade, Rails developers begrudgingly accepted Node.js as a necessary evil. But with Rails 8โ€™s upcoming changes, the JavaScript landscape is shifting dramaticallyโ€”back toward Ruby.

After testing the latest alpha, we discovered a surprising truth: You can now build modern frontends in Rails without touching npm, yarn, or even a bundler. Hereโ€™s whatโ€™s changing, why it matters, and when you should (and shouldnโ€™t) jump in.


1. The Rails 8 JavaScript Revolution

Whatโ€™s New?

โœ… Import Maps by default โ€“ No more Webpacker
โœ… Bun support out of the box โ€“ For when you do need a build step
โœ… Stimulus 3.0+ Hotwire Turbo 8 โ€“ Morphing DOM updates
โœ… Ruby-driven JS utilities โ€“ rails-ujs reborn

# Gemfile
gem "importmap-rails" # No Node required
gem "turbo-rails"     # Ships with Rails 8
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

2. Bye-Bye Node, Hello Ruby

The Death of package.json

Before (Rails 7):

node -v # 18.16.0
yarn install # 142 packages
webpack-dev-server # 4.2s startup
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

After (Rails 8):

bin/importmap pin react
# Thatโ€™s it. No Node.
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

How?

  • CDN-based dependencies via esm.sh/skypack
  • Zero local JavaScript toolchain

3. Real-World Impact

Case 1: Faster CI Pipelines

Step Rails 7 (Webpack) Rails 8 (Import Maps)
Install deps 48s 0s
Build assets 22s 0s
Total deploy time 3.1min 1.4min

Case 2: No More Node Conflicts

# No more:
ERROR: Node.js 18.17.1 is required (youโ€™re using 16.20.2)
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

4. When You Still Need Node

โŒ React/Vue SPAs (Use Bun instead)
โŒ Legacy Webpacker apps (Migration required)
โŒ npm-only packages (e.g., specialized charting libs)

Hybrid Approach:

# Gemfile
gem "bun-rails" # Opt-in Bun bundling for specific packs
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

5. The New Rails Frontend Stack

  1. HTML-first โ€“ Turbo Frames/Streams
  2. Progressively enhanced โ€“ Stimulus 3.0
  3. Ruby-managed JS โ€“ Import Maps + esm.sh
  4. Opt-in bundling โ€“ Bun for heavy components
graph TD
  A[Turbo] --> B[Zero-Build HTML]
  C[Stimulus] --> D[Lightweight JS]
  E[Bun] -->|Only when needed| F[Optimized Bundles]
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to

6. Migration Tips

  1. Start fresh: rails new my-app --skip-javascript
  2. Pin dependencies:
   bin/importmap pin react-dom @hotwired/turbo-rails
๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to ๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to
  1. Audit app/javascript: Move to app/assets/javascript

โ€œBut Our Team Loves React!โ€
Try this:

  1. Keep React for one route (via Bun)
  2. Use Turbo for the rest
  3. Compare dev experience

Tried Rails 8โ€™s new JS setup? Share your wins/fails below!

Top comments (2)

๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to
 
xwero profile image
david duymelinck โ€ข โ€ข Edited

Import maps aren't that difficult. So you don't really need a gem.

It is a great feature in my book. With the bundlers you didn't have a good view on what gets loaded.

๐ŸŒ Rails 8โ€™s JavaScript: Goodbye Node, Hello Ruby? - DEV CommunityDropdown menuDropdown menuNavigation menuSearchSearchCloseMore...Copy linkEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeEnter fullscreen modeExit fullscreen modeCollapseExpandDropdown menuLike comment: Like comment: Comment buttonCollapseExpandDropdown menuLike comment: Like comment: Comment button - dev.to
 
alex_aslam profile image
Alex Aslam โ€ข

Great point! Import maps are indeed simple and powerful, we love how they bring transparency to dependency loading. The gem just adds Rails conveniences like dependency pinning and SRI hashes, but you're absolutely right: the native browser feature alone is game-changing.
"The best tools stay out of your way while making the right thing easy."
Would love to hear how you're using import maps in your projects!