mass Framework前后通吃,后端是基于node.js组建起来。后端与前端不一样,是依赖于node.js内置模块提供的一些API,因此前端那些依赖于浏览器提供的DOM API的模块无法复用。现在掐指一算,基本上核心模块上只有lang, flow能用得上,more则多一点,如random, pinyin, base64, uuid...

node.js内置了模块加载机制,这与我在前端使用的API非常不一致,我就再把它包装一层。核心模块与前端的核心模块在其他方法也尽量保持一致,当然像domReady在后端就不需要,去掉。如类型判定,由于是V8引擎,支持ECMA262v5,因此可以写得精简。最大的不同是,DEBUG用到mass.log,它的第二个参数是表示格式化高亮。

代码是暂时丢在这里,以后还要做各种扩展的!

(function(){//后端部分 2011.12.4 by 司徒正美function mass(){}varversion = 0.1,class2type = {"[object global]" : "Global" ,"null" : "Null" ,"NaN"  : "NaN"  ,"undefined" : "Undefined"},toString = class2type.toString;/*** 糅杂,为一个对象添加更多成员* @param {Object} target 目标对象* @param {Object} source 属性包* @return {Object} 目标对象*/function mix(target, source){var args = [].slice.call(arguments), key,ride = typeof args[args.length - 1] == "boolean" ? args.pop() : true;target = target || {};for(var i = 1; source = args[i++];){for (key in source) {if (ride || !(key in target)) {target[key] = source[key];}}}return target;}var rformat = /([\d\D]+?)/ig;var formats = {bold     : [1, 22],italic    : [3, 23],underline : [4, 24],inverse   : [7, 27],strike    : [9, 29]};var colors = {};['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'].forEach(function(word,i){colors[word] = i});colors.gray = 99;function format (arr, str) {return '\x1b[' + arr[0] + 'm' + str + '\x1b[' + arr[1] + 'm';};mix(mass,{//为此版本的命名空间对象添加成员rword : /[^, ]+/g,v : version,"@debug" : true,root: process.cwd(),/*** 数组化* @param {ArrayLike} nodes 要处理的类数组对象* @param {Number} start 可选。要抽取的片断的起始下标。如果是负数,从后面取起* @param {Number} end 可选。规定从何处结束选取* @return {Array}*/slice: function (nodes, start, end) {for(var i = 0,n = nodes.length, result = []; i < n; i++){result[i] = nodes[i];}if (arguments.length > 1) {return result.slice(start , (end || result.length));} else {return result;}},/*** 用于取得数据的类型或判定数据的类型* @param {Any} obj 要检测的东西* @param {String} str 要比较的类型* @return {String|Boolean}*/type : function (obj, str){var result = class2type[ (obj == null || obj !== obj )? obj : toString.call(obj) ] || "#";if( result.charAt(0) === "#"){if(Buffer.isBuffer(obj)){result = 'Buffer'; //返回构造器名字}else{result = toString.call(obj).slice(8,-1);}}if(str){return str === result;}return result;},/*** 用于调试* @param {String} s 要打印的内容* @param {Boolean} color 进行各种颜色的高亮,使用<code style="format:blod;color:red;background:green">* format的值可以为formats中五个之一或它们的组合(以空格隔开),背景色与字体色只能为colors之一*/log:function (s, color){if(color){s = s.replace(rformat,function(a,style,ret){style.toLowerCase().split(";").forEach(function(arr){arr = arr.split(":");var type = arr[0].trim(),val = arr[1].trim();switch(type){case "format":val.replace(/\w+/g,function(word){if(formats[word]){ret = format(formats[word],ret)}});break;case "background":case "color":var array = type == "color" ? [30,39] : [40,49]if( colors[val]){array[0] += colors[val]ret = format(array,ret)}}});return ret;});}console.log(s);},/*** 生成键值统一的对象,用于高速化判定* @param {Array|String} array 如果是字符串,请用","或空格分开* @param {Number} val 可选,默认为1* @return {Object}*/oneObject : function(array, val){if(typeof array == "string"){array = array.match(mass.rword) || [];}var result = {},value = val !== void 0 ? val :1;for(var i=0,n=array.length;i < n;i++){result[array[i]] = value;}return result;},mix:mix});mass.noop = mass.error = function(){};"Boolean,Number,String,Function,Array,Date,RegExp,Arguments".replace(mass.rword,function(name){class2type[ "[object " + name + "]" ] = name;});varrmodule = /([^(\s]+)\(?([^)]*)\)?/,names = [],//需要处理的模块名列表rets = {},//用于收集模块的返回值cbi = 1e4 ;//用于生成回调函数的名字var map = mass["@modules"] = {};//执行并移除所有依赖都具备的模块或回调function resolveCallbacks(){loop:for (var i = names.length,repeat, name; name = names[--i]; ) {var  obj = map[name], deps = obj.deps;for(var key in deps){if(deps.hasOwnProperty(key) && map[key].state != 2 ){continue loop;}}//如果deps是空对象或者其依赖的模块的状态都是2if( obj.state != 2){names.splice(i,1);//必须先移除再执行var fn = obj.callback;rets[fn._name] = fn.apply(null,incarnate(obj.args));//只收集模块的返回值obj.state = 2;repeat = true;}}repeat &&  resolveCallbacks();}function incarnate(args){//传入一组模块名,返回对应模块的返回值for(var i = 0,ret = [], name; name = args[i++];){ret.push(rets[name]);}return ret;}function deferred(){//一个简单的异步列队var list = [],self = function(fn){fn && fn.call && list.push(fn);return self;}self.method = "pop";self.fire = function(fn){while(fn = list[self.method]()){fn();}return list.length ? self : self.complete();}self.complete = mass.noop;return self;}var nativeModules = mass.oneObject("assert,child_process,cluster,crypto,dgram,dns,"+"events,fs,http,https,net,os,path,querystring,readline,repl,tls,tty,url,util,vm,zlib")function useNativeRequire(name,url){var nick = name.slice(1);if(nativeModules[nick]){map[name].state = 2;rets[name] = require(nick);resolveCallbacks();}else{url = url  || mass.root+"/" + nick + ".js";try{require(url);resolveCallbacks()}catch(e){mass.stack(Function('mass.log("\033[31m'+e+'\033[39m")'));mass.stack.fire();//打印错误堆栈}}}mass.mix(mass,{stack : deferred(),define:function(name,deps,callback){//模块名,依赖列表,模块本身if(typeof deps == "function"){//处理只有两个参数的情况callback = deps;deps = "";}callback._name = "@"+name; //模块名this.require(deps,callback);},require:function(deps,callback,errback){//依赖列表,正向回调,负向回调var _deps = {}, args = [], dn = 0, cn = 0;(deps +"").replace(mass.rword,function(url,name,match){dn++;match = url.match(rmodule);name = "@"+ match[1];//取得模块名if(!map[name]){ //防止重复生成节点与请求map[name] = { };//state: undefined, 未加载; 1 已加载; 2 : 已执行useNativeRequire(name,match[2]);//加载模块}else if(map[name].state === 2){cn++;}if(!_deps[name] ){args.push(name);_deps[name] = "司徒正美";//去重}});var cbname = callback._name;if(dn === cn ){//在依赖都已执行过或没有依赖的情况下if(cbname && !(cbname in rets)){map[cbname].state = 2 //如果是使用合并方式,模块会跑进此分支(只会执行一次)return rets[cbname] =  callback.apply(null,incarnate(args));   }else if(!cbname){//普通的回调可执行无数次return callback.apply(null,incarnate(args))}}cbname = cbname || "@cb"+ (cbi++).toString(32);if(errback){mass.stack(errback);//压入错误堆栈}map[cbname] = {//创建或更新模块的状态callback:callback,deps:_deps,args: args,state: 1};//在正常情况下模块只能通过resolveCallbacks执行names.unshift(cbname);resolveCallbacks();}});exports.mass = global.mass = mass;
})();

