node.js - 在 Node 应用程序之间共享代码

标签 node.js git version-control npm

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

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

在浏览网页时,我遇到了几个解决方案,但在这种情况下没有一个真正有效。

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

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

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

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

最佳答案

One solution is to make a node module out of the common files and keep it in sync between the apps with NPM

这是唯一一个好的解决方案。如果您有共享代码,它应该是一个模块。

but that would mean I (and possible future devs) have to know which files are part of the common module, and require them with require('node_modules/mongo/schemas/example.js') instead of require('mongo/schemas/example.js') for example

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

您必须将代码库拆分为逻辑模块。我想你在那里遇到的那种噩梦证明使用 NODE_PATH 是合理的,但我真的建议重构它......

关于node.js - 在 Node 应用程序之间共享代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21461465/

相关文章:

git push 到远程分支

javascript - 如何使用带有 sha512 算法的 JavaScript 对字符串进行哈希处理

git - 如何查看所有未推送到远程分支的本地提交?

git - SSH key 混淆,2 个快速问题

version-control - 通过 ssh 推送后如何强制 rhodecode 使缓存无效

svn - 我是否需要定期调用 svnadmin pack

node.js - 如何在netbeans中为ejs文件语法高亮

javascript - Node 请求 - 想要在完成后返回路径/文件名吗?或者任何最佳实践建议

javascript - Discord.js 从旧消息中读取 react

Git rebase vs 重新创建分支并应用更改