在Node应用程序之间共享代码

我们的应用程序由两个组件组成:API和客户端。 两者都是独立的Node应用程序 尽pipeAPI除了文档之外还没有任何前端组件,它们仍然共享一些常见文件,如Jade组件,规范化CSS,实用程序模块,最重要的是用于MongoDB交互的Mongoose模式和模型定义。 我真的不想习惯于我首先对API进行更改的工作stream程,然后将更改后的文件复制到客户端,反之亦然,所以find一个可行的解决scheme将是非常好的。

跨Node应用程序共享各种代码的最佳方式是什么?

在浏览网页时,我遇到了一些解决scheme,但在这种情况下,他们都没有真正的工作。

一种解决方法是从公共文件中创build一个节点模块,并使其与具有NPM的应用程序保持同步,但是这意味着我(以及未来可能的开发者)必须知道哪些文件是公共模块的一部分,并且需要它们用require('node_modules/mongo/schemas/example.js')代替require('mongo/schemas/example.js') 。 由于假设可能有数百个通用文件,所以不可能记住文件是否通用,特别是对于新的开发者。

另一个解决scheme是制作通用模块的git子模块。 这将是完美的,如果只有我可以包含子模块path的节点的要求path,所以万一没有find所需的文件在预期的位置(例如, mongo/schemas/example.js ),它会看起来在常见的子模块( common/mongo/schemas/example.js )。 这将是非常棒的,因为它将允许覆盖“本地”版本的公共文件。 这有点像Magento的作品。 这里的问题是,Node不允许编辑requirepath(至less,据说在Node 0.5之前是可能的),所以这是一个好消息。

第三种解决scheme是将公共存储库的内容粗暴地合并到应用程序的根目录中。 在这个解决scheme中没有真正不可逾越的问题,但我觉得这是一个不好的做法。 毕竟,这将不可能通过应用程序编辑通用文件,因为没有办法select性地将通用文件推送到通用的git存储库。 所以基本上这个解决scheme只会使工作stream程变得更乏味:对公共文件的所有修改都必须手工复制到公共代码库,然后推送到git remote,然后复制到其他应用程序。 所以这个解决scheme绝对不会为我削减。

看来第二个解决scheme是我唯一的(也是最好的)select,除非你们提出了一个更好的(我真正希望的是:D)。 如果有人知道改变节点需求path的方法,我将非常感激。

一种解决scheme是使公共文件中的节点模块与使用NPM的应用程序保持同步

这是唯一的一个很好的解决scheme。 如果你有一个共享的代码,它应该是一个模块。

但这意味着我(以及未来可能的开发者)必须知道哪些文件是公共模块的一部分,并且需要require('node_modules / mongo / schemas / example.js')而不是require('mongo / schemas / example.js')例如

require('mongo/schemas/example.js')而不是require('./mongo/schemas/example.js') 。 或者更好的是, require('mongo').Schemas.example ,尽pipe它需要一些工作。

你必须将你的代码分解成一个逻辑模块。 我想那种恶梦你会有理由使用NODE_PATH,但我真的build议重构一下…

我试图find一个解决scheme,完全相同的问题,并做了我在你的其他问题中指出的所有事情。 一切正常,但我知道我的工作stream程可以改善。

尝试1: 将远程依赖项添加到package.json并加载为npm依赖项

没有工作,因为当Heroku在部署时安装依赖关系时,它没有从github提取的ssh密钥,并且基本auth(暴露的用户名和密码)不是一个选项。

尝试2: git submodules来救援

这带来了一堆已经在你的另一个问题中讨论的问题 。


我终于结束了一个(深思熟虑)的项目,一切都有。

我用一个标志运行我的应用程序:

 node app --module api 

要么

 node app --module manager 

并相应地加载相关性。

它可能不适合每一个项目,但如果你有模型,视图,模板,常量和更多的业务逻辑共享应用程序,前端和什么的权衡是非常好的。 我不认为存储现在是一个问题,所以安装更多的依赖和未使用的模块可能不是一个问题(再次,这取决于项目的大小和依赖的数量,在我的情况下,它不是一个问题)。

然后,您可以使用grunt针对每个服务的应用程序特定任务:

grunt deploy:APIgrunt deploy:managergrunt:build:manager等…

很好的问题。

“但是这意味着我(以及未来可能的开发者)必须知道哪些文件是公共模块的一部分,并且需要require('node_modules / mongo / schemas / example.js')”

这实际上并不正确,因为require将根据从node_modules文件夹文档加载,在项目目录树中searchnode_modules文件夹

所以你的第一个select使用npm是一个非常好的select。 实际上我也是在npm中创build了一个模块。 一旦你设置了package.json,你可以使用npm versionnpm publish来发布到npmjs.org。 然后你可以把你需要的软件包放在你的其他项目package.json中,并使用npm install从npm下载所需的版本。

一个问题是,你必须在npmjs.org上开源代码,所以如果你不想,你需要创build自己的私人npm回购

干杯。