Node.js是框架吗?[关闭]


35

我一直看到招聘人员,开发人员等将Node.js称为框架。我认为,这对Node.js的真正含义是无知的。

通常,在职位描述中,Node.js被分组为AngularJSReact等库中的库。通常,我认为它是由不知道差异的人(HR,招聘人员等)输入的。

我认为Node.js是一个平台或运行时环境。它将DOM API(浏览器中的JavaScript)切换为其他各种API,例如文件系统(因为它作为服务器运行,而不是在浏览器中运行)。

人们为什么认为Node.js是框架?我错了吗?它实际上是一个框架吗?



5
并非特别,但我可以看到混乱。
ndugger 2015年

1
很久以前,当节点首次出现时,我在SO上发布了一个答案,说该节点不是框架。那个时候那个答案被极度否定了。如今,很少有使用node的人认为这是一个框架。从某种意义上说,它是一个框架,Swift是一个框架,Go是一个框架,Rust是一个框架。现代编程语言仅具有非常高级的API,这些API过去曾被实现为框架。“平台”是个好词。我会说这是我自己的口译员(使用该词的传统unix含义)
slebetman 2015年

请注意,节点不会关闭DOM API,无论有无节点,您都可以使用javascript运行的任何内容。
罗布(Rob)

@slebetman口译员的“其他”含义是什么?我没有意识到那里也有辩论!:S
J. Abrahamson

Answers:


44

很难说,因为这些词的定义不明确。通常来说,我认为将Node.js称为框架确实有点不典型,但是我很难辩解为什么它不是真正的框架。

所有这些都变得扑朔迷离,而且我经常看到语言的使用非常差,所以我会明确地从下而上开始


JavaScript是一种计算机语言,狭义地讲,是一组约定,这些约定使我们能够阅读和解释一堆具有执行语义的文本,这是一个奇特的词,为“将语言解释为一组指令的方式”。叫程序类翻译编译器transpilers棉短绒荧光笔等,都以文本,并尝试做一些与如何执行代码这种传统的理解。

  • 口译实际执行通过操作一些设备,通常是你的电脑执行语义。您可以将它们视为计算机内的一个小人物,它会根据JavaScript程序中编写的指令,像“打印此字符”一样翻转开关。
  • 编译器尝试将JavaScript文本转换为具有不同语言的执行语义的一组新文本-也许具有计算机可以直接执行的特殊属性。
  • Transpilers是编译器的推广形式,他们采取在JavaScript中的文本和其他语言的文本输出。因此,差异有点主观,但通常人们会认为编译器输出的是非常低级的代码而是高级代码。
  • 棉短绒荧光笔类型检查器都以在JavaScript文本输出某种产品分析的,突出显示的文本例如,它是由执行语义的影响,但实际上并不代表它。

现在,让我们深入研究执行语义。通常,执行语义涉及读取语言文本并得出抽象机器的描述可观察到的副作用的描述的过程。我想建议的是,这两个都假设需要某种“低级API”来操作机器或执行可观察的效果。这些通常被认为是运行时环境的

  • 运行时环境运行时是一组假设原语的语言公约要求,以经营存在。就语言而言,可能会对它们的行为有一些假设,但它们是不可观察的。在上面解释器的图像中,“内部人员”只是轻拂运行时的开关-他无法亲自检查它们在做什么。

通常会滥用运行时一词来指代假定的原语本身及其实际实例化。


因此,现在我们有了一些毛病。语言是一组约定,它们假定存在运行时,以便为其执行语义提供含义。它永远不会“探究它们”,因为它们超出了范围。

为了实际使用一种语言,您需要诸如编译器或解释器之类的东西以及运行时实现。编译器/解释器和此运行时在实际执行代码时紧密结合。

  • Chrome的V8(通常称为引擎)是一种打包交易,其中包含与ECMA标准JavaScript约定所需的运行时接口兼容的解释器,编译器和运行时实现。

那么Node.js在哪里适合呢?

我们必须将其分为几部分:

  1. Node.js 通过提供更多的运行时环境原语集(这些超出ECMA标准范围的原语)扩展JavaScript语言。这些包括文件I / O之类的东西。这意味着Node.js 更改了语言,并且在某种意义上是一种新语言:“ Node.js JavaScript”
  2. Node.js作为一个包,包含一个解释器和一个编译器。它只是从V8中窃取了这些。
  3. Node.js提供了Node.js运行时环境实现,该环境允许执行“ Node.js JavaScript”。
  4. Node.js提供了一组在新原语之上构建的标准库,这些标准库使“ Node.js JavaScript”的最终用户可以更轻松地访问它们。

