研究一下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 ...
随机推荐
- $event 获取对象
用Angular给元素添加事件时获取可以用 $event 传递当前触发的事件的元素对象 页面上可以这样写 <img ng-src="" alt="" ng ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 【转】《从入门到精通云服务器》第六讲—OpenStack基础
前五期的<从入门到精通云服务器>受到了广泛好评,收到留言,有很多读者对云计算相关的技术非常感兴趣.应观众要求,我们这期要安利一条纯技术内容.准备好瓜子.花生,随小编一起进入OpenStac ...
- Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )
*****注意到mvc 在android 中是如何进行分层分域执行各自的功能.**** 官方推荐的按钮尺寸是48像素 前端之Android入门(1):环境配置 前端之Android入门(2):程序目录 ...
- Java数据结构——栈的应用(以数制转换为例子)
看一万遍,不如自己动手实践,请不要直接copy代码,先自己去理解例子实现的原理,然后试着自己动手去实践. 用Java去实现栈操作,会用到stack这个类,这类中有几个方法需要知道他们的用法 bool ...
- 读取hdfs文件之后repartition 避免数据倾斜
场景一: api: textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑) 场景:hdf ...
- 【枚举】POJ 3279
直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...
- jQuery中prop() , attr() ,css() 的区别
1. HTML属性是指页面标记中放在引号中的值,而DOM属性则是指通过JavaScript能够存取的值. (1)在jQuery中,prop()是操作DOM属性,attr()是操作HTML属性. HT ...
- fatal error
1. fatal error C1083: 无法打开源文件 编译报此错误: 1>c1xx : fatal error C1083: 无法打开源文件:“Projects\XXXCCCC\VB ...
- oracle 导出指定的存储过程
只能导出以下类型: PROCEDURE PACKAGE PACKAGE BODY TYPE BODY FUNCTION TYPE 也就是,表需要单独导出并导入(已经能俭省很多手动操作了). SET e ...