这在很大程度上是一个自以为是的问题。但我会尝试提供一些 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 类型的操作提供额外的并发方法这一事实是一个独特且非常重要的区别。