因此,Node.js有很多东西!

但这是一个框架吗?


这就是术语完全崩溃的地方-没有人对框架实际是什么有一个良好,一致,有意义的定义。

争论激昂:“什么是框架而不是库”,它们最终以不令人满意的事情结束,例如“库是您所调用的东西,而框架是您所需要的东西”。我什至不是真的想像今天这样悲伤地解释一下,但是JavaScript(尤其是Node.js JavaScript)对该定义有很大的打击,因为整个回调传递技术意味着您不断在调用之间进行切换被召唤。

我个人认为,这里有些实质性内容。我不想划清界限,所以我只想说

  • 如果一组代码就像乐高玩具一样工作,则它们类似于库。:可分割并用于汇编。尽管可能有一些有关如何使用该库的示例,但通常由用户自己将其组装成符合他们需要的库。
  • 一组代码是不可分割的,并且暗含约定*:如果将它们分开可能会导致许多假设失败,因此您必须了解常规用法才能正确使用框架。

可以肯定地说,这是一条容易动摇的话,但是我想对框架提出一个非常有趣的观点:

框架暗示了一组有关如何解释代码的约定;因此,它们本身就是一种语言。

人们可能也想对此进行争论,但是如果您购买了我先前的定义,即语言只是一组约定,可以赋予一段文本以生命,那么只要您放下新的约定层,您就可以建立了一种新的语言。也许对于框架而言,原材料是其宿主语言的语义解释,而不是原始文本文件,但是想法是一样的!


因此,尽管如此,我很高兴将Node.js称为框架,即使它有点违反规范!Node.js以扩展语言的方式向原始JavaScript添加功能。随之带来了使用这种扩展语言的新假设和工具。从功能上讲,这些想法与其他公认的框架(如Ruby on Rails)的想法相同。

我会争辩说,如果此时您感到有点不安,并且想争辩说Ruby on Rails和Node.js在这种事情上存在巨大分歧,那么当然会陪在您身边。两者所生活的概念世界截然不同 -我只想说它们是同一种东西:用于在特定领域内扩展基本语言功能的一组约定。

我也很高兴地建议Node.js的域很小且很紧,因此它添加的约定很容易推论,并且相对容易正确。在OTOH中,Ruby on Rails生活在一个复杂的,定义不明确的“业务Web应用程序”域中,这意味着它所遵循的约定肯定是模糊不清的。


但是所有这一切都说得很长,是的,招聘人员可能不知道说这些的意思。我猜想“框架”听起来比“运行时”或“引擎”更好,更古怪。


嘿,非常平衡!因此,probably have no idea“框架”是一个您无需成为程序员就可以理解的词,这是一个有用的功能,如果可以节省时间,那么它实际上会有所作为。
n611x007 2015年

“ Node.js以扩展语言的方式向原始JavaScript添加功能。” 并非如此,它扩展了功能而不是语言,它并没有像许多框架所要求的那样改变您编写代码的方式。还添加了其他功能或对象,例如可以添加包含的库。您可以调用它或像使用任何新函数或对象一样使用它。编程风格没有改变,语言基础相同,只是添加了一些功能。因此,它不是框架或扩展语言,而是具有添加的默认平台库以及功能的javascript。
Codebeat

当然,我可以完全跟随你。我认为这条线很模糊。两种思维方式都有意义。严格来说,节点确实通过提供FFI来扩展JS,这是让节点随后提供更多系统库的核心部分。另一方面,“核心”节点只是运行时(和该FFI),而在大多数人讨论节点时,它们实际上是指“核心运行时,FFI扩展和在其之上构建的基本库功能”,因为节点的打包方式。
J. Abrahamson

20

Node.js®是基于Chrome V8 JavaScript引擎构建的JavaScript 运行时

资源

节点是运行时或环境。它不是一个框架。人们(我觉得)经常会犯错,因为诸如express之类的框架在节点上无处不在。

如果您有兴趣,请阅读更多有关运行时与框架的文章。


inb4“但是About页面上说'作为异步事件驱动的框架'”我知道。
rlemon 2015年

3
嵌入式v8不是运行时吗?;-)
johannes 2015年

@johannes在这方面,我倾向于同意你的看法。V8是运行时,节点只是扩展了可供开发人员使用的工具(http服务器,util等),因此我认为框架标签仍然有效。仍然是经过修改的v8环境;节点不是您只是“包含”在项目中的东西。我想这全都是视角问题。
尼克

@rlemon,零件框架已删除。
ebram khalil '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.