Как разделить код между узлами.в JS приложений?


У меня есть несколько приложений в узле, которые все разделяют несколько модулей, которые я написал. Эти модули недоступны через 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 и т. д.)

5 54

5 ответов:

я получил эту работу, имея папки node_modules папки на разных уровнях-узел затем автоматически перемещается вверх, пока не найдет модуль.

Примечание вам не нужно публиковать в npm, чтобы иметь модуль внутри node_modules-просто используйте:

"private": true

внутри каждого из ваших частных пакета.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)

точка является узлом.js имеет механизм для работы с это уже и это потрясающе. Просто объедините его с трюком "private not on NPM", и вы хорошо пойдете.

короче a:

require('somemodule')

из приложения A или B будет каскадом вверх, пока он не найдет модуль-независимо от того, жил ли он ниже или выше. Действительно - это позволяет горячей замены местоположения без изменения require(...) заявления.

узел.документация по модулю js

узел рекомендует использовать npm link для создания собственного узла.Яш пакеты локально, а затем сделать их доступными для других приложений. Это простой четырехэтапный процесс.

типичной процедурой было бы сначала создать пакет со следующей структурой

  hello
  | index.js
  | package.json

типичная реализация этих файлов будет

.js
  exports.world = function() {
     return('Hello World');
  }

пакета.json

  {
    "name": "hello",
    "version": "0.0.1",
    "private": true,
    "main": "index.js",
    "dependencies": {
    },
    "engines": {
    "node": "v0.6.x"
    }
  }

'private: true' гарантирует, что npm будет откажитесь публиковать его в репозитории. Это способ предотвратить случайную публикацию частных репозиториев.

затем перейдите в корень папки приложения, запустите npm link, чтобы связать файл глобально, чтобы его можно было использовать в других пакетах.

теперь, чтобы использовать этот пакет в другом приложении, скажите hello-world со следующей структурой каталогов

 hello-world
 | app.js

перейдите в папку hello-world и запустите

 npm link hello

теперь используйте его как любой другой НПМ пакет как

приложение.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);

просто используйте правильный путь в вашем требовании вызова

например, на сервере.js это будет:

var moduleName = require('../shared_lib/moduleName / module.js');

важно знать, что, как только ваш путь начинается с '/', '../', или.' / 'путь относительно вызывающего файла.

для получения дополнительной информации о загрузке модулей узлов посещать: http://nodejs.org/docs/latest/api/modules.html

Да, вы можете ссылаться на shared_lib из app1, но затем вы столкнетесь с проблемой, если вы хотите упаковать и развернуть app1 в какой-либо другой среде, например на веб-сервере на AWS.

в этом случае вам лучше установить свои модули в shared_lib в app1 и app2 с помощью "npm install shared_lib/module". Он также установит все зависимости модулей shared_lib в app1 и app2 и будет иметь дело с конфликтами/дубликатами.

посмотреть этот: Как установить a отдельный модуль НПМ без моей регистрации?

если вы посмотрите узел.Яш документы, вы увидите этот узел.js понимает package.json формат файла, по крайней мере, бегло.

в принципе, если у вас есть каталог с именем foo и в этом каталоге-это package.json файл с парой ключ-значение:"main": "myCode.js", то если вы попытаетесь require("foo") и он находит эту папку с внутри, он будет использовать foo/myCode.js на foo модуль.

Итак, с вашей структурой каталогов, если каждый shared lib имеет свой собственный каталог с таким простым package.json файл внутри, то ваши приложения могут получить общие библиотеки по:

var lib1 = require('../shared_lib/lib1');
var lib2 = require('../shared_lib/lib2');

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