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模块化思想的诞生 ...
随机推荐
- IOS热更新-JSPatch实现原理+Patch现场恢复
关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...
- 【11-23】mysql学习笔记02
SQL的历史 SQL是Structed Query Language 的缩写,即”结构化查询语言” SQL原名是 sequel,后来由于法律原因,改名 SQL最早可以追溯到 1974 年,源于 IBM ...
- javascript设置和获取cookie的通用方法
//获取cookie function getCookieValue(cookieName) { var cookieValue = document.cookie; var co ...
- 【Go入门教程5】面向对象(method、指针作为receiver、method继承、method重写)
前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...
- linux各目录的作用
- Linux下对比两个文件夹的方法
最近拿到一份源代码,要命的是这份源代码是浅克隆模式的git包,所以无法完整显示里面的修改的内容. 今天花了一点点时间,找了一个在Linux对比两个文件夹的方法. 其实方法很简单,用meld 去对比两个 ...
- Python函数讲解
Python函数
- tornadod的异步代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import tornado.httpserver import tornado.ioloop import ...
- libevent在windows平台下通过vs进行编译
1.vs中新建一个静态库项目 2.配置头文件目录,将./compat../include../WIN32-Code三个目录添加到文件目录中 3.用记事本打开Makefile.nmake文件,可以看到里 ...
- C#与Java多态方面的语法差异
C++.C#.Java,无奈三种语言让我多次混淆,多次搞清楚,不写个Demo我想还是会忘记的. 就好像是一个满水的杯子,倒掉一点,才能装下更多. 有时候博客就是一个倒水的地方,可以让我们清空自己,然后 ...