浏览器和 Node.js 都使用 JavaScript 软件语言 - 但字面上的运行时环境是不同的。
Node.js(又名服务器端 JavaScript)与客户端 JavaScript 有许多相似之处。它也有很多差异。
尽管两者都使用 JavaScript 作为软件语言,但我们可以重点关注一些关键差异,这些差异使两者之间的软件开发体验截然不同。
在今天的文章中,我们将深入探讨 Node.js(又名服务器端 JavaScript)与浏览器(又名客户端 JavaScript)的区别。
从前端开发人员的角度来看,node.js 具有巨大的优势。Node.js 凭借熟悉和舒适的力量,允许开发人员使用他们已经熟悉的 JavaScript 软件语言创建全栈应用程序。这是巨大的。
通过在堆栈的两端使用相同的语言,您可以深入学习 JavaScript 并坚持变得越来越好,而无需在语言之间切换,也无需将学习资源划分为两种或多种语言(除了软件开发所需的其他一切之外)你来学习。
“我们双方都使用 JavaScript,那么有什么变化呢?”
Node.js 和浏览器端 JavaScript 之间的变化在于生态系统。
例如,在浏览器中您...
- 与 DOM(文档对象模块)交互
- 利用 Web 平台 API(例如:Cookie)
当然,这些示例实际上并不存在于 Node 中。DOM 是一个表示层 - 它是一个文档对象模块,其很大程度上受到通过浏览器的功能为 Web 创建可视化用户界面层的需求的启发。
Node.js 是服务器端,我们没有 DOM,也不需要 Cookie。Cookie 主要用于跟踪用户或保存用户信息 - 我们位于服务器端,可以直接访问数据库或存储资源,并使用 Node.js 来控制支持网站的服务器本身 - 这是而不是交互用于与前端网站服务器通信的浏览器。
在浏览器中,JavaScript 将无法访问节点拥有的几个干净的 API/模块。
例如,在节点中,您...
- 能够交互并访问文件系统(fs)
另一个巨大的区别是 Node.js 允许您控制环境本身。除非您正在构建一个任何人都可以在其上构建并部署在任何地方的开源应用程序,否则您知道将在哪个版本的 Node.js 上运行您的应用程序。
这与浏览器相比,其中环境基于浏览器版本。您无法定义访问者将在前端使用的环境。在后端,您可以这样做,这对于开发人员来说非常方便。
这意味着您可以使用您的 Node 版本支持的所有现代 ES6-7-8-9 等 JavaScript 编写。
JavaScript 的进步速度与任何其他软件语言一样快 - 浏览器似乎总是有点落后于 JS 曲线(至少有一些浏览器是这样,所以你必须等待一段时间才能使用最新的 JavaScript 版本支持您的应用程序在前端浏览器之间的兼容性,以支持所有访问者及其对您的软件的体验)。
由于 JavaScript 的发展速度如此之快,但浏览器的升级速度可能有点慢,有时在网络上您只能使用较旧的 JavaScript / ECMAScript 版本。
在浏览器方面,您可以做一些额外的工作来缓解这种“浏览器总是有点落后”的问题,方法是在将代码发送到浏览器之前使用 Babel 将代码转换为 ES5 兼容。这需要您安装 webpack,确保使用正确的转译器,并设置正确的配置,以最终将现代 JavaScript 简化为旧版本的 JavaScript,以便所有浏览器都可以使用它。
在node.js 方面,您不必这样做。你不需要这样做。
另一个区别是 Node.js 使用 CommonJS 模块系统,而在浏览器中我们开始看到正在实现的 ES 模块标准。
实际上,这意味着您可能需要在浏览器中require()
使用时在 Node 中使用import
- 但这看起来将来会发生变化/标准化。
什么是 Node.js
Node.js 是一个基于 chrome 的 JavaScript 引擎(称为 V8)的 JS 运行时。简单来说,从 chrome 中提取了 V8 JS 引擎,并使用它开发了一种可以独立运行的新技术。当然,类似的事情还有很多内容。
如前所述,这不是 DOM,没有用户界面,并且存在运行时差异。
安装 Node.js 与浏览器 JS
与 Python 或 PHP 一样,您实际上必须安装 Node.js 才能使其在您的计算机上正常工作。你可以在这里安装node.js。
所有主要操作系统(Windows、Mac、Ubuntu 等)都支持 Node.js。
另一方面,您有浏览器。将 JavaScript 安装到浏览器中是什么样子?答案是它看起来不像什么。浏览器负责使用、解释和运行 JavaScript——您无需安装它,它是浏览器自带的。
运行 Node.js 与浏览器 JavaScript
安装后(如 PHP、Python 或任何其他服务器端语言),node.js 可以直接通过命令行或终端运行。
node {file_path.js}
您可以通过终端或命令行执行来调用 JavaScript 文件。这就像您从终端运行 PHP 或 Python 一样。
您可以使用调用该文件node {file_path.js}
,或者只需键入node
并进入交互式REPL
.
cmd> node ./test.js
cmd> "hello world"
cmd>
cmd> node
node> console.log('hello world')
node> "hello world"
node> .exit
cmd>
在浏览器端,这种直接执行 JavaScript 文件和/或终端 REPL 环境的方式不起作用。
您拥有可通过检查工具访问的浏览器控制台 - 但该浏览器控制台实际上并不让您调用要直接执行的 JavaScript 文件,也不为您提供 REPL 来直接与服务器/计算机资源交互。
您无法直接从浏览器调用 JS 文件并执行其功能。您需要将 JS 文件加载到 HTML 文档中,然后允许浏览器拉取源代码并最终运行 JavaScript。
系统访问
为了您的安全,浏览器将 JavaScript 沙箱化。
Node.js 为开发人员提供了像任何其他本机应用程序一样对系统的完全访问权限。
这意味着 Node.js 可以直接读写文件系统,不受限制地访问网络,并且可以执行计算机上安装的软件。
这也意味着您必须更加谨慎地对待 Node.js - 您不是沙箱,您可以做所有事情。拥有权利的同时也被赋予了重大的责任。
全局与窗口
在浏览器端 JS 中我们有对象window
。这是前端/客户端 JS 中最上面的父对象。
在服务器端 JS 中我们有global
对象。这是 Node.js 中最公开/全局可访问的对象。
Node.js 和浏览器端 JS 之间的相似之处
- 两者都有一个用于运行 JavaScript 的线程
- 两者都使用事件队列(查找事件循环以获取更多详细信息)
- 两者都是非阻塞的
- 两者都具有同步和异步功能
- 两者都使用相同的异常、流程和范围