Как разделить код между узлами.в 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 ответов:
я получил эту работу, имея папки 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(...) заявления.
узел рекомендует использовать npm link для создания собственного узла.Яш пакеты локально, а затем сделать их доступными для других приложений. Это простой четырехэтапный процесс.
типичной процедурой было бы сначала создать пакет со следующей структурой
hello | index.js | package.json
типичная реализация этих файлов будет
.jsexports.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');
и это должно работать для обоих этих приложений.