mass Framework在后端的核心模块相关推荐

  1. Nginx 核心模块与配置实践丨Nginx模版开发丨C++后端开发

    Nginx 核心模块与配置实践 概要: Nginx 简介 Nginx 架构说明 Nginx 基础配置与使用 1. Nginx 简介与安装 知识点: Nginx 简介 Nginx 编译与安装 Nginx ...

  2. [转]ASP.NET 核心模块配置参考

    本文转自:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore ...

  3. 一起手写Vue3核心模块源码,掌握阅读源码的正确方法

    最近和一个猎头聊天,说到现在前端供需脱节的境况.一方面用人方招不到想要的中高级前端,另一方面市场上有大量初级前端薪资要不上价. 特别是用 Vue 框架的,因为好上手,所以很多人将 Vue 作为入门框架 ...

  4. Spring源码学习笔记:起源发展和核心模块主要职能

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 1.Spring 的前世今生 早在 2007 年,一个基于 Java语言的开源框架正式发布,取了一个非常有活力 ...

  5. 【饿了么】—— Vue2.0高仿饿了么核心模块移动端Web App项目爬坑(一)

    [饿了么]-- Vue2.0高仿饿了么核心模块&移动端Web App项目爬坑(一) 前言:学习Vue.js高仿饿了么课程过程中,总结了这个Web App项目从准备到开发完毕自己觉得很重要的知识 ...

  6. Vue2.0高仿饿了么核心模块移动端Web App项目爬坑(一)

    原文https://www.cnblogs.com/ljq66/p/9980372.html 前言:学习Vue.js高仿饿了么课程过程中,总结了这个Web App项目从准备到开发完毕自己觉得很重要的知 ...

  7. 三星4418核心板 世界上最小的A9核心模块 性能强大

    第一章:E4418CORE工业级核心模块的前言简说历程 ◆公元2015元年,世界上第二大半导体三星电子收购南韩NEXELL公司(中文名:耐信隆)旗下的4330主控芯片,正式更名为S5P4418,彻底取 ...

  8. nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)

    目录 Nodejs 基础 大前端开发过程中的必备技能 nodejs 的架构 为什么是 Nodejs Nodejs 异步 IO Nodejs 事件驱动架构 全局对象 全局变量之 process 核心模块 ...

  9. 大前端 - nodejs 基础(核心模块、模块加载机制)

    node基础 一 nodejs 核心模块.模块加载机制 nodejs异步io和事件循环 nodejs单线程 nodejs实现api服务 nodejs核心模块和api使用 提供应用程序可直接调用库,例如 ...

