November 10, 2020
In the previous article, I talked about the different ways to load a ruby file
and we’re not stopping there. Apparently, there’s an easier way of loading files
without the nuisance of
$LOAD_PATH, among other things.
With the recent release of Rails 6, I learned that they migrated the
autoloader from the traditional way to using a library called
zeitwerk — it’s much faster, and
thread-safe. More importantly, let me provide you a simple comparison on how
might a traditional
require differ from using zeitwerk.
Why use an external library if Ruby already has a built-in way of doing it?
Given a directory structure:
lib/ > anotherfile.rb hello.rb
anotherfile.rb using the old and zeitwerk way.
# OLD WAY $LOAD_PATH.unshift "lib" require "anotherfile"
# ZEITWERK require "zeitwerk" loader = Zeitwerk::Loader.new loader.push_dir("lib") loader.setup
With zeitwerk, the directory structure plays a very important role because your constants should be defined based on how the directories are mapped out (at least by default, but IIRC you can override this). For example:
app/services/ > hello/ > world.rb
Zeitwerk expects that you have a constant defined
World under the
require "zeitwerk" loader = Zeitwerk::Loader.new loader.push_dir("app/services") loader.setup Hello::World.new