浏览器模块化难题

CommonJS 的工作原理

当使用 require(模块路径) 导入一个模块时,node会做以下两件事情(不考虑模块缓存):

  1. 通过模块路径找到本机文件,并读取文件内容
  2. 将文件中的代码放入到一个函数环境中执行,并将执行后 module.exports 的值作为 require 函数的返回结果

正是这两个步骤,使得 CommonJS 在 node 端可以良好的被支持

可以认为,CommonJS是同步的,必须要等到加载完文件并执行完代码后才能继续向后执行

当浏览器遇到 CommonJS

当想要把 CommonJS 放到浏览器端时,就遇到了一些挑战:

  1. 浏览器要加载 JS 文件,需要远程从服务器读取,而网络传输的效率远远低于 node 环境中读取本地文件的效率。由于 CommonJS 是同步的,这会极大的降低运行性能
  2. 如果需要读取 JS 文件内容并把它放入到一个环境中执行,需要浏览器厂商的支持,可是浏览器厂商不愿意提供支持,最大的原因是 CommonJS 属于社区标准,并非官方标准

新的规范

基于以上两点原因,浏览器无法支持模块化,可这并不代表模块化不能在浏览器中实现,要在浏览器中实现模块化,只要能解决上面的两个问题就行了,解决办法其实很简单:

  1. 远程加载 JS 浪费了时间?做成异步即可,加载完成后调用一个回调就行了
  2. 模块中的代码需要放置到函数中执行?编写模块时,直接放函数中就行了

基于这种简单有效的思路,出现了AMD 和 CMD 规范,有效的解决了浏览器模块化的问题。

相关推荐
爱吃羊的老虎几秒前
Streamlit:快速创建应用界面,无需了解 Web 开发
前端·python
满栀5853 分钟前
三级联动下拉框
开发语言·前端·jquery
杨超越luckly10 分钟前
HTML应用指南:利用GET请求获取网易云热歌榜
前端·python·html·数据可视化·网易云热榜
前端_yu小白10 分钟前
React实现Vue的watch和computed
前端·vue.js·react.js·watch·computed·hooks
多看书少吃饭13 分钟前
OnlyOffice 编辑器的实现及使用
前端·vue.js·编辑器
float_六七16 分钟前
JS比较运算符:从坑点速记到实战口诀
开发语言·javascript·ecmascript
编程之路从0到120 分钟前
JSI入门指南
前端·c++·react native
开始学java21 分钟前
别再写“一锅端”的 useEffect!聊聊 React 副作用的逻辑分离
前端
百度地图汽车版26 分钟前
【智图译站】基于异步时空图卷积网络的不规则交通预测
前端·后端
qq_124987075330 分钟前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序