最新文章

  1. 你知道实习对你有多重要吗?
  2. Hibernate干系映照小结
  3. InsecureRequestWarning: Unverified HTTPS request is being made to host(requests证书警告)
  4. 看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)
  5. 交易机项目工作日志--2013-3-3
  6. chrome开发者工具--使用 Network 面板测量您的网站网络性能。
  7. openStack常见报错
  8. 界面猜拳游戏 java_java猜拳游戏 (3局2胜)
  9. 查找算法之二 二分查找(C++版本)
  10. 岁月温柔-15 妈妈三天不吃饭再次住院
  11. 联想台式计算机驱动程序,联想键盘驱动程序
  12. 抗衡微软,UCDOS失策了,金山系软件完胜,不是WPS
  13. php简短一句话木马免杀,免杀/一句话木马(PHP)
  14. 2021-02-14马克思主义概论
  15. Failed to install ISKernel Files,make sure you have appropriate privileges on this machine
  16. JavaScript 利用Ajax制作一个汇率转换器
  17. python爬数据是什么意思-爬数据是什么意思?
  18. 大龄程序猿的出路在哪里
  19. 采用EasyNVR网页无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页上进行播放?
  20. 最新 解决 VMware 虚拟机 中被提示 Sorry, this application cannot run under a Virtual Machine

热门文章

  1. chmod修改文件夹权限
  2. SQL Server 2005 For XML[学习]
  3. PHP运算符与表达式
  4. js实现表格的增删改查
  5. ubuntu bless 16字节每行
  6. 我的Linux成长路---001 Linux学习初期计划
  7. 看菲菲详解如何快速获取linux命令帮助
  8. 我是一名Cisco爱好 者
  9. C#异步编程模式IAsyncResult概述
  10. 创建sql自定义的函数及商品分页sql存储过程