NodeJS Как скомпилировать, запустить и определить зависимости из кода javascript в строке? - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно 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);
...