js模块化方案【转】
(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模块化方案【转】的更多相关文章
- require.js js模块化方案
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- JS模块化方案
- js模块化方案以及前端打包工具
图片来自知乎
- 前端模块化方案全解(CommonJS/AMD/CMD/ES6)
模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...
- JS 模块化和打包方案收集
1.这里想讨论的是拆分规则,不是在问哪个工具怎么使用.2.这里没有在想找正确答案,因为感觉这个问题要结合具体业务场景. 随着项目开发越来越大,一开始代码全打包到一个文件的方式,让文件越来越大,接下来要 ...
- 已有 JS 模块化和打包方案收集
模块化方案 RequireJS AMD 方案, 常用的 define 语法, 异步加载模块, 目前很多支持: 官网 http://requirejs.org/ Github https://githu ...
- 【JS】382- JavaScript 模块化方案总结
本文包含两部分,第一部分通过简明的描述介绍什么是 CommonJS.AMD.CMD.UMD.ES Module 以及它们的常见用法,第二部分则根据实际问题指出在正常的 webpack 构建过程中该如何 ...
- js模块化历程
这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出 ...
- js 模块化历程
作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生 ...
随机推荐
- 基于dom的xss漏洞原理
原文:http://www.anying.org/thread-36-1-1.html转载必须注明原文地址最近看到网络上很多人都在说XSS我就借着暗影这个平台发表下自己对这一块的一些认识.其实对于XS ...
- 6Hibernate进阶----青软S2SH(笔记)
关于关联关系的配置,用注解配置如下(这里引用的jar包是javax.persistence) // @ManyToOne(fetch=FetchType.LAZY) @ManyToOne(fetch= ...
- jquery扫尾
blur和change事件的先后 change事件, 是要在失去焦点之后, 才和初始状态的值相比较, 如果在得到焦点等情况下, 你是无法和最后状态相比较等. 在失去焦点后, 首先触发等是change事 ...
- 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等
1.字符串去重,html模板取值 2.javascript正则表达式之$1...$9 3.jquery插件 4.返回上一页并刷新 解决方法: <a href ="javas ...
- MVC验证session是否过期,在每个action执行之前验证
protected override void OnActionExecuting(ActionExecutingContext filterContext) { ...
- css动画 animation
今天用css做了一个简单的三角上下移动的一个小动画,说白了就是在改变该物体的height值.除了这个方法,还可以用js. 一.在用css写动画时,一定要记住兼容性问题.如何解决该兼容性?在前面加内核前 ...
- 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等
添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...
- java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
java.lang.IllegalStateException: Not allowed to create transaction on sharedEntityManager - use Spri ...
- BZOJ 4582: [Usaco2016 Open]Diamond Collector
Descrirption 给你一个长度为 \(n\) 的序列,求将它分成两个序列后最多个数,每个序列最大值最小值不能超过 \(k\) Sol 二分+DP. 排一下序,找出以这个点结尾和开始的位置. 这 ...
- 刷了MIUI的手机在OSX下连接USB调试的方法
OSX下默认连接不上小米手机或者刷了MIUI的手机. 办法是: 1, 关于本机->系统报告->USB,在其中找到手机设备,然后查看其厂商ID,复制. 2,控制台执行下面这个命令,把其中的0 ...