"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
HTML-first โ Turbo Frames/Streams
Progressively enhanced โ Stimulus 3.0
Ruby-managed JS โ Import Maps + esm.sh
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
Start fresh : rails new my-app --skip-javascript
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
Audit app/javascript
: Move to app/assets/javascript
โBut Our Team Loves React!โ
Try this:
Keep React for one route (via Bun)
Use Turbo for the rest
Compare dev experience
Tried Rails 8โs new JS setup? Share your wins/fails below!
Top comments (2)
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.
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!