# How Apostrophe starts up
This tutorial covers how Apostrophe initializes itself. In the process, it provides insight into how you can influence that process and the best times to do things in your own modules.
# Initialization of modules
When the application starts up, the modules initialize in the order found in node_modules/apostrophe/default.js
, followed by any project level or npm modules, in the order configured in app.js
.
# Initialization of an individual module
When initializing, an individual module invokes beforeConstruct
at project level first, then at npm module level; note that project level code runs first here to adjust the options
if needed before the base class sees them. If a module extends another, the subclass runs first, again getting a chance to adjust options
before the base class sees them.
Then construct
runs for this module, this time starting with the base class, so that the subclasses can override methods assigned there.
Then afterConstruct
runs for the module. Ideally construct
doesn’t do anything but set up methods, so that afterConstruct
can safely invoke them, knowing that any subclass overrides have already happened.
See the moog documentation (opens new window) for more information about beforeConstruct
, construct
and afterConstruct
.
# Running code after all modules are constructed
After all of the modules are initialized, Apostrophe invokes the modulesReady
methods of any modules that have one, in the order those modules were initialized. This is a good time to do work that requires other modules initialized after yours.
Note that your modulesReady
method may optionally take a callback.
If you are extending another module, be sure to check whether it already has a modulesReady
method and invoke it via the super pattern if so.
# Running code after modulesReady
The last thing Apostrophe does before listening for connections, or running the task in the case of a command line task, is invoking the afterInit
method of any module that has one.
Like modulesReady
, afterInit
may also take a callback if it needs to do asynchronous work.
# afterInit
in app.js
You may also supply a top-level afterInit
property in your app.js
configuration. If provided this function must take a callback. We recommend using modulesReady
or afterInit
in a project-level module instead. Cluttering up app.js
with executable code generally leads to hard-to-understand projects.