(function(){
var CENTER = new EvtCenter();
var Loaded={};
var Modules={};
function loadScript(name,url){
if(!(name in Loaded)){
Loaded[name]=!0;
var js=document.createElement("script");
js.src=url;
document.head.appendChild(js);
}
} function require(name){return Modules[name]}
function exports(obj){
var name=this.name;
this.exports=obj;
if(name in Modules){
for(var key in obj){
Modules[name]=obj[key];
}
}else{
Modules[name]=obj;
}
this.trigger(CENTER,"load");
} function Module(name,factory){
var self = this;
if(!(self instanceof Module)) return new Module(name,factory);
if(factory===undefined){factory=name;name=factory.name}
self.name = name||"anonymous";
self.factory=factory;
self.inited=false;
Loaded[self.name]=!0;
self.process();
if(self.depends){
self.on(CENTER,"load",function(e){
if((!self.inited)&&(self.depends[e.sender.name])){
self.check()&&self.init();
}
});
}else{
setTimeout(function(){
self.init();
},0)
}
}
Eventable(Module);
Module.prototype.init=function(){
this.inited=true;
this.factory(require.bind(this),exports.bind(this));
if(!/exports\(/.test(this.txt)){
Modules[this.name]=null;
this.trigger(CENTER,"load");
}
delete this.txt;
}
Module.prototype.check=function(){
var k,flag=true;
for(k in this.depends){
if(!(k in Modules)){
flag=false;
break;
}
}
return flag;
}
Module.prototype.process=function(){
var txt,url,name,i,list,tmp,reg = /require\(([^\)]+)\)/;
this.txt=this.factory.toString();
list=this.txt.split(/\r?\n/);
for(i=0,l=list.length;i<l;i++){
txt=list[i];
if(reg.test(txt)){
tmp = reg.exec(txt)[1].replace(/^\s*|\s*$/g,'').split(/\s*,\s*/);
url = tmp[1]&&(tmp[1].replace(/'|"/g,''));
name= tmp[0].replace(/'|"/g,'');
if(url&&!/\.js$/.test(url))url=url+'.js';
if(!(name in Loaded) && url) setTimeout(function(){loadScript(name,url)},0);
if(!this.depends) this.depends={};
this.depends[name]=!0;
}
}
} window.Module=Module;
})();//module

使用简单的依赖预处理(无法辨别是否在注释或者字符串中)

转载自:http://www.cnblogs.com/ss0102113/p/6114485.html

js模块化方案【转】的更多相关文章

  1. require.js js模块化方案

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  2. JS模块化方案

  3. js模块化方案以及前端打包工具

    图片来自知乎

  4. 前端模块化方案全解(CommonJS/AMD/CMD/ES6)

    模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...

  5. JS 模块化和打包方案收集

    1.这里想讨论的是拆分规则,不是在问哪个工具怎么使用.2.这里没有在想找正确答案,因为感觉这个问题要结合具体业务场景. 随着项目开发越来越大,一开始代码全打包到一个文件的方式,让文件越来越大,接下来要 ...

  6. 已有 JS 模块化和打包方案收集

    模块化方案 RequireJS AMD 方案, 常用的 define 语法, 异步加载模块, 目前很多支持: 官网 http://requirejs.org/ Github https://githu ...

  7. 【JS】382- JavaScript 模块化方案总结

    本文包含两部分,第一部分通过简明的描述介绍什么是 CommonJS.AMD.CMD.UMD.ES Module 以及它们的常见用法,第二部分则根据实际问题指出在正常的 webpack 构建过程中该如何 ...

  8. js模块化历程

    这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出 ...

  9. js 模块化历程

    作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生 ...

随机推荐

  1. LINQ驱动数据的查询功能

    一.LINQ概念 LINQ是微软在.NetFramework3.5中新加入的语言功能,在语言中以程序代码方式处理集合的能力. 1.1 LINQ VS 循环处理 在我刚工作时候,对于集合对象的处理一般是 ...

  2. 在写junit test 的时候出现的java.lang.UnsupportedClassVersionError问题

    今天在写为一些project 写 一些junit  test  的时候,出现下面的异常: java.lang.UnsupportedClassVersionError: moneytest/Money ...

  3. @property 参数

    /* 1.set方法内存管理相关的参数 * retain : release旧值,retain新值(适用于OC对象类型) * assign : 直接赋值(默认,适用于非OC对象类型) * copy : ...

  4. 《征服 C 指针》摘录1:什么是空指针?区分 NULL、0 和 '\0'

    一.什么是空指针? 空指针 是一个特殊的指针值. 空指针 是指可以确保没有向任何一个对象的指针.通常使用宏定义 NULL 来表示空指针常量值. 空指针 确保它和任何非空指针进行比较都不会相等,因此经常 ...

  5. plist中的中文数据

    直接打印那个值就会显示中文了,你打引整个 plist 文件的内容,则会显示出 NSUTF8 编码后的数据:请放心使用:

  6. PHP 打印调试信息

    1.将输出的数组存入文件,比如debug_trace()的输出: $debug_info = print_r(debug_backtrace(),true); file_put_contents(&q ...

  7. log4Net不能成功生成日志问题(关于配置错误)

    log4Net不能成功生成日志问题(关于配置错误) 调试发现问题原因在于  Log4Net IsInfoEnabled 一直为 false,返回的对象中所有 IsXXX 一直为false,这个问题的原 ...

  8. JdbcTemplate中queryForObject的EmptyResultDataAccessException问题

    在使用Spring提供的JdbcTemplate中名为queryForObject API进行数据库查询时有时会抛出如下异常提示息,org.springframework.dao.EmptyResul ...

  9. assign more memory to Gradle

    Please assign more memory to Gradle in the project's gradle.properties file.For example, the followi ...

  10. 拨打电话tel: 跳转到邮件mailto:(html)

    拨打电话 <a href="tel://0571866000">0571-866000</a> 跳转到邮件 <a href="mailto: ...