Defer route drawing to the first request, or when url_helpers called #51614
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation / Background
This Pull Request has been created because apps with lots of routes take a long time to boot. A developer could boot an app for reasons that don't involve routes at all (like running unit tests, migrations, rake tasks, etc.) so I think this should be deferred in dev and test.
Detail
This Pull Request changes engine and app route sets to a
Rails::Engine::RouteSet
, which knows about the current Rails application. The default middleware stack has also changed to include aRails::Rack::LoadRoutes
middleware that loads routes if needed. This PR loads routes under the following circumstances:In dev/test:
url_helpers.some_path
is called viamethod_missing?
url_helpers.respond_to?(:some_path)
is called viarespond_to_missing?
In production:
If, for some reason, a developer wishes to revert to the previous behaviour, they could add an initializer with
Rails.application.reload_routes!
. However, if we wanted to be more safe, we could also hide this behaviour behind a configuration variable.Additional information
This is loosely inspired by https://github.com/amatsuda/routes_lazy_routes
I'm a bit concerned this is too much of a hack, but I think the speed benefit might be worth it. In an app with 2000 routes:
Before:
After:
Checklist
Before submitting the PR make sure the following are checked:
[Fix #issue-number]