Мне нужно require () (скомпилировать и запустить со всеми зависимостями) файл javascript, который уже находится в строке в памяти. После того, как я запрошен и запущен, я хотел бы как-то получить все зависимости, которые были загружены в этом контексте, содержащиеся в этом файле (и возможных зависимых файлах).
Итак, если моя строка содержит:
module.exports = function(environment) {
let a = '';
let b = '';
if (environment === 'production') {
a = require('./a.js');
b = require('./b.js');
} else {
a = require('./a-dev.js');
b = require('./b-dev.js');
}
return { a, b };
};
Если я выполню указанную выше функцию следующим образом:
const result = function('production');
Я бы хотел, чтобы он возвращал { a: [Function], b: [Function] }
и каким-то образом знал, что он загружен ./a.js
и ./b.js
(и любые зависимости, которые они могут полагаться на).
В качестве альтернативы, если я выполню вышеуказанную функцию следующим образом:
const result = function('development');
, я ожидал бы вернуть то же самое, но теперь знаю, что этот файл загружен ./a-dev.js
и ./b-dev.js
У меня этот код работает, используя комбинацию ответов здесь: Загрузить node.js модуль из строки в памяти и из использования npm модуля загрузка из строки . Таким образом, код компилируется и запускается, и все зависимости загружаются правильно и выполняются, но мне не удалось получить список модулей, которые были загружены функцией _compile . Мне было интересно, есть ли более простой способ сделать это с помощью собственных библиотек NodeJS, таких как vm , или нет. Все ответы получены с благодарностью.
Спасибо
Вот мой код:
const Module = require('module');
const filepath = './madeup.js';
const source = [.. as above ..];
const m = new Module(filepath, parent);
m.filename = filepath;
m.paths = Module._nodeModulePaths(path.dirname(filepath));
m._compile(source, filepath);
parent && parent.children && parent.children.splice(parent.children.indexOf(m), 1);