Как загрузить модуль node, как если бы текущий модуль находился где-то в другом месте?
У меня есть код nodejs, работающий где-то в модуле. Из этого модуля я хотел бы загрузить модуль, расположенный в совершенно другом месте файловой системы - например, учитывая путь "/another/dir"
и имя модуля "foo"
, я бы хотел, чтобы Node действовал как если модуль, запущенный в /another/dir
вызвал require("foo")
, а не мой собственный модуль.
My code is running here
/some/folder/node_modules/mine/my_module.js
I have the path "/another/dir/", the string "foo",
and want to load this module
/another/dir/node_modules/foo/index.js
Другими словами, документация модуля относится к процессу "require (X) от модуля по пути Y", и я хотел бы указать мое собственное значение для Y
Можно ли это сделать? Если да, то как? Если нет, то почему?
Ответы
Ответ 1
Самое простое, это просто преобразование пути в абсолютный путь, это будет рекомендуемый подход для большинства, если не для всех случаев.
var path = require('path');
var basedir = '/another/dir';
var filename = 'foo'; // renamed from dirname
var filepath = path.join(basedir, 'node_modules', filename);
var imports = require(filepath);
Если вам действительно нужно сделать require действовать так, как если бы он находился в другом каталоге, вы можете module.paths
базовый каталог в module.paths
module.paths.unshift('/another/dir/node_modules');
var imports = require('foo');
module.paths.shift();
module.paths
также может быть изменен извне через переменную окружения NODE_PATH
, хотя это будет наименее рекомендуемый подход, но при этом он применяется глобально для всех модулей.
Ответ 2
Симлинк с ссылкой на npm
Чтобы избежать проблем или изменить исходный код, я бы использовал ссылку npm из вашего примера:
cd /another/dir/node_modules/foo # go into the package directory
npm link # creates global link
Это создаст глобальную ссылку для модуля foo
, для Linux вам необходимы права root.
Затем:
cd /some/folder/ # go into some other package directory.
npm link foo # link-install the package
/some/folder/package.json
должен содержать foo
как /some/folder/package.json
, не является обязательным, без него вы получите extraneous
предупреждение с помощью npm ls
:
"dependencies": {
[...]
"foo": "*"
}
Нет символической ссылки с локальным NODE_PATH
Вам не нравятся символические ссылки? Вы по-прежнему можете использовать NODE_PATH
но вместо этого локально устанавливаете глобальную переменную, как предложил @rocketspacer, потому что, как он правильно сказал, не рекомендуется использовать ее глобально.
Примечание. В любом случае я бы использовал переменную User, а не общесистемную переменную, сотрудник мог войти в систему с другим именем пользователя на том же компьютере и все же получить измененный NODE_PATH
.
Но чтобы сделать это локально всего за один вызов в Linux, вы можете просто позвонить:
NODE_PATH=$NODE_PATH:/another/dir/node_modules npm start
Он будет использовать этот NODE_PATH
только для этого вызова.
Это же один раз вызов в Windows:
@ECHO OFF
SET BASE_NODE_PATH=%NODE_PATH%
SET NODE_PATH=%BASE_NODE_PATH%;C:\another\dir\node_modules\
node index.js
SET NODE_PATH=%BASE_NODE_PATH%
А также...
Вы также можете использовать локальное хранилище, например:
"dependencies": {
"foo": "file:/another/dir/node_modules/foo"
}
Но потребует npm install
и скопирует содержимое foo
в папку node_modules
текущего пакета.
Ответ 3
Это довольно легко достичь, просто добавьте абсолютные пути к объекту модуля
в текущем script /some/folder/node_modules/mine/my_module.js
добавить это
module.paths.push('/another/dir/node_modules');
//this must be absolute, like /Users/John/another/dir/node_modules
var foo = require('foo');
Для демонстрации откройте node в терминале и введите module.paths
, он покажет, что весь путь node будет искать require
, вы просто добавите свой путь
Ответ 4
"требуют (X) от модуля по пути Y"
Средство вызова требует (X) из файла, расположенного по пути Y. Таким образом, вы практически не можете изменить Y.
Хотя вышеупомянутые решения работают (модифицируя module.paths и требуя абсолютного пути), вам придется добавлять эти фрагменты к каждому файлу вашего проекта, где вам понадобятся внешние модули.
Более того, модификация module.paths официально не поддерживается. Поэтому он не гарантирует работу в будущих обновлениях node
Представляем NODE_PATH
NODE_PATH - это переменная среды, которая настроена на список абсолютных путей, разделенных двоеточием.
В этих абсолютных путях Node.js будет искать модуль, соответствующий вашему требованию, когда все остальное потерпело неудачу (индексировав node_modules до корня файловой системы и не получив совпадения)
Официально поддерживается, хотя и не рекомендуется, поскольку это противоречит конвенции (ваш сотрудник может не знать об использовании NODE_PATH, так как нет описательного способа сообщить об этом в самом проекте)
Примечания:
- В Windows NODE_PATH разделяется точкой с запятой, а не
колоны.
- Node не ищет node_modules в пределах таких путей, как
его поведение по умолчанию, поэтому ваши пути должны быть именно там, где вы
содержат необходимые модули. Например: "/another/dir/ node_modules"
Подробную информацию можно найти в официальном документе NodeJs:
https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
Для тех из вас, кто не знает, какие переменные среды и как их установить, у меня есть скриншот Windows, который поможет вам начать работу
![введите описание изображения здесь]()
Ответ 5
В простых строках u может вызывать вашу собственную папку как модуль:
Для этого нам нужен: глобальный и модуль app-module-path
здесь "модуль-модуль-модуль" - это модуль, он позволяет добавлять дополнительные каталоги в путь поиска модуля Node.js. И "глобальный" - все, что вы прикрепляете к этому объекту, будет доступно везде ваше приложение.
Теперь взгляните на этот фрагмент:
global.appBasePath = __dirname;
require('app-module-path').addPath(appBasePath);
__ dirname - текущая работающая директория Node. Вы можете указать свой собственный путь для поиска пути к модулю.