# Modules in Apostrophe
Every Apostrophe site is made up of modules. You can browse the complete list at left.
# Overview
Each module provides a particular feature, often including both front and back end code, as well as templates and stylesheets. For instance, the apostrophe-assets module provides core services relating to assets like stylesheets.
Modules are implemented as moog types, which provide a simple and clean way to write them in an object-oriented style while keeping async programming convenient and providing easy subclassing and overriding.
For convenience, the apostrophe
npm module contains all of the "core" Apostrophe modules that are necessary for a functioning website.
Some of these, like apostrophe-docs, are initialized every time Apostrophe starts up; you can see that list on github (opens new window). Those modules are initialized first, followed by those you configure in app.js
, in the order you configure them.
Others, like apostrophe-pieces and apostrophe-widgets, are "abstract base classes" you can extend to create new modules that provide content types.
apostrophe-module is the base class of all modules; it provides features that are convenient in almost any module, like rendering a template from its views
folder, or pushing assets from its public
folder.
Modules can also be installed via npm, and multiple Apostrophe modules can be shipped as a single npm module via moog bundles.
# Overriding, configuring and extending modules at "project level"
Any options you provide for a module via the modules
property in app.js
override the default configuration for a module, as described in the technical overview. And any configuration provided via the modules
property in data/local.js
overrides that, allowing for server-specific settings like API keys.
You can also provide your own templates in the lib/modules/module-name/views
folder of your project (not in node_modules
) to override the templates of module-name
, and provide your own code in lib/modules/module-name/index.js
to override methods and add functionality. If your project-level lib/modules
folder has a module by the same name as a core or npm module, any code you provide automatically subclasses and improves that module.