Node.js 在节点应用程序之间共享代码
我们的应用程序由两个组件组成:API和客户端。两者都是独立的节点应用程序。虽然API除了文档之外没有任何前端组件,但它们仍然共享一些公共文件,如Jade组件、规范化CSS、实用程序模块,最重要的是Mongoose对MongoDB交互的模式和模型定义。我真的不想习惯这样一种工作流程:首先对API进行更改,然后将更改后的文件复制到客户端,反之亦然,因此找到一个可行的解决方案将非常好 跨节点应用程序共享杂项代码的最佳方式是什么? 在浏览网页时,我遇到了几种解决方案,但在这种情况下,它们都不起作用 一种解决方案是用公共文件制作一个节点模块,并在使用NPM的应用程序之间保持同步,但这意味着我(以及未来可能的开发人员)必须知道哪些文件是公共模块的一部分,并使用Node.js 在节点应用程序之间共享代码,node.js,git,version-control,npm,Node.js,Git,Version Control,Npm,我们的应用程序由两个组件组成:API和客户端。两者都是独立的节点应用程序。虽然API除了文档之外没有任何前端组件,但它们仍然共享一些公共文件,如Jade组件、规范化CSS、实用程序模块,最重要的是Mongoose对MongoDB交互的模式和模型定义。我真的不想习惯这样一种工作流程:首先对API进行更改,然后将更改后的文件复制到客户端,反之亦然,因此找到一个可行的解决方案将非常好 跨节点应用程序共享杂项代码的最佳方式是什么? 在浏览网页时,我遇到了几种解决方案,但在这种情况下,它们都不起作用 一种
require('node\u modules/mongo/schemas/example.js')
而不是require来要求它们('mongo/schemas/example.js')
例如,由于假设可能有数百个通用文件,因此不可能记住一个文件是否通用,尤其是对于新开发人员
另一个解决方案是为公共模块创建一个git子模块。这将是完美的,只要我能够将子模块路径包含到节点的require路径中,那么如果它没有在预期位置(比如,mongo/schemas/example.js
)找到所需的文件,它就会在公共子模块中查找(common/mongo/schemas/example.js
)。这太棒了,因为它允许用“本地”版本覆盖一个公共文件。这有点像Magento的工作原理。这里的问题是节点不允许编辑所需路径(至少在节点0.5之前是可能的),所以这是个麻烦
第三种解决方案是将公共存储库的内容残酷地合并到应用程序的根目录中。这种解决方案中没有真正无法克服的问题,但我觉得这是一种不好的做法。毕竟,这将使通过应用程序编辑公共文件变得不可能,因为无法有选择地将公共文件推送到common git repository。因此,基本上,这个解决方案只会让工作流变得更加乏味:对公共文件的所有修改都必须手动复制到公共代码库,推送到git remote,然后复制到另一个应用程序。因此,这个解决方案对我来说也绝对不会奏效
似乎第二种解决方案是我唯一的(也是最好的)选择,除非你们能想出一个更好的(我真的希望是:D)。如果有人知道如何更改节点的require路径,我将不胜感激
一种解决方案是用普通文件制作一个节点模块,并在应用程序与NPM之间保持同步
这是唯一一个好的解决方案。如果你有一个共享代码,它应该是一个模块
但这意味着我(以及未来可能的开发人员)必须知道哪些文件是公共模块的一部分,并使用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
,尽管它需要一些工作
你必须将你的代码库分割成一个逻辑模块。我想你的噩梦会证明使用NODE_PATH是合理的,但我真的建议你重构一下…我试图找到一个完全相同的问题的解决方案,并完成了我指出的所有事情。一切正常,但我知道我的工作流程可以改进。 尝试1:将远程依赖项添加到package.json并作为npm依赖项加载 不起作用,因为当Heroku在部署时安装依赖项时,它没有从github提取的ssh密钥,并且基本身份验证(公开的用户名和密码)不是一个选项 尝试2:git子模块救援 这带来了一系列已经在中讨论过的问题
我最终得到了一个(经过深思熟虑的)项目,它拥有一切 我使用标志运行我的应用程序:
node app --module api
或
并相应地加载依赖项
它可能不适合每一个项目,但如果您有模型、视图、模板、常量和更多跨应用程序、前端等共享的业务逻辑,那么权衡是非常好的。
我不认为现在的存储是一个问题,因此安装更多的依赖项和未使用的模块可能不是问题(同样,这取决于项目的大小和依赖项的数量,在我的情况下,这根本不是问题)
然后,您可以使用以下各项针对每个服务的特定于应用程序的任务:
grunt部署:API
,grunt部署:manager
,grunt:build:manager
,等等…好问题
“但这意味着我(以及未来可能的开发人员)必须知道哪些文件是公共模块的一部分,并使用require('node_modules/mongo/schemas/example.js')要求它们。”
事实并非如此,因为require
将根据文档在项目目录树中搜索节点_modules
文件夹
因此,您使用npm的第一个选项是非常好的。我实际上也在npm中制作了一个模块。一旦您设置了package.json,您可以使用npm version
和npm publish
发布到npmjs.org。然后您可以将所需的包放在其他项目中package.json并使用npm install
从npm下载所需版本
一个问题是,您必须在npmjs.org上打开源代码,所以如果您不这样做,那么
node app --module manager