【问题标题】:Sharing code between Node applications在 Node 应用程序之间共享代码
【发布时间】:2014-02-23 01:11:19
【问题描述】:

我们的应用由两个组件组成:API 和客户端。两者都是独立的 Node 应用程序。虽然 API 除了文档之外实际上没有任何前端组件,但它们仍然共享一些通用文件,例如 Jade 组件、规范化 CSS、实用程序模块,最重要的是 Mongoose 用于 MongoDB 交互的模式和模型定义。我真的不想习惯这样的工作流程,我首先对 API 进行更改,然后将更改的文件复制到客户端,反之亦然,因此找到一个可行的解决方案会很棒。

在 Node 应用程序之间共享杂项代码的最佳方式是什么?

在浏览网页时,我遇到了几个解决方案,但在这种情况下,它们都没有真正起作用。

一种解决方案是从公共文件中创建一个节点模块,并使用 NPM 在应用程序之间保持同步,但这意味着我(以及未来可能的开发人员)必须知道哪些文件是公共模块的一部分,并要求他们使用 require('node_modules/mongo/schemas/example.js') 而不是 require('mongo/schemas/example.js') 例如。由于假设可能有数百个通用文件,因此无法记住文件是否通用,尤其是对于新开发人员而言。

另一种解决方案是制作公共模块的git子模块。这将是完美的,只要我可以将子模块路径包含到 Node 的 require 路径中,所以如果它在预期的位置(例如,mongo/schemas/example.js)找不到所需的文件,它会在公共子模块中查找(@ 987654325@)。这太棒了,因为它允许用“本地”版本覆盖公共文件。这有点像 Magento 的作品。这里的问题是 Node 不允许编辑 require 路径(至少,据说在 Node 0.5 之前它是可能的),所以这很糟糕。

第三种解决方案是将公共存储库的内容粗暴地合并到应用程序的根目录中。这个解决方案没有真正无法克服的问题,但我只是觉得这是一种不好的做法。毕竟,通过应用程序编辑公共文件是不可能的,因为没有办法选择性地将公共文件推送到公共 git 存储库中。所以基本上这个解决方案只会让工作流程更加乏味:对公共文件的所有修改都必须手动复制到公共代码库,推送到 git 远程,然后复制到其他应用程序。所以这个解决方案也绝对不适合我。

似乎第二种解决方案是我唯一(也是最好的)选择,除非你们想出一个更好的选择(我真的很希望 :D)。如果有人知道更改节点所需路径的方法,我将不胜感激。

【问题讨论】:

  • 很好的问题。我听到有人说您应该将所有代码放在 npmjs.org 中。但这只有在您可以开源的情况下才可行。你可以创建一个私有的 npm repo,但我从来没有这样做过。 stackoverflow.com/questions/7575627/…

标签: node.js git version-control npm


【解决方案1】:

一种解决方案是从公共文件中创建一个节点模块,并使用 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 虽然值得一提的是,如果您有私有模块,您也可以使用 git repo(例如在 github 上)来托管模块。再加上 git 标签,您仍然可以获得语义版本控制。见devthought.com/2012/02/17/npm-tricks
  • @MarkS.Everitt,不幸的是,你不会使用 git 标签获得语义版本控制,npm don't support it。您必须使用 yapmvisionmedia/npm 才能使其正常工作。
  • PS:建议是正确的,您可以使用私有注册表或 github 存储库来执行此操作
  • Ups,你当然是对的。这就是我玩 TJ 的 npm fork 所得到的。 Git 标签确实适用于常规 npm,但被固定。
  • 虽然这可能适用于 mongo 模式等,但您将如何处理静态资产,例如 /js/index.js 或其他什么?它们是否也应该放在模块中,例如[app_name]-assets/js/index.js?我感觉 Express 的静态文件处理效果不太好。
【解决方案2】:

我试图为您的完全相同的问题找到解决方案,并做了我指出的所有事情 in your other question。一切正常,但我知道我的工作流程可以改进。

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

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

尝试 2:使用 git 子模块进行救援

这带来了your other question中已经讨论过的一堆问题。


我终于完成了一个(深思熟虑的)拥有一切的项目

我使用标志运行我的应用程序:

node app --module api

node app --module manager

并相应地加载依赖项。

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

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

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

【讨论】:

  • 感谢您的意见,我一定会调查的!
  • 对不起,我的问题有点晚了,但我现在面临同样的问题。您如何管理“--module”参数? package.json 文件中是否有任何模块参数的配置选项,或者您只是使用 app.js 中的 process.argv 参数来检测您必须加载/运行哪个模块?
  • 在这种情况下,--module 参数由 app.js 文件处理(node app ... 隐式运行当前工作目录的 app.js 文件)。您的app.js 应该是唯一的入口点,解析命令行标志并基于此导入/运行模块。您可以使用类似:npmjs.com/package/yargs 来解析参数并以您喜欢的任何方式启动应用程序。希望这会有所帮助!
【解决方案3】:

很好的问题。

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

这实际上是不正确的,因为require 将根据 Loading from node_modules Folders 文档在项目目录树中搜索 node_modules 文件夹。

所以您使用 npm 的第一个选择是一个非常好的选择。实际上,我也在 npm 中制作了一个模块。设置好 package.json 后,您可以使用 npm versionnpm publish 发布到 npmjs.org。然后,您可以将所需的包放入您的其他项目 package.json 并使用 npm install 从 npm 下载所需的版本。

一个问题是你必须在 npmjs.org 上开源你的代码,所以如果你不想,你需要 create your own private npm repo

干杯。

【讨论】:

  • 是的,node_modules 示例有点误导,因为它没有描述整个问题。我不认为我可以使用节点模块非常有效地存储静态文件,如 JS 或 CSS,因为它们是在 /public 目录之外处理的,而且我不确定如何将静态资产路由到 node_modules 之外弄乱应用程序的本地资产路由。此外,我们的代码是私有的,所以 npmjs.org 不是一个选项,并且制作我们自己的 npm repo 似乎是一个项目本身。
  • 对于requirement :D 你可以在browserify.org尝试browserify
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2012-12-24
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多