如何在node.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中的模块似乎弄糊涂到哪里去find哪些应用程序运行在node_modules目录中的模块。至less我认为这是问题所在。
那么….什么是避免重复文件的好方法呢? (注意,我不关心node_modules中的东西的重复,因为这些不是我的代码,我不检查它们到Git等)
通过在不同层次上使用node_modules文件夹,我得到了这个工作 – 节点然后自动向上遍历直到find模块。
注意你不必发布到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将级联向上,直到find该模块 – 无论是住在较低或更高。 事实上 – 这可以让你在不改变任何require(…)语句的情况下热插拔位置。
node.js模块文档
Nodebuild议使用npm链接在本地创build自己的node.js包,然后使其可用于其他应用程序。 这是一个简单的四步过程。
典型的过程将是首先创build具有以下结构的包
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将拒绝发布到版本库。 这是防止私人存储库意外发布的一种方法。
然后导航到应用程序文件夹的根目录,运行npm链接来全局链接文件,以便可以在其他包中使用。
现在在另一个应用程序中使用这个包,用下面的目录结构说出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);
只需在您的需求调用中使用正确的path
例如在server.js中将是:
var moduleName = require('../ shared_lib / moduleName / module.js');
重要的是要知道,只要你的path前缀'/','../',或'./'path是相对于调用文件。
有关节点模块加载的更多信息,请访问: http : //nodejs.org/docs/latest/api/modules.html
如果您查看了node.js文档 ,您将看到Node.js也理解package.json
文件格式,至less是光标。
基本上,如果你有一个名为foo
的目录,并且在那个目录下是一个包含键值对"main": "myCode.js"
的package.json
文件,那么如果你试图require("foo")
,find这个目录里面有一个package.json
文件,它将使用foo/myCode.js
作为foo
模块。
因此,对于你的目录结构,如果每个共享库都有自己的目录,里面有这样一个简单的package.json
文件,那么你的应用程序可以通过以下方式获得共享库:
var lib1 = require('../shared_lib/lib1'); var lib2 = require('../shared_lib/lib2');
这应该适用于这两个应用程序。
是的,您可以从app1引用shared_lib,但是如果要将app1打包并部署到其他某个环境(例如AWS上的Web服务器),则会遇到问题。
在这种情况下,最好使用“npm install shared_lib / module”将模块安装到shared_lib到app1和app2。 它还将在app1和app2中安装shared_lib模块的所有依赖关系,并处理冲突/重复。
看到这个: 如何安装一个私人的NPM模块没有我自己的registry?