第一节,我们聊到相对于当前目录用“./”,相对于父目录用“../”,相对于父父目录用“http://www.cnblogs.com/”,如果是远程文件直接用URL。其实模块标识还有一种是相对于根目录,这特指是mass.js所在的目录。当然你可以通过配置手段修改根目录,但不建议这样干。比如aaa.js与mass.js是会于同一目录,用么沿着第一节的例子:

<!DOCTYPE HTML>
<html><head><title>AMD</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="mass.js"></script><script>//相当于$.require("./aaa", fn),只有模块与mass.js是位于同一模块才能这样干$.require("aaa", function(a,b){alert(a+b)})</script></head><body><h2>欢迎加入mass Framework团队!</h2> </body>
</html>

别名机制

比如一个项目,a页面引用N个JS文件,b页面要引用N个js文件,那么当我们用$.require调用它们可能很麻烦,不断地通过"./","../"来定位到目标JS文件中。这时我们可能用一个专门的JS文件对这些模块进行别名,方便引用。

比如我们在第一节提到aaa.js, bbb.js, ccc.js, ddd.js,我们用一个modules保存它们的别名.

//$.core.base 为mass.js的目录
$.config({alias:{$aaa: $.core.base + "aaa.js",$bbb: $.core.base + "bbb.js",$ccc: $.core.base + "ccc.js",$ddd: $.core.base + "ddd/ddd.js"}
})

然后在页面上这样引用ddd.js模块

<!DOCTYPE HTML>
<html><head><title>AMD</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="mass.js"></script><script src="modules.js"></script><script>//相当于$.require("./aaa", fn),只有模块与mass.js是位于同一模块才能这样干$.require("$ddd", function(d){alert(d)})</script></head><body><h2>欢迎加入mass Framework团队!</h2> </body>
</html>

相对应的,这些JS模块也可以改为

//aaa.js 没有依赖不用改
define("aaa",function(){return 1
})//bbb.js  没有依赖不用改
define("bbb",function(){return 2
});
//ccc.js
define("ccc",["$aaa"],function(a){return 10+a
})//ddd/ddd.js
define("ddd",["$ddd"], function(c){return c+100
});

那么它就会正确弹出111!

万一有一天,我们把ddd.js移到其他目录,如变成http://xdsfsd/sadfs/ddd.js,那么我们只需要改modules目录就行了!不用改$.require,也不用改ddd的依赖列表!

//$.core.base 为mass.js的目录
$.config({alias:{$aaa: $.core.base + "aaa.js",$bbb: $.core.base + "bbb.js",$ccc: $.core.base + "ccc.js",$ddd: "http://xdsfsd/sadfs/ddd.js"}
})

好了,我们再来看看jQuery与mass.js的使用。jQuery虽说是加了几行支持AMD,其实非常鸡肋!不过jQuery的多库共存做得很不错!我们只需要在外面包一层就能用了。到jQuery官网下载jQuery源码,无论是压缩版还是注释版。新建一个jquery.js文件,与mass.js同一目录,内容如下:

