mirror of https://github.com/lukechilds/node.git
Browse Source
-r/--require can be used to preload modules on node startup. The option takes a single module name. The option can be repeated as necessary to preload multiple modules. This patch allows 'vendors' (such a cloud host) to inject functionality that gets executed at application startup without requiring an explicit require from the user's application. This can be useful to load vendor specific application monitoring APIs transparently. PR-URL: https://github.com/iojs/io.js/pull/881 Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>v1.8.0-commit
Ali Ijaz Sheikh
10 years ago
committed by
Chris Dickinson
7 changed files with 194 additions and 65 deletions
@ -0,0 +1 @@ |
|||||
|
console.log('A') |
@ -0,0 +1 @@ |
|||||
|
console.log('B') |
@ -0,0 +1 @@ |
|||||
|
console.log('C') |
@ -0,0 +1,75 @@ |
|||||
|
var common = require('../common'), |
||||
|
assert = require('assert'), |
||||
|
path = require('path'), |
||||
|
child_process = require('child_process'); |
||||
|
|
||||
|
var nodeBinary = process.argv[0]; |
||||
|
|
||||
|
var preloadOption = function(preloads) { |
||||
|
var option = ''; |
||||
|
preloads.forEach(function(preload, index) { |
||||
|
// TODO: randomly pick -r or --require
|
||||
|
option += '-r ' + preload + ' '; |
||||
|
}); |
||||
|
return option; |
||||
|
} |
||||
|
|
||||
|
var fixture = function(name) { |
||||
|
return path.join(__dirname, '../fixtures/' + name); |
||||
|
} |
||||
|
|
||||
|
var fixtureA = fixture('printA.js'); |
||||
|
var fixtureB = fixture('printB.js'); |
||||
|
var fixtureC = fixture('printC.js') |
||||
|
var fixtureThrows = fixture('throws_error4.js'); |
||||
|
|
||||
|
// test preloading a single module works
|
||||
|
child_process.exec(nodeBinary + ' ' |
||||
|
+ preloadOption([fixtureA]) + ' ' |
||||
|
+ fixtureB, |
||||
|
function(err, stdout, stderr) { |
||||
|
if (err) throw err; |
||||
|
assert.equal(stdout, 'A\nB\n'); |
||||
|
}); |
||||
|
|
||||
|
// test preloading multiple modules works
|
||||
|
child_process.exec(nodeBinary + ' ' |
||||
|
+ preloadOption([fixtureA, fixtureB]) + ' ' |
||||
|
+ fixtureC, |
||||
|
function(err, stdout, stderr) { |
||||
|
if (err) throw err; |
||||
|
assert.equal(stdout, 'A\nB\nC\n'); |
||||
|
}); |
||||
|
|
||||
|
// test that preloading a throwing module aborts
|
||||
|
child_process.exec(nodeBinary + ' ' |
||||
|
+ preloadOption([fixtureA, fixtureThrows]) + ' ' |
||||
|
+ fixtureB, |
||||
|
function(err, stdout, stderr) { |
||||
|
if (err) { |
||||
|
assert.equal(stdout, 'A\n'); |
||||
|
} else { |
||||
|
throw new Error('Preload should have failed'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// test that preload can be used with --eval
|
||||
|
child_process.exec(nodeBinary + ' ' |
||||
|
+ preloadOption([fixtureA]) |
||||
|
+ '-e \'console.log("hello");\'', |
||||
|
function(err, stdout, stderr) { |
||||
|
if (err) throw err; |
||||
|
assert.equal(stdout, 'A\nhello\n'); |
||||
|
}); |
||||
|
|
||||
|
// test that preload placement at other points in the cmdline
|
||||
|
// also test that duplicated preload only gets loaded once
|
||||
|
child_process.exec(nodeBinary + ' ' |
||||
|
+ preloadOption([fixtureA]) |
||||
|
+ '-e \'console.log("hello");\' ' |
||||
|
+ preloadOption([fixtureA, fixtureB]), |
||||
|
function(err, stdout, stderr) { |
||||
|
if (err) throw err; |
||||
|
assert.equal(stdout, 'A\nB\nhello\n'); |
||||
|
}); |
||||
|
|
Loading…
Reference in new issue