1

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

    Var http = require('http');

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

非常感谢您的帮助。

4

2 回答 2

2
  • 库只是相互关联的众多模块、类、函数等的集合。

  • 框架是库的一种类型或一部分,它设置为供您在其之上构建,而不仅仅是调用。库和框架之间的区别有时会有点模糊。

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

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

    不过,框架也可以超越代码进入工具。Compound.js可执行文件就是一个很好的例子。

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

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

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

    Express 的 API 是:

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

    等等

于 2013-08-02T20:23:42.893 回答
1

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

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

要求('someNPMINStalledModule')

要求('./someFileInYourCodeBase.js')

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

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

于 2013-08-02T20:05:58.290 回答