define("jquery", function(){//*********jquery源码*********return jQuery.noConflict(true);
})
<!DOCTYPE HTML>
<html><head><title>AMD</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="mass.js" ></script><script>$.require("jquery", function(jQuery){$.log(jQuery.fn.jquery);//这是jquery$.log($.mass); //这是mass.js})setTimeout(function(){$.log($)//这也是mass.js,jquery没有污染都外边的},1000)</script></head><body></body>
</html>

我们打开firebug可以看到以下日志:

jquery插件的使用,也是外包一层

(function($)$.fn.overlabel = function() {this.each(function(index) {var label = $(this); var field;var id = this.htmlFor || label.attr('for');if (id && (field = document.getElementById(id))) {var control = $(field);label.addClass("overlabel-apply");if (field.value !== '') {label.css("text-indent", "-1000px");}control.focus(function () {label.css("text-indent", "-1000px");}).blur(function () {if (this.value === '') {label.css("text-indent", "0px");}});label.click(function() {var label = $(this); var field;var id = this.htmlFor || label.attr('for');if (id && (field = document.getElementById(id))) {field.focus();}});}});
};
})(jQuery)

改造为

define("jquery_overlabel",["./jquery"], function(jQuery){(function($){//************})(jQuery);
})

本节完!

我的模块加载系统 v17的入门教程2相关推荐

  1. 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  2. abp vnext2.0之核心组件模块加载系统源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  3. JS框架设计之加载器所在路径的探知一模块加载系统

    1.要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很简单,强加个约定,URL的合成规则是为: ...

  4. Linux模块加载流程及如何让系统开机自动加载模块

    Linux模块加载 Linux系统加载哪些内核模块,和配置文件有关系. 模块保存在/lib/modules/下. 使用/etc/modules-load.d/来配置系统启动时加载哪些模块. 使用/et ...

  5. 64位操作系统注册ocx控件失败,提示:模块加载失败请确保该二进制存储在指定路径中。

    64位操作系统注册ocx控件失败,提示:模块加载失败请确保该二进制存储在指定路径中 我的解决方案: 1.找到位于windows下的syswow64文件夹下的cmd 2.并拷贝需注册的ocx文件到sys ...

  6. FreeSwitch 的初始化及其模块加载过程

    FS 主函数main() Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加 ...

  7. 模块加载过程代码分析1

    一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...

  8. Node.js中模块加载机制

    Node.js中模块加载机制 模块查找规则-当模块拥有路径但没有后缀时 1. require方法根据模块路径查找模块,如果是完整路径,直接引入模块. 2. 如果模块后缀省略,先找同名JS文件再找同名J ...

  9. php入门篇-------PHPCMS 入口文件,自动加载系统函数和URL规则

    这里主要分析PHPCMS的入口文件和系统自动加载配置文件和系统函数,还有URL的规则: 首先是入口文件分析: index.php 2,框架主文件分析:(这里主要分析加载配置文件和公共函数,还有URL规 ...

最新文章

  1. 【剑指offer-Java版】43n个骰子的点数
  2. 【浸入式英文学习方式】山姆莱萌帮助孩子建立扎实语言功底
  3. navicat 批量修改列数据
  4. 基于若依框架的二次开发_浅谈若依框架
  5. QT5实现简单的TCP通信
  6. python中的静态方法如何调用_关于Python中如何使用静态、类、抽象方法的权威指南(译)...
  7. 在CentOS上安装ZooKeeper集群
  8. CodeForces - 1465E Poman Numbers(推公式+贪心)
  9. 网页结构的简介和Xpath语法的入门教程
  10. webbrowser 检测ajax,控制台获取网页AJAX的返回数据,用的WebBroWser
  11. Oracle 数据定义
  12. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...
  13. centos经常用到的一些文件
  14. 控制台接收信息转发_微信语音信息无法转发?原来这才是正确的转发姿势,看完涨知识了...
  15. SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
  16. DataTable 更改在有数据列的类型方法
  17. PHP之JWT接口鉴权(二) 自定义错误异常
  18. AR/MR研究团队和机构
  19. android禁止屏幕自动旋转_Android 禁止屏幕旋转 屏幕旋转不刷新 Activity 动态更改屏幕方向...
  20. 求出字符串中大写字母,小写字母和数字的个数

热门文章

  1. git个人使用总结 —— idea命令行、撤销commit (未完待续)
  2. Flutter 异常处理之图片篇
  3. Streams全库复制
  4. SQL语句判断指定的数据库、表、字段、存储过程是否存在
  5. 乙肝疫苗该怎么打(转)
  6. 混合图的欧拉路径和欧拉回路判断
  7. CentOS7安装MySQL8.0图文教程
  8. mysql四种事务隔离级别
  9. docker 初体验
  10. Oracle 数据文件迁移