ServerJS/Modules/CompiledModules

From MozillaWiki
Jump to: navigation, search
// ==================================================================
// browser code in development

// locked into on of these options
//
//  1) using a special XHR synchronous script loader and    
//      a) seeing poor error messages with strange line numbering
//         not corresponding with source code line numbering or
//      b) using a JavaScript interpreter written in JavaScript
//         to execute the code retrieved by the XHR. Line numbers
//         would then correspond to source code line numbers.
//         (Seems like an extreme solution.)
//
//  2) edit-compile-load-test cycle using the code below. Also
//     strange numbering in error messages that does not match
//     source files. Tools could make compile automatic but that
//     means tools are required and that is not the case in 
//     the current browser scripting world.


// ==================================================================
// compiled for production in browser

//
// library.js
//
var require = (function() {
  
  // memoized export objects
  var exportsObjects = {}

  // don't want outsider redefining "require" and don't want
  // to use arguments.callee so name the function here.
  var require = function(name) {
    if (exportsObject.hasOwnProperty(name)) {
      return exportsObject[name];
    }
    var exports = {};
    // memoize before executing module for cyclic dependencies
    exportsObject[name] = exports;
    modules[name](require, exports);
    return exports;
  };
  
  return require;
})();

var run = function(name) {
  require(name); // doesn't return exports
};

var modules = {};

//
// compiledModules.js
//
modules["math"] = function(require, exports) {
  exports.add = function() {
    var sum = arguments[0];
    for (var i=1; i<arguments.length; i++) {
      sum += arguments[i];
    }
    return sum;
  };
};

modules["increment"] = function(require, exports) {
  var add = require('math').add;
  exports.increment = function(val) {
    add(val, 1);
  };
};

modules["program"] = function(require, exports) {
  var inc = require('increment').increment;
  var a = 1;
  inc(a); // 2
};

//
// html in document head
//
<script src="library.js" type="text/javascript"></script>
<script src="compiledModules.js" type="text/javascript"></script>
<script type="text/javascript">
  // You might not use use the window.onload property
  // but rather addEventListener/attachEvent.
  window.onload = function() {
    run("program");
  };
</script>