tcorral / Hydra.js

Create a scalable, maintainable and module oriented system using Hydra.js
http://tcorral.github.com/Hydra.js
MIT License
102 stars 12 forks source link

Hydra.js

Hydra.js is a module manager oriented system.

Hydra.js has been moved to HydraJS organization in (https://github.com/HydraJS/HydraJS)

Updated to version 3.8.0

Build Status

Changelog

Description

Hydra.js is the library that will help you to scale your app. Hydra.js is a framework that gives you the tools to write your application using modules or widgets and make easy to work with them.

Hydra.js uses a decoupled architecture that:

Some benefits:

Project Web

API documentation

Examples

Usage

Install:

Install with Bower

bower install hydrajs

Install with Component

component install hydrajs

Install with NPM

npm install hydra.js

Use in browser

Insert in your html code:

Common usage

Setting variables

Hydra.module.setVars({
    gaq: _gaq,
    list: document.getElementById( "list" )
});

Setting the variables in this way will make the variables accessible as the last argument in the init module method. If needed you can also access these variables using getVars (See 'Getting variables')

Tip. This method not only sets variables, if the object has been set before the new variables will be merged with the previous object.

Getting variables

var oVars = Hydra.module.getVars();

Returns the object with the private variables set using setVars (See 'Setting variables')

Module creator function

The module creator function gets four arguments:

function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {}
    };
}

Create a module

Hydra.module.register( 'moduleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {}
    };
});

Create a module using dependency injection

Hydra.module.register( 'moduleId', ['$api', '$bus'], function ( Api, Bus )
{
    return {
        init: function ( oData ) {}
    };
});

The following are available for dependency injection:

To use dependency injection, pass an array of strings containing any of the variables listed above as the second parameter when registering a module. Hydra will pass them in the order specified to your function.

Extend a module overriding the base module

To extend a module you will need to register the base module before extends it.

Hydra.module.extend( 'moduleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {}
    };
});

Extend a module creating a new module

To extend a module you will need to register the base module before extends it.

Hydra.module.extend( 'moduleId', 'newModuleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {}
    };
});

This extension allows access the parent methods as classical inheritance.

Access parent methods

Register base module:

Hydra.module.register( 'moduleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {},
        changeTitle: function( sTitle ){
            document.title = sTitle;
        }
    };
});

Create the new module using "extend":

Hydra.module.extend( 'moduleId', 'newModuleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        init: function ( oData ) {},
        changeTitle: function( sTitle ){
            sTitle += " " + new Date().getTime();
            // This is the way of access parent methods.
            this.__super__.call( "changeTitle", [sTitle] );
        }
    };
});

Decorating modules

Sometimes is better to decorate our modules instead of extending them. I recommend to use decorate instead of extend modules.

Hydra.module.decorate( 'baseModuleId', 'decoratedModuleId', function( Bus, baseModule, Module, ErrorHandler, Api )
{
    return {
        init: function ()
        {
            //do something on start a module
            baseModule.init();
        },
        onDestroy: function ()
        {
            //do something on stop a module
            baseModule.onDestroy();
        }
    };
});

Listening to events

Hydra.module.register( 'moduleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        events : {
            'channel': {
                'item:action1': function ( oData ) {}
            }
        },
        init: function ( oData ) {
            /* The subscribing of events is done by Hydra inside the core.
            * Bus.subscribe( this );
            */
        }
    };
});

Publishing actions

To use the action manager you have accessible using "Bus".

The publish method expect three arguments, but only the first two are mandatory, the channel name and the event name

Hydra.bus.publish( 'channel_name', 'event_name', data );

Tip: 'global' channel is created by default to use it if you want to communicate with other modules that are not related with a specific channel.

Hydra.module.register( 'moduleId', function( Bus, Module, ErrorHandler, Api )
{
    return {
        events : {
            'channel': {
                'item:action1': function ( oData ) {}
            }
        },
        init: function ( oData ) {
            $( "#button" ).click( function(){
                Bus.publish( 'channel', 'item:action1', {} );
            });
        }
    };
});

If you need compatibility with the previous event manager called Action, you can add it in your code to maintain compatibility with previous version's code. You can download it from: Action

Documentation

Project Web

API documentation

Examples

License

Hydra.js is licensed under the MIT license.

Agreements

Hydra was inspired by Nicholas Zakas presentation.