module-library
v0.96.0
Published
Caches module singletons and orchestrates dependencies between them
Downloads
2,122
Readme
Most build systems use config files to define dependencies separate from code.
module-library allows you to define your dependencies in code:
var library = require("module-library")(require)
library.define(
"people",
function() {
return [{name: "erik", age: 35}, {name: "alex", age:39}, {name: "kate", age: 30}]
}
)
library.define(
"say-hello",
["people", "querystring"],
function(people, querystring) {
return function hi() {
people.forEach(function(person) {
console.log(querystring.stringify(person))
})
}
}
)
library.using(
["say-hello"],
function(hi) {
hi()
}
)
You can also export these modules so they are accessible via commonjs:
var library = require("module-library")(require)
module.exports = library.export(
"say-hello",
["people", "http"],
function(people, http) {
...
}
)
Dependencies inside your module
If you want to maintain good encapsulation but only export one module, you can define as many extra modules as you like:
library.define(
"hot-dog-stand/inventory",
function() {
return function stock(item) {
if (isPerishable(item)) {}
...
}
}
)
library.define(
"hot-dog-stand/triage",
function() {
return function expedite(order) {
var lowPri = lowestDollarValueCustomer()
order.position = lowPri.position
lowPri.position = 1000
}
}
)
And then require them from the module you're exporting:
module.exports = library.export(
"hot-dog-stand",
["hot-dog-stand/triage", "hot-dog-stand/inventory", ...],
function(stock, expedite, ...) {
openProcess(function(deliveries) {
if (deliveries.length > 0) { stock(deliveries[0]) }
})
...
}
)
Why
We have an explicit reference, in software, of which dependencies are needed for a piece of code. This makes it easy to load that code in other places, like in the browser (see bridge-module), without any kind of elaborate, declarative, filesystem-based, side-effect ridden build process.
We can pause and debug any part of the module loading process in the same process as our app
We will (later on) be able to hot reload modules without refreshing the whole tree