module: add createRequireFunction method

PR-URL: https://github.com/nodejs/node/pull/19360
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: Bradley Farias <bradley.meck@gmail.com>
Reviewed-By: John-David Dalton <john.david.dalton@gmail.com>
This commit is contained in:
Gus Caplan 2018-03-14 18:36:59 -05:00
parent e636addc3f
commit 246f6332e5
No known key found for this signature in database
GPG Key ID: F00BD11880E82F0E
3 changed files with 38 additions and 2 deletions

View File

@ -888,12 +888,30 @@ by the [module wrapper][]. To access it, require the `Module` module:
const builtin = require('module').builtinModules;
```
### module.createRequireFromPath(filename)
<!-- YAML
added: REPLACEME
-->
* `filename` {string} Filename to be used to construct the relative require
function.
* Returns: {[`require`][]} Require function
```js
const { createRequireFromPath } = require('module');
const requireUtil = createRequireFromPath('../src/utils');
// require `../src/utils/some-tool`
requireUtil('./some-tool');
```
[`__dirname`]: #modules_dirname
[`__filename`]: #modules_filename
[`Error`]: errors.html#errors_class_error
[`module` object]: #modules_the_module_object
[`path.dirname()`]: path.html#path_path_dirname_path
[GLOBAL_FOLDERS]: #modules_loading_from_the_global_folders
[`require`]: #modules_require
[exports shortcut]: #modules_exports_shortcut
[module resolution]: #modules_all_together
[module wrapper]: #modules_the_module_wrapper

View File

@ -23,6 +23,7 @@
const { internalBinding, NativeModule } = require('internal/bootstrap/loaders');
const util = require('util');
const { pathToFileURL } = require('internal/url');
const vm = require('vm');
const assert = require('assert').ok;
const fs = require('fs');
@ -54,7 +55,6 @@ module.exports = Module;
let asyncESM;
let ModuleJob;
let createDynamicModule;
let pathToFileURL;
let decorateErrorStack;
function lazyLoadESM() {
@ -63,7 +63,6 @@ function lazyLoadESM() {
createDynamicModule = require(
'internal/modules/esm/create_dynamic_module');
decorateErrorStack = require('internal/util').decorateErrorStack;
pathToFileURL = require('internal/url').pathToFileURL;
}
const {
@ -750,6 +749,13 @@ Module.runMain = function() {
process._tickCallback();
};
Module.createRequireFromPath = (filename) => {
const m = new Module(filename);
m.filename = filename;
m.paths = Module._nodeModulePaths(path.dirname(filename));
return makeRequireFunction(m);
};
Module._initPaths = function() {
var homeDir;
var nodePath;

View File

@ -0,0 +1,12 @@
'use strict';
require('../common');
const assert = require('assert');
const path = require('path');
const { createRequireFromPath } = require('module');
const p = path.resolve(__dirname, '..', 'fixtures', 'fake.js');
const req = createRequireFromPath(p);
assert.strictEqual(req('./baz'), 'perhaps I work');