松江九亭网站建设,做网站是自己公司做好还是外包好,seo外链建设的方法有,学室内设计去哪个学校好为什么80%的码农都做不了架构师#xff1f; 构建 目前前端构建工具流行的是 grunk.js 功能是大而全#xff0c;但往往大而全的东西为了多样性 需要做额外的配置 我还是想要有一个专门为自己特性项目而生构建工具 我不想加载第三方的node模块#xff0c;也不… 为什么80%的码农都做不了架构师 构建 目前前端构建工具流行的是 grunk.js 功能是大而全但往往大而全的东西为了多样性 需要做额外的配置 我还是想要有一个专门为自己特性项目而生构建工具 我不想加载第三方的node模块也不想写配置 ,想要的功能也很简单只是根据文件名字进行合并 build.js 名字规则 a-b-c.js 或者 a-b-c.txt a代表文件合并的顺序这个顺序跟文件显示的顺序一致 第一固定为0 最后固定为e b代表合并后的文件名字 c代表自己的文件名字 以下代码会 寻找当前目录下src目录中的所有js,txt文件 提取b相同的文件 按照a顺序 进行合并 //将src目录中的js文件 按照文件名字规则 合并到js文件夹中
var fsrequire(fs);
//顺序执行
function sear(arr,call){if(arr!arr[0])return;!function run(i,para){if(iarr.length){call(null,para);return;}arr[i](function(err,para){if(err!null){call(err);return;}run(i1,para);},para); }(0);
}
//遍历 并列执行 结果反馈给回调
function map(arr,fn,call){if(Object.prototype.toString.call(arr)[object Array]){var rs[],rerrnull,num1;for(var i0,larr.length;il;i){!function(t,i){fn(function(err,res){if(err)rerrerr;else rs[i]res;if(numl)call(rerr,rs);},t,i);}(arr[i],i)}}else if(Object.prototype.toString.call(arr)[object Object]){var keys[],num1,rs{},rerrnull;for(var key in arr)keys.push(key);for(var key in arr){!function(t,key){fn(function(err,res){if(err)rerrerr;else rs[key]res;if(numkeys.length)call(rerr,rs);},t,key);}(arr[key],key)}}
}
function each(arr,fn){for(var i0,larr.length,t;il;i){tarr[i];if(fn(t,i)false)break;}
}
console.time(构建js);
sear([function(next){fs.readdir(__dirname/src,next);
},function(next,fiels){var r{};each(fiels,function(t,i){var at.split(.);if(a[1]!jsa[1]!txt)return;var ba[0].split(-);if(b.length!3)return;var typeb[1];r[type]r[type]||[];r[type].push({sort:b[0],path:__dirname/src/t});});for(var key in r){r[key].sort(function(a,b){return ab});}next(null,r);
},function(next,obj){map(obj,function(end,t,key){map(t,function(end1,t1,i1){fs.readFile(t1.path,utf-8,end1);},end);},next);
},function(next,p){map(p,function(end,t,key){fs.writeFile(__dirname/js/key.js,t.join(\n/**/\n),end)},next);
}],function(err,p){if(err)console.error(err);else console.timeEnd(构建js);
}); route.js拆分后为下图 0 和 e 是 兼容ADM加载器 ,对外暴露api的开头和结尾 其他的文件都是单独的一个个模块 每个模块代码都不足百行 阅读起来会非常方便 1-route-type.js 数据类型判断 2-route-core.js 路由注册和解析实现核心部分 3-route-get.js get路由匹配实现 4-route-decode.js 编码问题 5-route-querystring.js url参数和json互相转换 querystring url: ?abbcd1 经过querystring会把上面url参数转换为 {a:b,b:c,d:1} 转换的结果存放req.query属性上 相反的操作 在使用to函数的时候可以传一个对象 querystring会转换为 url的形式 5-route-querystring.js function each(arr,fn){for(var i0,larr.length,t;il;i){tarr[i];if(fn(t,i)false)break;}
}
//url参数和json互相转换 转换后存储在req.query属性中
!function(route){var toroute.to,useroute.use;function stringify(obj){var a[];for(key in obj){a.push(keyobj[key]);}return a.join()}use(function(req,next){var urlpreq.path.split(?)[1];if(!urlp){next();return;}var aurlp.split();var r{};each(a,function(t,i){var bt.split();r[b[0]]b[1];});req.queryr;next();});route.mix({to:function(path,obj){if(path.indexOf(?)-1obj){path?stringify(obj);}to(window.encodeURI(path));}})
}(route); 对于ie 67 浏览器 改变路由无法调用到相应的路由 下一步会对ie67 做兼容 以上所有代码 https://git.oschina.net/diqye/route.js 转载于:https://my.oschina.net/diqye/blog/477602