Use observer pattern to make communication between different view modules without global variables.
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


A YUI implementation of "Scalable JavaScript Application Architecture" theory by Nicholoas Zakas.



The main theory is that every module should be a sandbox and live on its own. The instance provides useful attributes and methods for developer to work.

YUI.add("module1", function (Y) {

    var module1 = new Y.module({
        selector: "#module1",
        init: function () {
            // Initial settings.
        on: {
            // Triggers when this dom element is contentready.
            viewload: function () {
                module.log("viewload() is executed.");
                var node = this.get("node");
                // Bind events.

}, "VERSION", {
    requires: ["module"]

Loose Coupling

You can make cross-module communication by listening and broadcating model. This approach is great for loose coupling.

  • Module 1:

    module1.listen("need-love", function (name, id, data) {
        console.log(name); // The message name.
        console.log(id);   // The caller id.
        console.log(data); // The data that caller provides.
        // Check data to see if you want to have next step.
  • Module 2:

    module2.broadcast("need-love", {
        "gender": "male",
        "hobbies": ["jogging", "movie"]

Page-level Control

Sometimes you may need to implement a feature that doesn't belongs to any view module. However, you still want to use the listen/broadcast model to make interaction between different modules. Y.ModuleManager is the right one to help.

var manager = new Y.ModuleManager(attrs); // It's a singleton. All instances are the same.
manager.broadcast("playing", data);
manager.listen("seek", handler)


Developer can choose to require the extensions they need to have more useful attributes and methods.

  • module-intl - For translation.

    module.getTrans(<key>, <default_string>);
  • module-analytics - For Google Analytics.

    module.trackEvent(<category>, <action>, <label>);
  • module-dialog - For custom dialogs.

    module.alert(<msg>, <callback>);
    module.confirm(<msg>, <callback>);
    • You can even transform the module itself to a dialog.

      new Y.Module({
          selector: "#foo",
          dialog: true


JavaScript Modular Platform

This example shows the concept of cross-module interactions. Be aware the library used there is the elder version. I will update it recently.

ModuleDialog Extension

A very convenient way to create custom alert and confirm UIs.


Someone said I should use custom event ( and Y.on) to achieve cross-module communication. Indeed it works but it only solves one problem. What this theory solves is about team work, you need to make some constrait to developer to prevent everyone can do something wild.

Also, I find it's a really great foundation for us to build necessary extensions. It helps us to have swift methods and consistent UIs very easily. Sometimes it's dangerous that everyone calls native YUI or jQuery methods. It might produce thousands implementations for one simple feature.