# More Modules:
This page is about optional modules for Apostrophe. For the standard modules, see the reference.
# More official modules for ApostropheCMS
Check out our official list of optional modules from the Apostrophe team. (opens new window) The modules available cover everything: workflow, internationalization, localization, single sign-on (SSO), Twitter feeds, redirects, Redis caching, headless APIs for your native, React, Vue and Angular applications, sitemaps and a great deal more.
# Publishing your own npm modules for Apostrophe
Please do! It's easy. A few things to know:
- You can take any Apostrophe module (
lib/modules/my-module
), move that to the root of its own repository and package it up as an npm module and it will just work, as long as all of your dependencies are part of the module. For instance, don't rely on including templates that are in a module you're not publishing. - Do not use the
apostrophe-
prefix for your module, or theapos-
prefix for your styles without consulting us first. These are reserved for the official Apostrophe modules (which you are welcome to collaborate on). To avoid confusion, you can pick your own prefix. It's polite to use a prefix so that you don't conflict with project-level modules. - You should take advantage of the
afterConstruct: function(self) { ... }
function in yourindex.js
and invoke any methods that need to be called at startup there, rather than actually doing things in yourconstruct: function(self, options) { ... }
function. This allows project-level developers to extend your module and override your methods beforeafterConstruct
runs and it's too late. - Speaking of which,
afterConstruct
can optionally take a callback if you need to do async stuff there. - Don't add fields directly with the
addFields
option. Instead, manipulateoptions.addFields
in abeforeConstruct: function(self, options) { ... }
function. And make sure you append any values that are already inoptions.addFields
, if it exists. This allows "project level" developers to add more fields to your pieces modules, widgets, etc. - Add
apostrophe
,apostrophecms
andapostrophe-cms
to your keywords inpackage.json
to increase discoverability of your module.
# Packaging Apostrophe modules together: creating bundles
If you need to package up several related modules that only make sense together, you can distribute them as a single npm module. Here is how that works:
- The name of your npm module should be the name of your "lead" Apostrophe module, the one with the most obvious name for what you're doing, much like
apostrophe-blog
. - You must include a
moogBundle
property in the definition of your lead module, like this:
module.exports = {
name: 'apostrophe-blog',
alias: 'blog',
label: 'Article',
extend: 'apostrophe-pieces',
moogBundle: {
modules: ['apostrophe-blog-pages', 'apostrophe-blog-widgets'],
directory: 'lib/modules'
},
// ... etc ...
};
- The rest of your modules should live in the
lib/modules
subdirectory of your npm module. - As long as the user configures your "lead module" (the one the npm module is named after), Apostrophe will automatically recognize it as a bundle. Of course the user must still configure each of your bundles, unless they use the
improve
keyword to implicitly subclass other modules, in which case they are loaded automatically for simplicity's sake.