Как использовать код между приложениями node.js?
У меня есть несколько приложений в node, которые все используют несколько модулей, которые я написал. Эти модули недоступны через npm. Я хотел бы иметь возможность свободно делиться между приложениями, но я не хочу копировать каталоги и не полагаюсь на Git. И я не очень большой для использования символических ссылок для этого.
Я хотел бы расположить каталоги примерно так:
app1
server.js
node_modules
(public modules from npm needed for app1)
lib
(my own modules specific to app1)
app2
server.js
node_modules
(public modules from npm needed for app2)
lib
(my own modules specific to app2)
shared_lib
(my own modules that are used in both app1 and app2)
Проблема, которую я вижу, заключается в том, что модули в shared_lib, похоже, запутываются относительно того, где найти модули, которые будут в каталоге node_modules того приложения, в котором они запущены. По крайней мере, я думаю, что это проблема.
Итак... что это хороший способ сделать это, чтобы избежать дублирования файлов? (обратите внимание, что мне не нужны дубликаты вещей в node_modules, так как это не мой код, я не проверяю их на Git и т.д.)
Ответы
Ответ 1
У меня это работает, имея папки node_modules на разных уровнях - node, затем автоматически перемещается вверх, пока не найдет модуль.
Обратите внимание, что вам не нужно публиковать в npm, чтобы иметь модуль внутри node_modules - просто используйте:
"private": true
Внутри каждого вашего личного файла package.json - для вашего проекта у меня будет следующее:
app1
server.js
node_modules
(public modules from npm needed for app1)
(private modules locally needed for app1)
app2
server.js
node_modules
(public modules from npm needed for app2)
(private modules locally needed for app2)
node_modules
(public modules from npm needed for app1 & app2)
(private modules locally for app1 & app2)
Точка node.js имеет механизм для борьбы с этим уже и это потрясающе. Просто соедините его с трюком "не на NPM", и вам хорошо идти.
Короче говоря:
require('somemodule')
Из приложения A или B будет каскад вверх, пока он не найдет модуль - независимо от того, жил он ниже или выше. Действительно - это позволяет вам "сменить" местоположение без изменения каких-либо инструкций require (...).
node.js документация по модулю
Ответ 2
В документации по npm рекомендуется использовать ссылку npm для локального создания собственных пакетов Node.js, а затем сделать их доступными для других приложений Node.js. Это простой четырехшаговый процесс.
Типичная процедура - сначала создать пакет со следующей структурой:
hello
| index.js
| package.json
Типичная реализация этих файлов:
index.js
exports.world = function() {
return('Hello World');
}
package.json
{
"name": "hello",
"version": "0.0.1",
"private": true,
"main": "index.js",
"dependencies": {
},
"engines": {
"node": "v0.6.x"
}
}
"private: true" гарантирует, что npm откажется опубликовать пакет. Это способ предотвратить случайную публикацию частных пакетов.
Затем перейдите в корень папки пакета Node.js. и запустите npm link
, чтобы связать пакет глобально, чтобы его можно было использовать в других приложениях.
Чтобы использовать этот пакет в другом приложении, например, "hello-world", со следующей структурой каталогов:
hello-world
| app.js
Перейдите в папку hello-world и запустите:
npm link hello
Теперь вы можете использовать его как любой другой пакет npm, например:
app.js
var http = require('http');
var hello = require('hello');
var server = http.createServer(function(req, res) {
res.writeHead(200);
res.end(hello.world());
});
server.listen(8080);
Ответ 3
Просто используйте правильный путь в требуемом вызове
Например, в server.js, который будет:
var moduleName = require ('../shared_lib/moduleName/module.js');
Важно Важно знать, что как только ваш путь имеет префикс "/", "../" или "./", путь относится к вызывающему файлу.
Для получения дополнительной информации о загрузке модуля узла посетите:
http://nodejs.org/docs/latest/api/modules.html
Ответ 4
Да, вы можете ссылаться на shared_lib из app1, но тогда вы столкнулись с проблемой, если хотите упаковать и развернуть приложение1 в другую среду, такую как веб-сервер на AWS.
В этом случае вам лучше установить свои модули в shared_lib на app1 и app2 с помощью "npm install shared_lib/module". Он также установит все зависимости модулей shared_lib в app1 и app2 и столкнется с конфликтами/дубликатами.
Смотрите это:
Как установить частный модуль NPM без моего собственного реестра?
Ответ 5
Если вы посмотрите node.js docs, вы увидите, что Node.js понимает файл package.json
формат, по крайней мере, легко.
В принципе, если у вас есть каталог с именем foo
, и в этом каталоге находится файл package.json
с парой ключ-значение: "main": "myCode.js"
, то если вы попытаетесь require("foo")
, и он найдет этот каталог с a package.json
внутри, то он будет использовать foo/myCode.js
для модуля foo
.
Итак, с вашей структурой каталогов, если каждая общая библиотека имеет собственный каталог с таким простым package.json
файлом внутри, то ваши приложения могут получить общие библиотеки:
var lib1 = require('../shared_lib/lib1');
var lib2 = require('../shared_lib/lib2');
И это должно работать для обоих этих приложений.