当前位置:   article > 正文

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

支持原生 esm script 标签

现代浏览器对 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 会打包成立即执行函数给浏览器使用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/468729
推荐阅读
相关标签
  

闽ICP备14008679号