OYE - AMD模块化开发思想的实现原理及应用
为了推行模块话的开发思想,将刚推出不久的AMD模块化加载管理器 - OYE,拿出来跟大家分享一下,希望能够多尽一份力!
AMD是CommonJS规范的一个分支,它更适合在浏览器端进行实现。
OYE是对AMD规范的一个实现!
OYE概述
✔ 不依赖Script onload事件,更稳定可靠
✔ 完美支持具名、匿名模块
✔ 支持模块提取完整依赖列表
✔ 支持模块循环依赖检测
✔ 支持require与define在同一个文档
OYE实现原理
辅助项
[[当前正在处理的模块名称]], [[请求队列]]
define
define函数执行时,如果是具名模块,则直接将模块定义体与模块名进行注册;如果是匿名模块,则取[[当前正在处理的模块名称]]为模块名称进行模块注册;最后将[[当前正在处理的模块名称]]置空;
require
require函数执行时,如果[[当前正在处理的模块名称]]为空,则发起文件请求,并将本次请求的模块名称置为[[当前正在处理的模块名称]];否则,将本次请求丢到[[请求队列]]
依赖关系
采用触发器方式,一个模块准备好后,触发所有依赖它的模块进行检查,看它们是否也准备好
应用指引
开发阶段
确认当前项目准备采用模块化的方式进行开发;
每个模块定义为匿名模块,并存储为一个独立的JS文件;
每个页面最好只引入一个模块,如:首页,可以有一个app/home这样的模块,在这个模块中再去调用其他模块,如:
<你的站点路径或CDN路径>resource/js/app/home.js
define(['common/head','common/foot','app/home/content'], function(head,foot,content){
return {
init:function(){
head.init();
foot.init();
content.init();
}
};
});
然后,在home页面,我们只要这样去调用即可:
<script src="<你的站点路径或CDN路径>resource/js/oye/oye.min.js"></script>
<script>
require('app/home', function(home){
home.init();
});
</script>
请注意:
模块文件home.js与oye.js的目录关系,在oye里,模块名对应模块的路径!
如果模块名是以http或https等协议开头的,则视为绝对路径,oye会直接去请求这个URL;
否则,都被视为相对路径,相对于oye.js所在的路径而言,而不是相对于当前页面的路径,这个很重要!
为什么设计成这样?
因为我们需要覆盖线上线下两种应用场景:
线下,即开发阶段,我们的资源文件与项目内容基本上是作为一个项目的整体来开发的;
线上,资源文件和项目内容多数情况下会分开部署到不同的域;
更多具体用法,请参见我们给出的OYE DEMO演示!
项目上线(可选)
如果公司的站点线上与开发阶段完全不一致,则需要考虑以下步骤。
在BUILD工具中添加提取JS模块依赖列表、合并压缩的功能;实现方式大致如下:
通过对模块依赖列表的提取,将各依赖模块的模块名自动添加到提取出来的内容中,即为原来的匿名模块加上模块名称,如:
(举例)我们通过对app/home提取依赖列表,可以得到:
app/home: http://你的站点路径/resource/js/app/home.js
common/head: http://你的站点路径/resource/js/common/head.js
common/foot: http://你的站点路径/resource/js/common/foot.js
app/home/content: http://你的站点路径/resource/js/app/home/content.js
现在,我们的BUILD工具就可以遍历读取这些文件,并将读取的内容做如下替换:
将 define( 替换成 define("app/home" ,即将模块名填充进去。
将已知的具名模块配置中,添加一条:define.amd.namedModules['模块名'] = true;
将提取并修改后的所有内容保存到一个JS文件,如:app/home.min.js
在页面上,引入oye.min.js文件的后面,添加一个对该文件的引入:<script src="<你的站点路径或CDN路径>resource/js/app/home.min.js"></script>
现在就去体验使用OYE作为模块化开发的便利吧!
相关推荐
OYE AMD模块化开发部署实践 共18页.ppt
OYE AMD模块化开发部署实践 共18页.ppt
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
下面小编就为大家分享一篇浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结。小编觉得写的非常不错,需要的朋友可以过来参考一下
Javascript模块化编程(一)AMD规范(规范使用模块)
个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊
符合AMD规范的简单模块化加载工具
符合AMD规范的简单模块化加载工具
elevator-demo:解耦模块化AMD Javascript App开发演示
电梯演示 此应用程序源于对不受现有保密协议限制的示例项目的需求。 它旨在成为经典“电梯悖论”的简化版本,并演示了 RequireJS 和 KnockoutJS 在完全基于 AMD 的模块化应用程序中的使用。 KnockoutJS 框架将 HTML 文档与 Javascript 代码分离,从而消除了对容易出错的事件处理程序和 Jquery 调用的需要。 此应用程序中的所有动画都是基于 CSS3 的,从而实现了非常轻量且与环境无关的代码库。 基于百分比的值和@media 查询的组合提供了智能手机兼容的纯 CSS3 响应内容,可在各种现代浏览器中查看。 此应用程序的设计模式与 Knockout 以数据为中心的模型-视图-视图模型模式不同,采用更多的混合方法,将程序逻辑驻留在控制器中,该控制器通过视图模型进行通信。 理由是,对于这个特定项目,确实没有后端数据需要管理,而且由于 Viewmo


