Git Product home page Git Product logo

hydrajs's Introduction

Hydra.js

Hydra.js is a module manager oriented system.

Updated to version 3.11.0 + ES6

Build Status Dependency Status NPM version

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:

  • Allows you to change your base framework without change the modules or widget code.
  • Allow the modules communicate with each other without knowing which modules are loaded.
  • Can be easily extended with new features.

Benefits:

  • No known module to other modules
  • If something is wrong in one module, the other modules will continue working.
  • Notifying an action will be called on all the modules that will be listening this action.
  • A module can be extended
  • If you have a module that is working well you can extend it to change his behavior without losing is original behavior.
  • Allows multi-instance modules
  • Allows set private variables to be used inside of modules.
  • Can be used in url threaded application as in an Ajax threaded application.
  • You can test your modules with any Unit Testing Framework.
  • Only 6.72 KB when Gzipped.

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:

<script type="text/javascript" src="/path/to/your/js/libs/Hydra.js"></script>

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:

  • Bus
  • Get access to Hydra.bus, the action manager to publish or subscribe to events
  • Module
  • Get access to Hydra.module, the module manager to register, extend, decorate, start and stop modules.
  • ErrorHandler
  • Get access to the Hydra.errorHandler, it's recommended to use it instead of using console.log because of the possible improvements see Hydra.js extensions or Hermes.js
  • Api
  • Get access to the rest of the Hydra api. You can use it to access to the current extensions, i.e. jQuery, or to your own extensions.
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:

  • $bus
  • $module
  • $log (error handler)
  • $api
  • $global (window object)
  • $doc (document object)

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', {} );
            });
        }
    };
});

Preprocessing Data on publish actions.

When the data is pass to the listener actions it gives the same object by default, if you need to pre-process this data before execute the action, you should use the 'preprocessorPublishData' method in Hydra.bus. The callback that you pass will get two arguments:

  • The data object
  • The clone method used in Hydra.js.

Example of a code that returns a copy of the data object

Hydra.bus.preprocessorPublishData( function ( oData, clone ) {
    return clone( oData );
});

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.

hydrajs's People

Contributors

ajimix avatar dependabot-preview[bot] avatar dependabot[bot] avatar tcorral avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hydrajs's Issues

Allow anonymous modules

When we register modules now, a special object is returned with the methods required to manage its lifecycle (start, stop, extend...). Having that, when using AMD we don't need to access the module through the manager and whe can use that object instead. It'd be nice if we could register anonymous modules only to get that object, or having a new method to define modules instead of registering them.

Example:

define(['hydra'], function (Hydra) {
    return Hydra.module.register(function (bus) {
        return {
            init:function () {
                bus.subscribeTo('channel', 'item:action', function () {
                    console.log('other started');
                }, this);
                console.log('other module started');
            }
        };
    });
});

or with a new function:

define(['hydra'], function (Hydra) {
    return Hydra.module.define(function (bus) {
        return {
            init:function () {
                bus.subscribeTo('channel', 'item:action', function () {
                    console.log('other started');
                }, this);
                console.log('other module started');
            }
        };
    });
});

Then to manage start or stop those modules:

define(['my-module'], function(MyModule) {
  MyModule.start();
  MyModule.stop();
});

No tag for 3.11.0 + ES6?

Tomás,

Great work on the update for ES6 mate. I went to clone it from the git repo but there is no tag for 3.11.0 + ES6?

Should I just be cloning from Master?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.