模块标准

// 支持AMD,CMD以及原生js的引用if (typeof module !== 'undefined' && typeof exports === 'object' && define.cmd) {module.exports = SB;} else if (typeof define === 'function' && define.amd) {define(function() {return SB;});} else {this.SB= SB;}
}).call(function() {return this || (typeof window !== 'undefined' ? window : global);
}
复制代码
 //做的工作其实就是这么粗暴,判断当前用的什么就以当前规范来定义(function (root, factory) {if (typeof define === 'function' && define.amd) {// AMDdefine(['jquery'], factory);} else if (typeof exports === 'object') {// CommonJSmodule.exports = factory(require('jquery'));} else {//  全局变量root.returnExports = factory(root.jQuery);}}(this, function ($) {//    methodsfunction myFunc(){};//    exposed public methodreturn myFunc;}));
复制代码

UMD:
Universal Module Definition 通用模块规范。
基于统一规范的目的出现,看起来没那么简约,但是支持amd和commonjs以及全局模块模式。

//做的工作其实就是这么粗暴,判断当前用的什么就以当前规范来定义
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
module.exports = factory(require('jquery'));
} else {
// 全局变量
root.returnExports = factory(root.jQuery);
}
}(this, function ($) {
// methods
function myFunc(){};
// exposed public method
return myFunc;
}));复制代码

现在的前端模块化标准主要有两种, CMD , AMD

CMD

CMD 在模块定义当中有三个变量,分别是 require , exports , module 。除了这三个变量可以辨识 CMD 外, define 函数还有一个公有属性 define.cmd 。我们也可以检测这个值来判断是否是 CMD

如果想要对外提供接口的话,可以将接口绑定到 exports (即 module.exports ) 上。

function MyModule() {// ...
}if(typeof module !== `undefined` && typeof exports === `object` && define.cmd) {module.exports = MyModule;
}
复制代码

如果需要支持除了 CMD 之外的其他符合 CommonJS 的标准,请去掉 define.cmd

AMD

AMD 规范中, define 函数同样有一个公有属性 define.amd

AMD 中的参数便是这个模块的依赖。那么如何在 AMD 中提供接口呢?它是返回一个对象,这个对象就作为这个模块的接口,故我们可以这样写:

function MyModule() {// ...
}if(typeof define === `function` && define.amd) {define(function() { return MyModule; });
}
复制代码

总结

我们除了提供 AMD 模块接口, CMD 模块接口,还得提供原生的 JS 接口,一个直接可以用的代码如下:

;(function(){function MyModule() {// ...}var moduleName = MyModule;if (typeof module !== 'undefined' && typeof exports === 'object' && define.cmd) {module.exports = moduleName;} else if (typeof define === 'function' && define.amd) {define(function() { return moduleName; });} else {this.moduleName = moduleName;}
}).call(function() {return this || (typeof window !== 'undefined' ? window : global);
});
复制代码

一般插件的做法:

  if (typeof module != 'undefined' && module.exports) {  //CMDmodule.exports = SB;} else if (typeof define == 'function' && define.amd) {  //AMDdefine(function() {return SB;});} else {           //no AMD or CMDwindow.SB= SB;}复制代码

让你的插件兼容AMD, CMD ,CommonJS和 原生 JS相关推荐

  1. AMD/CMD/CommonJs到底是什么?它们有什么区别?

    这篇文章总结的很好. 知道JS有模块化开发的说法,也偶尔听过requireJs,AMD,CMD等等名字,甚至使用node的时候,还用过require之类的方法,但是对这些一直没有一个明确的认识和概念. ...

  2. AMD, CMD, CommonJS和UMD

    AMD, CMD, CommonJS和UMD 今天由于项目中引入的echarts的文件太大,requirejs经常加载超时,不得不分开来加载echarts的各个图表.但是使用echarts自带的在线构 ...

  3. video视频转成canvas(兼容至IE8+,全原生JS)

    video视频转成canvas(兼容至IE8+,全原生JS) <!DOCTYPE html> <html lang="en"> <head>&l ...

  4. js模块化编程之CommonJS和AMD/CMD

    一.CommonJS 1.CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白.它的终极目标是提供一个类似Python,Ruby和Java标准库.这样的 ...

  5. js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    为什么80%的码农都做不了架构师?>>>    先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前 ...

  6. js模块化编程之彻底弄懂CommonJS和AMD/CMD

    转载地址:http://www.cnblogs.com/chenguangliang/p/5856701.html 先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想 ...

  7. 兼容多种模块规范(AMD,CMD,Node)的代码

    前言 昨天,公司同事问了我如下一个问题: 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数func ...

  8. 关于 CommonJS AMD CMD UMD 规范的差异总结

    根据CommonJS规范,一个单独的文件就是一个模块.每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的. // foo.js var ...

  9. commonjs是什么_JavaScript模块化标准CommonJS/AMD/CMD/UMD/ES6Module的区别

    JS-模块化进程 随着js技术的不断发展,途中会遇到各种问题,比如模块化. 那什么是模块化呢,他们的目的是什么? 定义:如何把一段代码封装成一个有用的单元,以及如何注册此模块的能力.输出的值依赖引用: ...

最新文章

  1. java中编写单选按钮的程序_java的单选按钮GUI程序设计
  2. java 自定义对话框_Java经典实例:用户自定义对话框
  3. wcf系列5天速成——第一天 binding的使用(1)
  4. python获取方法的装饰方法_python – 在一个方法上得到装饰器名称的内省?
  5. antd 嵌套子表格_大型前端项目架构优化探索之路腾讯文档表格
  6. 5G精华问答 | 5G关键技术解读
  7. 【Linux】ls命令查看linux目录下的内容
  8. 啥操作?男子改装路边电话亭玩游戏 中国电信回应将核实该情况
  9. React 是如何成为跨越前端开发鸿沟的桥梁?
  10. Oracle CASE WHEN 使用及保留两位小数
  11. 华为机试:提取不重复的整数
  12. 4 4c语言表格的画法_别再用Vlookup函数了,查找4个表格它更简单
  13. 微信公众号是html页面吗,微信公众号网页开发
  14. SDL2.0超简单入门 100行代码实现播放wav声音文件
  15. XTU OJ 湘潭大学
  16. Weighted Interval Scheduling
  17. java小白,随意给出一个三位数的整数,打印显示它的个位数,十位数,百位数的值。
  18. linux系统下深度学习环境搭建和使用
  19. Docker基础镜像操作系统基础镜像对比(参考官方文档),优化docker镜像
  20. 联想昭阳E47外接显示器屏幕由扩展改为复制

热门文章

  1. tp5 控制器不存在_使用服务器管理器将域控制器降级
  2. spring日志报错提醒_Spring Boot 2.x : 整合日志框架 Log4j2
  3. Java必刷100题
  4. setDrawingCacheEnabled(boolean flag)
  5. python中文字符_python处理中文字符
  6. open source ecg_苹果watchOS 7.1 正式版发布:ECG功能上线多国
  7. Html做网络硬盘系统交互,教你做网络硬盘(上)
  8. python计算3j系数_python数值基础知识浅析
  9. ami编码设计流程图_Openplant智慧电厂BIM设计-很强大(艾三维BIM分享)
  10. Redis:一致性Hash算法