Noder.io provides a lightweight and flexible core to create a scalable API of a lib, a module, an application or a framework. Noder.io is inspired (among others) by Angular and Pimple.
It is useful for starting a project quickly with a modular API ready to use.
Noder.io (and any object built on top of Noder.io) integrates:
- dependency injection
- constructors of services, factories and providers
- lazy loading
- plugins system easy to use
No dependencies, works on Node.js and in the browser (only 7kb minified - 2kb gzipped).
See quickstart.
Get common instance of Noder
:
var noder = require('noder.io');
Best practice, create an instance of Noder
class for your project:
// ./api/index.js
var Noder = require('noder.io').Noder;
var api = new Noder();
// code body that constructs your API
module.exports = api;
or shortcut:
// ./api/index.js
module.exports = require('noder.io').createNoder();
Use your API in another file:
var api = require('./api');
// load a plugin
api.use('pluginName');
// create an item in the container
api.$di.set('someItem', 'value of the item');
// ...
Noder.io provides a class to handle a collection of items.
// create a collection
var items = noder.createCollection();
items.set('keyName', 'key value');
// keyName value
console.log(items.get('keyName'));
// get all items
var all = items.getAll();
// true
console.log(items instanceof noder.Collection);
See collection.
See dependency injection.
noder.$require
method provides a lazy require()
:
// define the property without loading the mongoose module
noder.$require('mongoose');
// false
console.log(noder.$require.isLoaded('mongoose'));
// lazy loading
var mongoose = noder.mongoose;
// true
console.log(noder.$require.isLoaded('mongoose'));
// true
console.log(noder.mongoose === require('mongoose'));
Aliases:
noder.$require('promise', 'bluebird');
// true
console.log(noder.promise === require('bluebird'));
Custom loader:
// factory: promisify the "fs" module
noder.$require('fs', function() {
return noder.promise.promisifyAll(require('fs'));
});
fs.readFileAsync('./any-file.js')
.then(function(contents) {
console.log(contents);
})
.catch(function(err) {
console.error(err);
})
;
See lazy loading.
Noder.io provides a plugin system to make a package works as a plugin for Noder.io and also as a standalone module or library.
Example of a Noder plugin:
/**
* Initialization for use as a standalone module.
* @return {Noder} New `Noder` instance
*/
module.exports = function blog() {
var Noder = require('noder.io').Noder;
var noder = new Noder();
// or use the shortcut:
// var noder = require('noder.io').createNoder();
return module.exports.__noder(noder);
};
/**
* Init `blog` plugin.
* @param {Noder} noder `Noder` instance
* @return {Noder} Current `Noder` instance
*/
module.exports.__noder = function blogPlugin(noder) {
// create config object only if not exists
noder.$di.addOnce('config', {}, true);
// sub-modules of blogPlugin
// that add features to the instance of Noder
noder.use(require('./api/article'));
noder.use(require('./api/comment'));
noder.use(require('./api/admin'));
// Always return the instance of Noder to allow chaining
return noder;
};
See plugins.
Noder.io is fully tested with Unit.js and Mocha.
MIT (c) 2013, Nicolas Tallefourtane.
Nicolas Talle |