So that's what Propshaft doesn't do. Here's what it does provide:
- Configurable load path: You can register directories from multiple places in your app and gems, and reference assets from all of these paths as though they were one.
- Digest stamping: All assets in the load path will be copied (or compiled) in a precompilation step for production that also stamps all of them with a digest hash, so you can use long-expiry cache headers for better performance. The digested assets can be referred to through their logical path because the processing leaves a manifest file that provides a way to translate.
- Development server: There's no need to precompile the assets in development. You can refer to them via the same asset_path helpers and they'll be served by a development server.
Basic compilers: Propshaft was explicitly not designed to provide full transpiler capabilities. You can get that better elsewhere. But it does offer a simple input->output compiler setup that by default is used to translate
asset-pathfunction calls in CSS to
With Rails 7+, you can start a new application with propshaft using
rails new myapp -a propshaft (pending the merge of rails/rails#43261).
Propshaft makes all the assets from all the paths it's been configured with through
config.assets.paths available for serving and will copy all of them into
public/assets when precompiling. This is unlike Sprockets, which did not copy over assets that hadn't been explicitly included in one of the bundled assets.
These assets can be referenced through their logical path using the normal helpers like
assets:precompile has been run (through a JSON mapping file found in
Additionally, Propshaft ships with a CSS function called
asset-path("image.svg") that'll be compiled into
url("/assets/image-f2e1ec14d6856e1958083094170ca6119c529a73.svg") when doing
assets:precompile. This function is applied to all
Bypassing the digest step
-[digest].digested.js as the postfix to any asset file as an indication that the file has already been digested.
Migrating from Sprockets
Propshaft does a lot less than Sprockets, by design, so it might well be a fair bit of work to migrate if it's even desirable. This is particularly true if you rely on Sprockets to provide any form of transpiling, like CoffeeScript or Sass, or if you rely on any gems that do. You'll need to either stop transpiling or use a Node-based transpiler, like those in
But for greenfield apps using the default import-map approach, Propshaft can also work well, if you're able to deal with vanilla CSS.
Will Propshaft replace Sprockets as the Rails default?
Most likely, but Sprockets need to be supported as well for a long time to come. Plenty of apps and gems were built on Sprocket features, and they won't be migrating soon. Still working out the compatibility story. This is very much alpha software at the moment.
Propshaft is released under the MIT License.