Node/Browser Compatibility notes
Creating a set of modules which can be used normally from both Node (via require
) and the browser (via <script>
tags) is non-trivial. Node would prefer to install all your modules in node_modules
, so they can be loaded via a plain require('modulename')
. Script tags require full paths, and the usual organization for web content is at odds with filing JS files away in some obscure directory. We have to break a few rules on both sides of the aisle in order to make things work.
Browser
Arend modules are loaded via <script>
tags. Modules must be loaded in dependency order.
The core
module establishes a global pseudo-require
function that tries to return the "module" requested. Depending on the argument, this may be the global ar
object (for Arend-internal modules) or some specific object (for utility modules like Lo-Dash, No-Dash, and Fin).
All Arend modules access other modules (Arend and utility) via require
; direct access through global objects (even though these are available on the browser) is never used.
Node
In Node, modules are located both in src/
and lib/
. Relative module paths are used in require()
calls, to avoid the need for the Node module directory structure. All modules depend on core
, thus it is guaranteed to be loaded first (which is good, because it installs Lo-Dash globally).
QUnit
Although QUnit can be used from Node, it doesn't do anything useful. It doesn't report any results, or, indeed, run any tests. Hence, when run via Node we require a small wrapper around QUnit, "QNodeit" which sets up QUnit for CLI operation. It simple loads QUnit, changes a few config
settings, and then re-exports all of QUnit's exports. The web-based test suite loads QUnit directly, while the individual test modules require
QNodeit. The web-based require
substitute returns the global QUnit object when a request is made for QNodeit. (As above, all test modules require
QNodeit rather than access it directly.)