模块化编程和节点

更新1 :我在这一方面取得了很多进展。 我几乎放弃了(至less现在,但也许长期)允许用户上传模块的想法。 但是,我正在开发一个结构,以便可以定义和加载几个模块。 一个模块将被初始化,设置自己的路由,并有一个“公共”目录来提供Javascript服务。我越发现,我越发意识到我可以(应该)也移动现在系统范围内的调用在一个叫做“系统”的模块中。

更新2 :我已经在这方面取得了巨大的进展。 我即将在GitHub上提交大量的代码,这将允许人们使用Node和Express来完成非常好的模块化编程(模块公开了客户端和服务器端代码)。 敬请期待。

更新3 :我重写这个东西作为一个系统来注册模块,并使他们能够通过事件/钩子系统进行通信。 这是非常好的。 我有很多代码已经很好了 – 我只是把它移植到新的系统上。 请随时查看GitHub上的项目: https : //github.com/mercmobily/hotplate )

更新4 :这是很好的。 事实certificate,我关于一个模块是客户端和服务器的想法是真正的工作。

更新5 :模块越来越接近可用的东西。 我实现了一个新的loader,它将考虑init()函数将调用的所有()函数,并确保提供该钩子的模块将被首先加载。 这开辟了一个全新的水平。

更新6 :烤盘现在接近12000行代码。 到二月份的某个时候,我想可能会接近20000行代码。 它做了很多东西,这一切都从StackOverflow开始! 我需要它来开发我自己的SaaS,所以我真的需要在二月份之前完成它(这样我可以冲刺到七月份,完成第一个版本的BookingDojo)。 谢谢大家!

我写的东西可能会变成一个相当大的软件。 简单的说就是nodejs + Express + Mongodb / Mongoose + Dojo(客户端)。

注:本文中的问题标记为[Q1],[Q2]等

来自Drupal的背景(并知道它是如何coooomplex进化的,我想避免的东西),我有点模块怪胎。 目前,我已经完成了应用程序的样板(hotplate: https : //github.com/mercmobily/hotplate )。 它做所有的无聊的东西(用户,工作区,密码提醒等),它缺less了几件。

我想提出一个devise,将允许与Drupal(但可能更好)类似的模块。 那是:

  • 模块可以定义新的路线,并处理它们
  • 模块安装在系统范围内,然后每个工作区都可以启用它们的集合列表

最初的架构可能是这样的:

  • 一个“modules”目录,每个模块有一个目录
  • 每个模块都有一个用于Javascript一侧的“公共”文件的目录
  • 每个模块都会有public / startup.js,这些都会包含在应用程序的javascript中
  • 每个模块都有server / node.js,如果/需要的话,这些server / node.js将被服务器dynamic地包含在内
  • 会定义一个路由,比如/app/:workspaceid/modules/MODULE_NAME/.*,带有一个中间件,用于检查工作空间是否启用了MODULE_NAME,如果是,则使用传入的参数调用模块的函数

[Q1]:这是否有些含糊不清?

问题:

  • 我想使这个dynamic。 当需要的时候,我希望需要模块。 这应该很容易做,通过要求的东西在飞行。

  • server / node.js会有一个叫做的函数,但是这个函数感觉像一个路由器本身

[Q2]你对这个有什么特别的提示吗?

这似乎不是太多的关注。 但是,当谈到安全性时,真正的问题就来了。

  • 隐私。 这是一个讨厌的问题。 目前,所有的调用将通过workspaceId对mongoDb进行正确的查询。 我想强制执行某些方式,以使模块不能清楚地访问数据库,以便每个模块不能访问属于其他工作区的数据

  • 用户定义的模块。 我很乐意让用户能够上传自己的模块(也许可以让其他用户使用)。 但是,这实际上意味着允许人们上传将由节点本身执行的代码! 你会怎么做呢?

[Q3]你会如何处理这些隐私/安全问题? 有没有办法在一种节点沙箱中运行用户上传的代码? 如何访问文件系统等?

谢谢!

最后,我自己回答了这个问题。 答案是:hotplate, https : //github.com/mercmobily/hotplate

它大部分是我上面描述的。 更重要的是,使用hotPlate(使用hotPage和hotClientPages,默认可用),您可以编写一个模块

  1. 定义一些路线
  2. 用UI定义一个“公共”目录
  3. 定义加载该模块时必须加载的特定CSS和JS文件
  4. 如果需要,可以添加路由特定的JSes

状态 :我正在接受这个答案,因为我完成了开发Hotplate的“核心”,这就是这个答案的要点。 我仍然需要“做”事情(例如,一旦我写了文档,我将确保“hotplate”是模块中的唯一目录,没有示例服务器)。 但是,基础就在那里。 就“核心”而言,它只是真的错过了故事的“authentication”方面(这需要大量的思考,因为我想使它与数据库不可知且与护照接口)。 Dojo小部件是一个很好的奖励,虽然这个框架可以与任何东西一起使用(事实上骨干特定的代码将被sweeeeet)。

什么hotplate不做

什么hotplate不做,是给用户上传模块,然后将被加载到应用程序的能力。 这非常棘手。 客户端不会那么糟糕(用户可以定义Javascript来上传,可能有一个模块来做到这一点,没有问题)。 然而,服务器端最多也是棘手的。 有太多东西可能会出错(客户端可能会上传一个阻塞的代码块,或者他们可能会开始读取文件系统,他们将访问完整的数据库,等等)。 这些问题的解决scheme是可能的 ,但是它们都不是很容易的(例如,你可以将用户的节点环境封闭在不同的端口上运行,等等),但是一些问题仍然存在。 但是,总有希望。