异步的模块合并管理器-m3m4版本和jquery版本(原创)
m3m4版本
(function(w){
var loading={}
var models={}
function define(name,args){
loading[name]=true
models[name]=args
}
function require(name,callback){
var next=function(){
require(name,callback)
}
if(loading[name]&&models[name].length==1){
models[name]=models[name][0]()
loading[name]=false
}
//解析
if(loading[name]&&models[name].length>1){
var args=models[name]
var func=args.pop()
var len=args.length
var dataArr=[]
for(var i=0;i<args.length;i++){
var model=args[i]
require(model,function(data){
dataArr.push(data)
if(--len==0){
var sync=args.indexOf("$callback")
if(sync==-1){
models[name]=func.apply(this,dataArr)
loading[name]=false
next()
}else{
dataArr[sync]=function(back){
models[name]=back
loading[name]=false
next()
}
func.apply(this,dataArr)
}
}
})
}
}else{
callback(models[name])
}
}
w.m3m4=function(func){
func(define,require)
}
})(typeof window!="undefined"?window:global)
demo1
m3m4(function(define,require){
define("a",[function(a){
return "a"
}])
define("b",["a","$callback",function(a,callback){
console.log(a)
setTimeout(function(){
callback("b sync")
},1000)
}])
define("c",["$callback","a","b",function(callback,a,b){
console.log(b)
console.log(a)
setTimeout(function(){
callback("c sync")
},1000)
}])
require("c",function(c){
console.log(c)
})
})
jQuery版本
(function($){
var loading={}
var models={}
function define(name,args){
loading[name]=true
models[name]=args
}
function require(name,callback){
var next=function(){
require(name,callback)
}
if(loading[name]&&models[name].length==1){
models[name]=models[name][0]()
loading[name]=false
}
//解析
if(loading[name]&&models[name].length>1){
var args=models[name]
var func=args.pop()
var len=args.length
var dataArr=[]
for(var i=0;i<args.length;i++){
var model=args[i]
require(model,function(data){
dataArr.push(data)
if(--len==0){
var sync=args.indexOf("$callback")
if(sync==-1){
models[name]=func.apply(this,dataArr)
loading[name]=false
next()
}else{
dataArr[sync]=function(back){
models[name]=back
loading[name]=false
next()
}
func.apply(this,dataArr)
}
}
})
}
}else{
callback(models[name])
}
}
$.define=define
$.require=require
})($)
demo2
var define= $.define
var require= $.require
define("a",[function(a){
return "a"
}])
define("b",["a","$callback",function(a,callback){
console.log(a)
setTimeout(function(){
callback("b sync")
},1000)
}])
define("c",["$callback","a","b",function(callback,a,b){
console.log(b)
console.log(a)
setTimeout(function(){
callback("c sync")
},1000)
}])
require("c",function(c){
console.log(c)
})
异步的模块合并管理器-m3m4版本和jquery版本(原创)的更多相关文章
- 使用 NuGet 包管理器在 Visual Studio 中安装和管理包
https://docs.microsoft.com/zh-cn/nuget/consume-packages/install-use-packages-visual-studio 通过 Window ...
- javascript 模块依赖管理的本质
模块模式定义 模块是'javascript'的一种设计模式,它为函数定义一个包装函数,并且该包装函数的返回值与模块的API保持一致: function createModule() { functio ...
- 使用 Windows 包管理器 (winget) 安装 .Net
用户可以在 Windows 10 和 Windows 11 计算机上使用 winget 命令行工具来发现.安装.升级.删除和配置应用程序. 此工具是 Windows 程序包管理器服务的客户端接口. 以 ...
- [Web 前端] 使用yarn代替npm作为node.js的模块管理器
cp from : https://www.jianshu.com/p/bfe96f89da0e Fast, reliable, and secure dependency managemen ...
- 使用yarn代替npm作为node.js的模块管理器
使用yarn代替npm作为node.js的模块管理器 转 https://www.jianshu.com/p/bfe96f89da0e Fast, reliable, and secure d ...
- nodejs-npm模块管理器
JavaScript 标准参考教程(alpha) 草稿二:Node.js npm模块管理器 GitHub TOP npm模块管理器 来自<JavaScript 标准参考教程(alpha)> ...
- JS模块规范 前端模块管理器
一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...
- 在SSIS 的 64 位版本中不支持 Excel 连接管理器
Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...
- Webpack: 为Web开发而生的模块管理器[转]
Webpack: 为Web开发而生的模块管理器 原文地址:http://hanjianwei.com/2014/09/10/webpack-package-manager-for-web/ 10 Se ...
随机推荐
- 使用rpmbuild打包时不对文件进行strip操作
使用rpmbuild打包时不对文件进行strip操作 摘自: https://www.ichenfu.com/2017/11/20/rpmbuild-not-strip/ By Chen Fu 发表于 ...
- timer实现Grid自动换行(连续相同的id跳到下一行)
private { Private declarations } FRow: Integer; procedure SetRow(const Value: Integer); public { Pub ...
- C# 微信openid 用户信息
前段demo index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- WinForm中TabControl的使用
TabControl和TabPage之间有一个默认颜色的边框,很难去除,需要重写TabControl控件重绘区域 public class FullTabControl : TabControl { ...
- css css预处理器
CSS预处理器(css preprocessor) 1.less: 2.sass: 3.scss: 4.stylus 参考: http://hao.jser.com/archive/2507/ htt ...
- ecliplse集成SVN
按照下图操作 : SVN不同版本下载链接在文章底部有提供 上图点击add之后稍等一会就会弹出下图: 上图点击next之后: 最后等待完成之后重启ecliplse即可 重启ecliplse之后显示SVN ...
- 第0篇 Python前言
1.注释 1)注释的作用: 用自己熟悉的语言在代码中添加注释,方便后期自己查看和理解,也方便其他人查看和理解代码含义. 2)单行注释: 以#号开头,#后面的所有内容均不会被程序执行,起到辅助说明的作用 ...
- spring boot 第一个Dome
1.创建Maven项目 按照下面的步骤 项目创建完成后的目录结构 2. 参照Spring boot官方文档修改pom.xml 修改 maven编译的jdk版本 将spring boot设置为 pare ...
- 查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准
这篇文章主要介绍了查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准,方便初学者选择适合自己的版本,需要的朋友可以参考下 Eclipse 是一个开放源代码的.基于Java的可扩展开发 ...
- Spring之BeanFactory与ApplicationConText
:BeanFactory基本的工厂解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口ApplicationContext接口implements ...