Swizzle a little something into your Node.js modules.
Requizzle provides a drop-in replacement for Node.js's require() function.
This replacement enables you to change a module's source code when Node.js loads
the module.
You can use Requizzle in your test cases, or in production code if you like to
live dangerously.
There are several different ways:
With Requizzle, you can add directories to the module lookup path, which forces
Node.js to search those directories for modules. This can be useful if:
require('../../../../../lib/foo').Tamper with modules to your heart's delight by adding arbitrary code before or
after the module's own source code.
When you use Requizzle to require a module, you can force each child module'srequire method to inherit your changes to the parent module. (By default, only
the parent module is changed.)
Probably not. It's true that Requizzle gives you plenty of new and exciting ways
to tamper with, and possibly break, your module dependencies. But Requizzle also
tries not to break anything on its own. In particular:
fs or path, Requizzle won't mess withThe Requizzle module exports a single function, which returns a drop-in
replacement for require().
When you call the function, you must pass in an options object, which can
include any of these properties:
extras: A pair of functions that return text to insert before or after thetargetPath, theparentModule, the Module object for theextras.before: A function that returns text to insert before theextras.after: A function that returns text to insert after the module'sinfect: Determines whether child modules are infected with the same changestrue to force child modules to inherit yourfalse.requirePaths: Additional paths to search for required modules. For example,
if requirePaths is set to ['/usr/lib/junk/modules'], and you save a
JavaScript module at /usr/lib/junk/modules/mymodule.js, you can require the
module as mymodule.
You can provide an array of paths, which will be searched before the default
module paths, or an object with the following properties:
requirePaths.before: An array of paths to search before the defaultrequirePaths.after: An array of paths to search after the default moduleBy default, the require path is not changed.
const requizzle = require('requizzle');
// Say hello and goodbye to each module.
const logRequire = requizzle({
extras: {
before: function(targetPath, parentModule) {
return 'console.log("Hello %s!", ' + targetPath + ');\n';
},
after: function(targetPath, parentModule) {
return 'console.log("Goodbye %s!", ' + targetPath + ');\n';
}
}
});
// Prints "Hello /path/to/mymodule.js!" and "Goodbye /path/to/mymodule.js!"
const myModule = logRequire('mymodule');
// Look for modules in the current module's `lib` directory, and force child
// modules to do the same.
const path = require('path');
const extraPathRequire = requizzle({
infect: true,
requirePaths: [path.join(__dirname, 'lib')]
});
// If `foo` needs to require a module in `./lib`, it can use `require('bar')`
// instead of `require('./lib/bar')`.
const foo = extraPathRequire('./foo');
Here are some problems you might run into when you use Requizzle, along with
solutions to each problem. If you run into any problems that aren't addressed
here, please file a new issue!
Requizzle adds minimal overhead to the module-loading process. However, your
code will run much slower than usual if you do both of the following:
infect option.require() calls within the scope ofIf Requizzle seems to slow down your app, look for module calls that are within
function scope, then move them to each module's top-level scope.
Do you have any
circular dependencies in
the modules that aren't working? Circular dependencies can cause unusual
behavior with Requizzle, just as they can without Requizzle. Try breaking the
circular dependency.
Fair enough.
node: prefix, as in require('node:fs').requirePaths option no longer inserts an extrarequirePaths option can now contain before andafter properties. Paths in the before property will be searched first; pathsafter property will be searched last.requirePaths option is used, the module loader nowRequizzle is very loosely adapted from Johannes Ewald's
rewire module, which is designed to modify a
module's behavior for unit testing. If Requizzle doesn't meet your needs, please
take a look at rewire!