(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. IOS热更新-JSPatch实现原理+Patch现场恢复

    关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...

  2. 【11-23】mysql学习笔记02

    SQL的历史 SQL是Structed Query Language 的缩写,即”结构化查询语言” SQL原名是 sequel,后来由于法律原因,改名 SQL最早可以追溯到 1974 年,源于 IBM ...

  3. javascript设置和获取cookie的通用方法

    //获取cookie  function getCookieValue(cookieName)  {     var cookieValue = document.cookie;     var co ...

  4. 【Go入门教程5】面向对象(method、指针作为receiver、method继承、method重写)

    前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...

  5. linux各目录的作用

  6. Linux下对比两个文件夹的方法

    最近拿到一份源代码,要命的是这份源代码是浅克隆模式的git包,所以无法完整显示里面的修改的内容. 今天花了一点点时间,找了一个在Linux对比两个文件夹的方法. 其实方法很简单,用meld 去对比两个 ...

  7. Python函数讲解

    Python函数

  8. tornadod的异步代码

    #!/usr/bin/env python # -*- coding: utf-8 -*- import tornado.httpserver import tornado.ioloop import ...

  9. libevent在windows平台下通过vs进行编译

    1.vs中新建一个静态库项目 2.配置头文件目录,将./compat../include../WIN32-Code三个目录添加到文件目录中 3.用记事本打开Makefile.nmake文件,可以看到里 ...

  10. C#与Java多态方面的语法差异

    C++.C#.Java,无奈三种语言让我多次混淆,多次搞清楚,不写个Demo我想还是会忘记的. 就好像是一个满水的杯子,倒掉一点,才能装下更多. 有时候博客就是一个倒水的地方,可以让我们清空自己,然后 ...