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模块化思想的诞生 ...
随机推荐
- 深入理解javascript原型和闭包(7)——原型的灵活性
在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...
- Excel 锁定特定单元格 不允许更改
1.首先,excel默认所有单元格都是被"锁定"的--当"锁定单元格"按钮被激活时. 因此,第一步,选择所有单元格,设置单元格格式,取消"保护&quo ...
- java基本知识小记(1)
1.Java中的值传递 值传递意味着对于传给方法的每个参数都会制作一份副本然后将副本而不是原始值传递给方法并且通过参数的名进行引用. 注意:虽然传值机制对于所有参数类型都适用,但是他对对象类型的作用与 ...
- Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memc ...
- 自写网站入门阶段之三:兼容大战与jq初探
自上一次作小结至今已整整一个月,在忙乎了半个月的工作之后闲下来的一个下午我终于可以再次作这个阶段的小结了.首先庆幸的是在同学的推荐下我顺利的找到了工作并于月初3号正式上班,这一点非常感谢他,让我免去了 ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- HeapSort 堆排序 基于伪代码实现
此文原创, http://www.cnblogs.com/baokang/p/4735431.html ,禁止转载 GIF 动态图 伪代码 /* From Wikipedia, the free en ...
- Android 光线传感器的调用
1.activity如果要使用传感器,就必须实现SensorEventListener接口 2.得到传感器管理对象(sensormanager) 3.使用sensormanager.registerl ...
- JQuery mobile中按钮自定义属性的改变
1..ui-mobile-viewport是jquery mobile默认给body加的class,这样的话包含选择符优先级高一点 <style> .ui-mobile-viewport ...
- C#中将DataTable转成List
学习MVC的时候,使用List<T>来存储数据给前台,但是从数据库中直接读取得到的是DataTable,虽然可以直接循环DataTable来得到list,但是如果每个实体类都通过这样的得到 ...