自己写js库,怎么支持AMD
最近我打算把之前做项目写的一些工具集成到一个js库中,但是库既要在普通环境正常运行,又要在AMD环境下不暴露全局变量。一时间挺头疼的。随即我参考了一些现在流行的库的源码。学着写了一下,感觉还不错。
既然要支持AMD,那么我们需要选择一款AMD的模块加载器,这里我使用requireJS。
至于库我使用的是我最近写的一个小工具库 mTools, gitHub地址: https://github.com/grARM/mTools 。那我们开始吧。
一、判断环境
我要实现的效果是在一般环境暴露一个全局变量,在AMD下可作为模块加载。既然要区别对待,就要先判断出不同的环境。那么AMD环境有什么特点呢?
使用过requireJS的盆友,一定很熟悉define(),我们就是用define()来定义一个模块的,所以我们有了第一个条件:
typeof define === "function"
但是仅仅因为define是个函数,是不是不够严密呢,万一我也定义了一个同名的全局函数怎么办。我们创建一个requireJS的项目,在控制台输入 define.amd ,控制台会返回一个对象,其实他是define方法的一个属性,查了一下requireJS的官网,发现这个属性就是用来说明当前的模块加载器是AMD协议的,比如在我们的require工程中控制台输入define.cmd就会返回 undefined 也就是说我们得到了第二个判断条件:
if ( typeof define === "function" && define.amd ){
}
二、分别处理
我的工具模块,可以理解为一个函数,这个函数的最后会把需要被外界访问的部分属性return 出去。那么被return的这个对象,就是普通模块中暴露在全局的变量,同时他也是AMD中的模块返回值。换句话说,我只要根据上面的条件处理返回值(或模块函数)就实现了我们的目的。那么怎么处理呢?
对于一般环境,我们直接将模块函数运行后端的返回值赋值给一个window下的变量就可以了。
对于AMD环境下,刚才我们说过要用define来定义函数。所以对于这两种情况我们可以这样处理:
;(function (factory){
if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module.
define(factory);
} else { // Browser globals
// 以我的库为例 返回mTools
window.mTools = factory();
}
})(function(){
我们的js库
return {
//模块返回值
} });
注意,我们将js库函数作为立即执行函数的参数传入我们的分析函数,即为factory(未执行),如果AMD环境,就定义为AMD模块;如果是一般环境,就直接运行将返回值赋值给 window.mTools
随即我测试了一下,确实在一般环境暴露一个全局变量,在AMD下可作为模块加载(没有暴露全局)。
自己写js库,怎么支持AMD的更多相关文章
- 近期写js库中遇到的一个判别的问题
最近在写一个自己的js库,正写到数组包,在里面定义了一个排序,只对纯数字数据进行排序的方法,但是在测试的时候发现一个很诡异的问题,那就是传入一个对象的时候,它没有返回erroemsg而是返回了对象,上 ...
- 如何写JS库,JS库写法
前言: 现在javascript库特别多,其写法各式各样,总结几种我们经常见到的,作为自己知识的积累.而目前版本的 JavaScript 并未提供一种原生的.语言级别的模块化组织模式,而是将模块化的方 ...
- 自己动手写js分享插件 [支持https] (QQ空间,微信,新浪微博。。。)
转载:https://blog.csdn.net/libin_1/article/details/52424340 废话不多说,传送门:http://download.csdn.net/detail/ ...
- 自己动手写js分享插件 [支持https] (可以分享QQ空间,微信,新浪微博。。。)
由于百度分享,jiathis 等分享插件在https下均会报错,就萌生了自己动手写一个分享插件的念头,其实实现起来一点都不难,以下代码都已在https网站运行通过,特附上以下代码:还请各位看官不吝赐教 ...
- 【转载】写一个js库需要怎样的知识储备和技术程度?
作者:小爝链接:https://www.zhihu.com/question/30274750/answer/118846177来源:知乎著作权归作者所有,转载请联系作者获得授权. 1,如何编写健壮的 ...
- 从 0 到 1 到完美,写一个 js 库、node 库、前端组件库
之前讲了很多关于项目工程化.前端架构.前端构建等方面的技术,这次说说怎么写一个完美的第三方库. 1. 选择合适的规范来写代码 js 模块化的发展大致有这样一个过程 iife => commonj ...
- 毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库
毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库 在线演示地址: http://m.yunxunmi.com/ 支持 IOS Android Ipad 等不同操作系统的手持或 ...
- JS模块化编程之AMD规范(转)
随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...
- 使用模块化工具打包自己开发的JS库(webpack/rollup)对比总结
打包JS库demo项目地址:https://github.com/BothEyes1993/bes-jstools 背景 最近有个需求,需要为小程序写一个SDK,监控小程序的后台接口调用和页面报错(类 ...
随机推荐
- 持久层框架---jdbc
1.JDBC编程步骤: 1.1 加载数据库驱动: 1.2 获取数据库连接: 1.3 通过Connection对象创建Statement对象: 1.4 使用Statement对象执行SQL语句: 1.5 ...
- java后台获取服务器相对路径,获取当前时间yyyyMMddHHmmssSSS
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS"); Date date = new Date( ...
- Silverlight 减小 Xap 的大小
当Silverlight工程引用了很多dll后,加载的速度就会很慢,通过下面方式可以减小xap包的大小 勾选 “通过使用应用程序库缓存减小xap大小”,勾选此项后vs会自动将微软自身和外部引用不变的d ...
- 性能测试工具LoadRunner19-LR之Controller IP欺骗
概念 IP地址欺骗是指用户操作产生的IP数据包为伪造的源IP地址,以便冒充其他系统或发件人的身份.这是一种黑客的攻击形式,黑客使用一台计算机上网,而借用另外一台机器的IP地址,从而冒充另外一台机器与服 ...
- [转]将input file的选择的文件清空
本文转自:http://hi.baidu.com/xiongshihu/item/125c79b47632e794194697f5 上传文件时,选择了文件后想清空文件路径的两种办法: JS代码 < ...
- linux_api之文件操作
本篇索引: 1.引言 2.文件描述符 3.open函数 4.close函数 5.read函数 6.write函数 7.lseek函数 8.i/o效率问题 9.内核用以维护打开文件的相关数据结构 10. ...
- pat1089. Insert or Merge (25)
1089. Insert or Merge (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Accor ...
- Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)
什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...
- nopCommerce如何支持MySQL
此方法支持nopCommerce2.4以上版本(缺少的代码,可参照nopCommerce2.6源码) nopCommerce 4.1 如何支持Mysql 请看 Url: http://www.nop ...
- 什么是MongoDb
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mo ...