Node.js 和浏览器之间的区别
是的,浏览器和 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,也不需要 Cookies。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 可以直接通过命令行或终端运行。
您可以通过终端或命令行执行 JavaScript 文件来调用它node {file_path.js}
。这就像您从终端运行 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——你不是沙盒,你可以做所有的事情。能力越大,责任越大。
全局 vs. 窗口
在浏览器端 JS 中,我们有window
对象。这是前端/客户端 JS 中最上层的父对象。
在服务器端 JS 中,我们有global
对象。这是 node.js 中最公开/全局可访问的对象。
Node.js 和浏览器端 JS 之间的相似之处
- 两者都有一个用于运行 JavaScript 的单线程
- 两者都使用事件队列(有关更多详细信息,请参阅查找事件循环)
- 两者都是非阻塞的
- 两者都具有同步和异步功能
- 两者使用相同的异常、流程和范围