最开始提到这个问题,是面试的代码题,发现在浏览器和vscode的js文件中的输出结果有差异,后来女朋友做硬件方面的前端开发,页面是通过js代码生成,跟她解释的时候,又重新提到这个问题。
相同点:
- 浏览器和 Node.js 都使用 JavaScript 作为其编程语言。
- 浏览器是JavaScript在客户端的运行环境,Node是JavaScript在服务端的运行环境。
- 难道没有其他相同点了吗?欢迎补充
不同点:
- 在 Node 中没有浏览器提供的
document
、window
对象,但提供了global对象。 - 在 Node 中this指向 global,在浏览器中this指向window。
- 在 Node 中可以选择某个版本去运行JavaScript,但浏览器不行,无法主动选择浏览器环境。
- 在 Node 中使用 CommonJS 模块系统,在浏览器遵循的 ES Modules 标准。
- 在 Node 中使用
require()
,在浏览器中使用import
。 - 目的不同,NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,但浏览器中的JavaScript更多的是为了提供操作的交互。
- Event Loop的不同。
问题1:CommonJS 与 ES Modules 的区别
- CommonJS是Node的模块化方式,一般认为,Node的模块系统使用CommonJS规范。在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。在编写每个模块时,都有
require
、exports
、module
三个预先定义好的变量可供使用。 - CommonJs是通过module.exports,exports导出,require导入;ESModule则是export导出,import导入。
- CommonJs可以动态加载语句,代码发生在运行时;Es Module是静态的,不可以动态加载语句,只能声明在该文件的最顶部,代码发生在编译时 require 的基本功能是:读入并执行一个 js 文件,然后返回该模块的 exports 对象,模块的加载是运行时同步加载的,require 命令执行完后,文件就执行完了,并且成功拿到了模块导出的值。这种规范不适用于浏览器,因为它是同步的。如果浏览器端每加载一个文件,要发网络请求去取,如果网速慢,就非常耗时,浏览器就要一直等 require 返回,就会一直卡在那里,阻塞后面代码的执行,从而阻塞页面渲染,使得页面出现假死状态。
问题2: 怎么理解操作文件?