现代浏览器对 es模块 【esm】原生支持/浏览器不支持cjs 的原因

本文介绍了现代浏览器对ES模块的原生支持,包括其组织代码的优点、动态导入功能以及与CommonJS模块的异步加载和环境差异。同时提到了在考虑浏览器兼容性和性能时,为何浏览器不直接支持CommonJS(如CJS)的情况。
摘要由CSDN通过智能技术生成

现代浏览器对 ES(ECMAScript)模块的原生支持是指浏览器可以直接解析和执行 JavaScript 文件中的 ES 模块语法,无需额外的工具或转换。

具体来说,当浏览器遇到 importexport 关键字时,会将其识别为 ES 模块语法,而不是传统的 <script> 标签中的全局作用域。浏览器会根据 import 语句的路径加载对应的模块文件,并将导出的变量、函数或对象等绑定到当前模块的作用域中,供其他模块使用。

ES 模块的原生支持使得开发者可以更方便地组织和管理 JavaScript 代码,避免了传统的全局命名空间污染和脚本加载顺序的问题。此外,ES 模块还具有更好的静态分析特性,使得浏览器可以更好地进行代码优化和加载性能的优化。

需要注意的是,虽然现代浏览器已经原生支持 ES 模块,但对于一些旧版本的浏览器,特别是 Internet Explorer,可能不支持 ES 模块或仅部分支持。因此,在开发时需要考虑浏览器的兼容性,并根据实际情况进行代码转换或提供备用方案。

我们在实际应用中只需要在  <script>  标签上加上一个 type="module" 就可以使用,参考这篇文章。

还需要注意,ES 模块具有动态导入的能力,所以在代码中引入 ES 模块,可以动态的加载新的模块。

知道了这个知识点,我们在看 vite 官网的时候就很好理解了。

浏览器为什么不支持 cjs

  1. 同步加载 vs. 异步加载: CommonJS 模块是同步加载的,这意味着当一个模块被引入时,会立即执行并阻塞后续代码的执行,直到该模块加载完成。而在浏览器中,更倾向于采用异步加载的模块系统,以避免阻塞页面渲染和用户交互。

  2. 环境差异: 浏览器的运行环境和 Node.js 环境有很大的差异,包括文件系统、网络访问、全局对象等。CommonJS 在设计上与 Node.js 紧密集成,涉及了许多 Node.js 特有的功能和 API,这些在浏览器中并不存在,因此无法直接在浏览器中运行 CommonJS 模块。

  3. 加载方式: 浏览器采用的是 HTTP 协议来加载资源,而 Node.js 则可以直接在本地文件系统中加载模块。这导致了在浏览器环境下无法像在 Node.js 中那样直接引入 CommonJS 模块。

  4. 性能和安全性考量: CommonJS 的同步加载方式可能会导致性能问题,尤其是在大型的 Web 应用中。此外,CommonJS 的模块系统设计上存在一些安全隐患,比如模块的全局状态共享等,这在浏览器环境下可能会引发一些问题。

所以 node 支持 cjs ,浏览器不支持,所以在 esm 出来之前,webpack 回把 cjs 会打包成立即执行函数给浏览器使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值