【问题标题】:General terminology put into context结合上下文的通用术语
【发布时间】:2013-08-04 04:52:49
【问题描述】:

我在学习任何其他编程语言之前学习了 Java 编程。当我学习 Node.js 时,我把所有的术语都弄糊涂了。我一直认为 API 是一个包含方法、类等的库,有人构建它以使我们的生活更轻松。然后我了解了模块,我基本上认为它与 API(某人已经构建的方法列表)相同。然后,我了解了 Express 框架,它也是一个方法列表,就像一个模块和一个 API。此外,我们将这些功能整合到我们的程序中的方式都是通过执行类似

    Var http = require('http');

因此,了解这些术语之间区别的人能否将这些术语放在可以解决我的问题的上下文(示例)中。

非常感谢您的帮助。

【问题讨论】:

    标签: node.js api frameworks module terminology


    【解决方案1】:
    • 库只是众多相互关联的模块、类、函数等的集合。

    • 框架是库的一种类型或一部分,您可以在此基础上进行构建,而不仅仅是调用。而且库和框架之间的区别有时会有点模糊。

      使用 Express,您可以在 Application 及其 Router 的基础上进行构建,后者处理传入请求并确定何时调用您的代码。

      app.get('/', function (req, res) {
          // ...
      });
      

      不过,框架也可以从代码扩展到工具。 compound.js'executable 就是一个很好的例子。

    • 模块是库或框架的一个单独部分。对于 Node,它是一个脚本文件和从脚本导出的 Object

    • API 是您如何与库、框架或模块交互的摘要/描述。

      这通常是您在文档中可以找到的内容,是可访问的成员、他们的名字、他们的类型、他们接受的参数等等。

      Express' API 是:

      • express
        • 类型:function
        • 命名参数:(无)
        • 返回:Application
        • 成员
          • listen
          • 类型:function
          • 命名参数:
            • 姓名:port
            • 类型:Number

      等等

    【讨论】:

    • @jensiepoo 是的,这似乎是一个很好的思考方式。 Wikipedia 实际上包含一个很好的“将它们与普通库区分开来的特征”列表。不过,请注意,框架可以包含与您的代码使用的 API 一起使用的其他工具(IDE 等)的工具或插件。
    【解决方案2】:

    这在很大程度上是一个固执己见的问题。但我将尝试提供一些 Node 社区常用的术语,以及它们之间的大致事实差异。

    与 Node 相关的

    模块 与您将与 Java 库相关联的模块非常相似。它为 Node 用户发现他们经常做的事情提供了一个包装器。经常围绕节点库函数提供包装器来做每个人都想做的事情。一个简单的例子是递归文件系统阅读器,比如扳手。模块还扩展到用于模块化代码的文件。例如,模块不仅通过 NPM 安装,而且在标准 OOP 实践下,您作为代码库的一部分编写的单独的 javascript 文件以分隔代码功能。

    require('someNPMINStalledModule')

    要求('./someFileInYourCodeBase.js')

    两者都是模块。一个是通过 NPM 安装的,位于 node_modules 目录中,在您启动节点的目录中。后一个示例是位于您启动节点的目录中的 javascript 文件。

    还有框架。在核心上,它们与模块做同样的事情,但是,它们旨在更广泛地传播,并真正改变你使用 node.js 的方式。在 Java 世界中,Express 之类的框架类似于 Grails 之类的东西。您仍然可以包含并执行您在 Java 中可以做的所有事情,但是 grails 为您包装了一些东西,并提供了方便的强大方法调用,以便以不那么冗长的方式完成批量工作。最后,您会得到功能上等价的代码,但 Grails 允许您通过更通用的语言,用更少的代码行完成更多工作。但是,正如我所说,当 Grails 不提供您需要的功能时,它仍然允许您使用本机代码。以“几行代码”为代价,您添加了抽象层、额外的函数调用等。这种区别并不重要,除非您是一个非常关心风格的人。如果您在代码中包含一个普通的节点 http 服务器,一个核心 ExpressJS 开发人员可能不会喜欢它。与其说是因为它是无效的 Node,不如说是从性能角度来看有任何不同,它破坏了您的代码风格。如果您的代码使用框架,则应坚持使用该框架中使用的编码约定。但是,如果您使用像 wrench 这样的模块来递归搜索目录,那么使用 fs.readFile 来读取单个文件在风格上仍然是完全可以接受的。

    然后是迷你应用程序,它是一个模块,可让您快速启动简单的事情,例如提供文件。例如:http-server 将使用简单的命令行将文件目录服务到您希望的任何端口。您不会在自己的代码中使用“require”来使用它们,但这种类型的模块确实可以成为节点提供的一些最有用的东西,我强烈建议使用一些。 (Nodemon、http-server 和 grunt 是一些非常有用的模块示例,它们可以帮助您更轻松地进行开发)

    终于有了原生扩展。 Node 提供的并发来自 V8 后端。在纯 JavaScript 中复制它是不可能的,编写真正异步代码的唯一方法是利用 Node API 提供的异步操作,使用 process.nextTick 执行一些非常奇怪的逻辑,fork 子进程或编写本机扩展。原生扩展提供了 Node 不提供的真正并发操作。数据库通信是最明显的例子,但任何人都可以开发一个 C++ 扩展来产生线程来完成工作。还有一个非常方便的模块,它启动线程来处理称为“threads a gogo”的 Javascript 位。它简化了真正并发工作的启动,但如果您处于需要这些事情的位置,您可能会发现您在用例中使用了错误的语言。归根结底,这些与模块在您使用它们的方式上没有什么不同,但意识到它们可以为 NodeJS API 不提供的 I/O 类型的操作提供额外的并发方法这一事实是一个独特且非常重要的区别。

    【讨论】:

    • 我以前从未学习过 Grails。也就是说,为什么在其他编程语言(例如 java)中没有必要时,我们似乎需要在 node.js 中合并某个框架。
    • 您不必这样做。这只是一种常见的做法,因为 Node API 还很年轻,所以有很多人试图改进语法/样式。
    猜你喜欢
    • 2018-08-23
    • 2011-06-20
    • 2011-06-16
    • 2020-05-24
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多