如何在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?