不要温柔地走入AMD
1.无依赖情况
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>一步步走入AMD</title><script>var req = {};/*无依赖*/req.config = {"a":{deps:[],fn:function(){console.log("a");}},"b":{deps:[],fn:function(){console.log("b");}},"c":{deps:[],fn:function(){console.log("c");}},}var require = function(deps,fn){var config = req.config,deps_arr = [];// 1.找依赖,生成依赖数组for(var i=0,l = deps.length; i<l; i++){var deps_item = deps[i];deps_arr.push(config[deps_item].fn);}// 2.依赖数组,是入口函数的参数 fn.apply(window,deps_arr);};require(["a","b"],function(a,b){a();b();});</script> </head> <body></body> </html>
2.有依赖
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script> var req = {};/*有依赖*/req.config = {"a":{deps:["b"],fn:function(b){return function(){console.log("a");b();}}},"b":{deps:["c"],fn:function(c){return function(){console.log("b");c();}}},"c":{deps:[],fn:function(){var private_c = "cc"return function(){console.log("c");console.log(private_c);}}}}var require = function(deps,fn){var config = req.config,deps_arr = [];var excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}// 包装各个依赖函数 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的执行参数生成 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});console.log(excute_obj);deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};// bug:依赖设置错误 require(["a"],function(a){a();});</script> </head> <body></body> </html>
3.循环依赖判断
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script> var req = {};/*有循环依赖*/req.config = {"a":{deps:["b","c"],fn:function(b,c){return function(){console.log("a");b();c();}}},"b":{deps:["c"],fn:function(c){return function(){console.log("b");c();}}},"c":{deps:["a"],fn:function(){return function(){console.log("c");}}}}var require = function(deps,fn){var config = req.config,deps_arr = [];var excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}console.log(deps_chain);function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环 (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){ keyChain = [false,nextKey,keyChain.pop()];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}(function(){// 循环依赖检测var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});// var keyChain = loopDepJudge()// 包装各个依赖函数 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的执行参数生成 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});console.log(excute_obj);})();deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};require(["a"],function(a){a();});</script> </head> <body></body> </html>
4.define函数定义
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script> var req = {};/*define函数定义*/req.requireConfig = {};var define = function(deps,fn){var protocal = location.protocal,host = location.host,port = location.port,pathName = location.pathname,href = location.href,paths = req.userConfig.paths,baseUrl = req.userConfig.baseUrl || "";function baseUrlParse(baseUrl){var str_length = baseUrl.length,newBaseUrl = "";if(baseUrl.lastIndexOf("/") == str_length -1){}else{newBaseUrl = baseUrl + "/";}return newBaseUrl;}// 不支持IE// 1.获取当前js文件地址var scriptSrc = document.currentScript.src;for (var i in paths) {var path = paths[i],complete_path = "";// 2. 生成complete_pathvar backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;// 3. 根据文件地址进行匹配,从而生成req.requireConfigif(scriptSrc == complete_path){req.requireConfig[i] = {"deps":deps,"fn":fn};}};};var require = function(deps,fn){function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环 (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){ keyChain = [false,nextKey,keyChain.pop()];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}var config = req.requireConfig,deps_arr = [],excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}// 循环依赖检测 (function(){var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});})();// 包装各个依赖函数 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的参数数组生成 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});// 主函数的参数数组生成 deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};req.userConfig = {"baseUrl":"","paths":{"a":"a.js","b":"b.js","c":"c.js"}};</script><script type="text/javascript" src="b.js"></script><script type="text/javascript" src="a.js"></script><script type="text/javascript" src="c.js"></script><script>require(["a"],function(a){a();});</script> </head> <body></body> </html>
5.js加载器生成
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script>/*1.暂不支持shim*/ var req = {};req.requireConfig = {};req.userConfig= {};// 用来记录js加载的数目 req.jsLoadCount = 0;function baseUrlParse(baseUrl){var str_length = baseUrl.length,newBaseUrl = "";if(baseUrl.lastIndexOf("/") == str_length -1){}else{newBaseUrl = baseUrl + "/";}return newBaseUrl;}function getObjSize(obj){var size = 0;for(var i in obj){var item = obj[i];if(item !== null && typeof(item) !== "undefined"){size++;}}return size;}var define = function(deps,fn){var protocal = location.protocal,host = location.host,port = location.port,pathName = location.pathname,href = location.href,paths = req.userConfig.paths,baseUrl = req.userConfig.baseUrl || "";// 不支持IE// 1.获取当前js文件地址var scriptSrc = document.currentScript.src;for (var i in paths) {var path = paths[i],complete_path = "";// 2. 生成complete_pathvar backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;// 3. 根据文件地址进行匹配,从而生成req.requireConfigif(scriptSrc == complete_path){req.requireConfig[i] = {"deps":deps,"fn":fn};}};};var require = function(deps,fn){// 检测js加载完毕与否var timer_loader = setTimeout(function(){if(req.jsLoadCount == 0){clearTimeout(timer_loader);mainRequire();}else{timer_loader();}},200);function mainRequire(){function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环 (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){keyChain = [false,nextKey,keyChain];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}var config = req.requireConfig,deps_arr = [],excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}console.log(config);// 循环依赖检测 (function(){var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});console.log(circle_deps);deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("前方高能,有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});})();// 包装各个依赖函数 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的参数数组生成 deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});// 主函数的参数数组生成 deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr); }};require.config = function(config_obj){req.userConfig = config_obj;req.jsLoadCount = getObjSize(config_obj.paths);function generateScript(url,loadCount){var _script = document.createElement('script');_script.type = 'text/javascript';_script.charset = 'utf-8';_script.async = true;_script.src = url;_script.onload = function(){req.jsLoadCount--;};_script.onerror = function(e){throw new Error(e);};var fs = document.getElementsByTagName('script')[0];fs.parentNode.insertBefore(_script, fs);}var href = location.href,baseUrl = req.userConfig.baseUrl || "";paths = req.userConfig.paths;for(var i in paths){var path = paths[i],backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;generateScript(complete_path);}}require.config({"baseUrl":"","paths":{"c":"c.js?v=3","a":"a.js","b":"b.js"}});require(["a","b"],function(a,b){a();b();});</script></head> <body></body> </html>
不要温柔地走入AMD相关推荐
- 一位小创业者血泪史:培养过很多技术大佬,但我还在发传单(转)
猎云注:在互联网这个高度竞争机会稍纵即逝的行业中,不少人抓住了机遇一鸣惊人,而更多的是失意者.以下为嫁拍网 CEO 陈晓峰的一篇反思文章,从中回顾此前在百度担任某业务负责人先后带过的"小弟& ...
- 那些年,我培养过的大佬
当已过而立之年的我被老板催单子.站在阜成门地铁站门口发传单的时候,我的人生跌入谷底.我怎么会混到这个地步? 清华毕业后,我做过百度高级经理,在人人网主持过风车网旅游项目,带领过 360 搜索引擎的开发 ...
- AMD之A系列APU问世 引领平板市场与高清视频
图:AMD LlanoAPU 2011年6月14日,AMD正式发布了全新的主流笔记本平台--"Sabine",Sabine平台采用了代号为Llano的A系列APU,AMD在Sabi ...
- 8月第四周回顾:四核产品将发口角先起 AMD遭遇跳票流言
2007年的9月将是服务器历史上比较重要的一个时刻,因为英特尔和AMD都将隆重发布自己的四核处理器.然而就在上周,一则关于AMD推迟发布产品的传言,使两家公司的竞争先从"口"上开始 ...
- AMD统一渲染GPU架构 历程回顾与评测
AMD统一渲染GPU架构 历程回顾与评测 前言:NVIDIA公司历经长时间酝酿的Fermi架构高端产品GTX480/GTX470发布已经结束,经历了长达一个月的忙碌,我们已经了解到了这款产品的 ...
- amd cpu排行_最新CPU性能排行榜,兼顾游戏和专业的究极神器
是的,你们没有看错!那个帅气的我,又来了.这次给大家带来了最新(目前主流最强)的CPU排行榜.这个榜单说真的还不是我自己弄的.而是由德国一家评测媒体PCGH公布的相对权威排行榜,涵盖了AMD.Inte ...
- 适用于AMD ROC GPU的Numba概述
适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中,从而支持AMD ROC GPU编程.用Numba编写的内核似 ...
- AMD Ryzen 5000‘Cezanne’APU
AMD Ryzen 5000'Cezanne'APU Spotted,Zen 3&7nm Vega芯片将在2021年前保留AM4支持 AMD Ryzen 5000 'Cezanne' APU ...
- AMD–7nm “Rome”芯片SOC体系结构,支持64核
AMD–7nm "Rome"芯片SOC体系结构,支持64核 AMD Fully Discloses Zeppelin SOC Architecture Details at ISS ...
最新文章
- 如何用数据结构解释计算机系统 常用数据结构
- 小程序之获取用户信息取消授权处理
- jQuery美化select下拉框
- spring冲刺第一天
- Qt Creator创建项目
- 单页面axios_Axios封装之取消重复请求和接口缓存
- 负责域名解析的DNS服务
- 互联网广告系统综述一生态圈
- 学习使用资源文件[2] - Ico
- Fiddler访问百度
- 应网友邀请参加了2011年度51CTO的IT博客大赛
- 解决C#中ListView闪烁的办法
- Java程序员技术栈
- C/C++常用工具一览
- NOI2003 智破连环阵
- 收敛因子和黄金正弦指引机制的蝴蝶优化算法
- [扩展阅读] EasyGUI 学习文档【超详细中文版】
- 3 Linux 10个主流发行版本
- Flash Professional / 处理 Flash 文档 XFL(XML格式描述的CS5 FLA)
- js关于时间(date)的比较
热门文章
- 代码随想录算法训练营Day15|Leetcode102二叉树的层序遍历、Leetcode226翻转二叉树、Leetcode101对称二叉树
- Scanner的使用
- 【VR】Leap Motion 官网文档 HandModel(手部模型)
- python爬取图片并以二进制方式保存到本地
- R语言backtest函数
- android pin码 经典蓝牙_Android 蓝牙 pin 自动配 setPin()方法有时候无效
- 换个角度,智能硬件也能这样玩
- HP Xeon 55xx上GPU的带宽问题
- 怎么样可以把网站部署到阿里云服务器
- 计算机组成原理实验运动码表,计算机组成原理实验【参考】.doc