Подтвердить что ты не робот

Как использовать код между приложениями 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 и т.д.)

4b9b3361

Ответ 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');

И это должно работать для обоих этих приложений.