研究一下javascript的模块规范(CommonJs/AMD/CMD)
最近写react需要使用nodejs作为开发环境,需要通过npm安装一些第三方的依赖库,因此慢慢感觉到nodejs基础薄弱对我带来了一些不安全感,尤其是javascript模块这一块听到了很多概念,比如:AMD,CMD,异步加载… …
我不由的好奇,前端还能按需异步加载js,到底是什么闻所未闻的高科技?AMD, CMD听起来像是主板型号,到底是什么鬼?所以,不如一探究竟吧!
模块的黑历史
这里推荐先阅读2个博客:
- 介绍了一下javascript模块化的发展历史,但不会讲每个规范的出现原因或者工作原理,做一个兴趣了解即可。
- 阮一峰的博客(Javascript模块化编程(二),(三)),这里浅显易懂的讲解了CommonJS,AMD,CMD为何而生以及是如何工作的。
- 详细看看CMD和AMD的使用差异,重点关注一下AMD依赖前置和CMD依赖就近。
经过阅读后,我得到了这样几个理解,与大家分享:
- 模块简单理解就是从某个js文件导出的若干代码,引入模块则可以使用其导出的功能。
- 模块加载分为同步和异步,在服务端编程时由于模块的js文件在磁盘上,因此同步加载即可瞬间完成;而如果是浏览器中希望加载一个js模块,那么需要通过网络请求服务器把对应的js文件下载回来,因此适合异步,也就是等下载完成后callback通知你。
- CommonJs就是nodejs遵循的规范,简单说就是同步的require对应的js文件即可。我之前写的react项目都属于这一类,通过服务端直接编译生成bundle.js将所有依赖的js模块打包到一起发布,因此压根没有浏览器下载依赖js的需求。
- AMD就是为了解决浏览器异步下载js文件产生的一个规范,其典型实现就是Require.js。基于Require.js编写的js模块,可以定义其依赖模块,当依赖和模块自身均加载的完成时候,将通过回调的形式异步通知。这可以避免因为下载模块与其依赖模块期间阻塞了浏览器的正常渲染。
- CMD的典型实现是seajs,它貌似是看不起AMD将依赖前置的写法(觉得不太自然),所以不再要求一次性把依赖模块列出来,而是在回调中提供require方法,用户按需reqquire依赖模块。乍一想,这样require依赖模块岂不是又成了同步加载???原来,它是通过静态分析模块代码里的require调用(正则匹配)来采集依赖的模块,本质上和AMD一样是提前异步加载的,这方面可以看一下博客:CMD的实现原理。
不要把异步加载想的很复杂,其实js文件的内容是可以通过浏览器ajax下载,然后动态创建script标签,将js内容填充进去就可以执行了。
统统与我无关 – 我只要CommonJs
根据上述黑历史可知,nodejs采用的是CommonJs规范,并且对于react后端编译的发布模式的来说,CMD和AMD对我意义真的不大!
鉴于react开发经常遇到一些报错,加深对CommonJs的认识一定程度上有利于我排查第三方库的使用问题,因此我决定学一下。
这里,我通过博客《nodejs的exports的用法》来学习nodejs模块的常见用法,3个关注重点:
- exports是指向了module.exports,而最终require导入的是module.exports,所以像exports = xxx这种写法:仅仅是让exports脱离了对module.exports的引用,并不能实现导出的效果。
- require是按文件路径缓存的,因此多次require返回的是同一个对象,这就给monkey patch(为现有模块打补丁)提供了可能性。
- 熟悉常见的模块导出方式,这个博客介绍了导出这些东东:命名空间,工厂方法,偏函数,构造函数,单例,全局对象。
有些东西,了解一下还是有帮助的,所以要好好学。
有些东西,了解or不了解都不会造成影响,可以选择后学或者不学。
重要的是知道什么对自己有真正的意义。
研究一下javascript的模块规范(CommonJs/AMD/CMD)的更多相关文章
- Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...
- Javascript模块规范(CommonJS规范&&AMD规范)
Javascript模块化编程(AMD&CommonJS) 前端模块化开发的价值:https://github.com/seajs/seajs/issues/547 模块的写法 查看 AMD规 ...
- JavaScript模块化演变 CommonJs,AMD, CMD, UMD(一)
原文链接:https://www.jianshu.com/p/33d53cce8237 原文系列2链接:https://www.jianshu.com/p/ad427d8879cb 前端完全手册: h ...
- JavaScript模块化CommonJS/AMD/CMD/UMD/ES6Module的区别
目录 JS-模块化进程 原始的开发方式 CommonJS && node.js AMD && Require.js CMD && Sea.js UMD ...
- 插件兼容CommonJS, AMD, CMD 和 原生 JS
模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果 ...
- [转] 插件兼容CommonJS, AMD, CMD 和 原生 JS
模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果 ...
- CommonJS, AMD, CMD是什么及区别--简单易懂有实例
CommonJS, AMD, CMD都是JS模块化的规范. CommonJS是服务器端js模块化的规范,NodeJS是这种规范的实现. AMD(异步模块定义)和CMD(通用模块定义)都是浏览器端js模 ...
- JS模块规范:AMD,CMD,CommonJS
浅析JS模块规范 随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键. AMD,CMD,CommonJS是目前最常用的三种模块化书写规范. CommonJS CommonJS规范是诞生比 ...
- 浅析JS模块规范:AMD,CMD,CommonJS
from:https://www.jianshu.com/p/09ffac7a3b2c 随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键. 模块化 AMD,CMD,CommonJS ...
随机推荐
- Oracle分区
可以参考文档:http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#insertedID0 (支持11g和12 ...
- 读取web项目properties文件路径 解决tomcat服务器找不到properties路径问题
1.需求:有时候我们产品经理给我们的需求是会不断变化的,例如数量是1000现在变成500,我们不可以去改代码吧,这样很麻烦,所以就可以改配置文件properties(这个数据库链接一样),当然也有js ...
- MacOS下Python的多版本管理(pyenv)
与windows下设置绝对路径不同,pyenv使用了一种更优雅的方式来管理Python的版本.pyenv通过在$PATH的最前面插入一个垫片路径(shims),例如:~/.pyenv/shims:/u ...
- 转行|如何成为企业想要的Android工程师
没经验 一来没钱 二来没时间 三来投简历没人要 四来就算忽悠进去了,也做不了,亚历山大,迟早被踢 1.做好手上的工作 不要裸辞 忌讳心猿意马的心态,当有两个选择的时候,往往 所以要专注于当下手头上唯一 ...
- docker-compose启动报错,解决方案
[root@cache1 www]# docker-composeTraceback (most recent call last): File "/usr/bin/docker-compo ...
- CentOS随笔 不断添加
一.设置IP (1)临时IP ifconfig eth0 192.168.120.16 (2)永久IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 ...
- Mac系统中配置Tomcat环境
第一步:下载Tomcat 下载地址:http://tomcat.apache.org/download-80.cgi 直接下载如图选中的即可 第二步: 下载完成后,解压,随意放入目录.如我就把它放在/ ...
- ubuntu下出现的问题-控制台更新源失败
Ubuntu下控制台输入sudo apt-get update之后出现的问题:E: Could not get lock /var/lib/apt/lists/lock - open (11: Res ...
- QT 文件对话框(QFileDialog)
1.选择文件(上传.打开...) QString QFileDialog::getOpenFileName( QWidget *parent = , //parent,用于指定父组件.注意,很多Qt组 ...
- Openssl生成证书三板斧
证书创建三步曲: 一.密钥文件 二.请求文 三.根证书签名 最后看需要是否合并证书文件 1. 创立根证书密钥文件(自己做CA)root.key: [kk@test ~]$ openssl genrsa ...