blog
blog copied to clipboard
红日初升,其道大光:sun_with_face::house_with_garden:请star或watch,不要fork
 [resource-router-middleware](https://github.com/developit/resource-router-middleware)是一个提供restful API的Express中间件,由preact作者[developit](https://github.com/developit)开发。 一个简单使用案例就是: ```javascript const resource = require('resource-router-middleware'); let users = []; const huruji = { id:12, name: 'huruji', age: 12, sex: 'man' }; const grey = { id:...
nodercms是一个使用express+mongoose编写的cms。整个项目目录结构是一个典型的Express应用的项目结构,项目的后端代码量为7000行左右。 项目对于新手值得学习的地方主要在于 1、将routes和controllers的关系通过一个json对象指定有效的将routes和controllers分离开了 2、使用log4js保存整个项目的日志,并且将日志分为access、database、errors、system四类,并且按照日期保存为单独文件 3、将对mongodb的model的操作划分为单独的services,不至于controllers过于臃肿,同时能够有效解耦 同时项目也是mongoose操作、Express项目、log4js、cms等的使用和开发的范本,非常适合node.js新手阅读。
 [pseudomap](https://github.com/isaacs/pseudomap)项目是一个ES6之前使用Map数据结构的一个工具库,map的特点在于拓展了对象的键只能是字符串的短板,在ES6之前很容易想到使用一个构造函数来实现,同时对于每一个键值关系使用一个新的对象存储,``this.key=key;this.value=value``的形式。适合JavaScript初学者学习构造函数的使用,同时大神的代码质量还是非常值得学习的,大神终究是大神!!! ```JavaScript var hasOwnProperty = Object.prototype.hasOwnProperty module.exports = PseudoMap function PseudoMap (set) { // 检测this的指向来判断该函数是否被当做构造函数运行,使用new实例化 // 构造函数时将改变this的指向为该对象,直接运行函数,this则是指全局对象 if (!(this instanceof PseudoMap)) // whyyyyyyy throw new TypeError("Constructor PseudoMap requires 'new'")...
[node-mkdirp](https://github.com/substack/node-mkdirp)是一个linux命令 ``mkdir -p``的node版本,也就是创建多级目录。node-mkdirp值得新手学习的地方在于学习对于错误码的利用和基本的API使用。我曾经也写过一个创建多级目录的方法,不过自己都只是通过split方法对目录分隔开后逐层判断是否存在,再创建。node-mkdirp的方式则是通过fs.mkdir的错误码来判断,挺巧妙的。 ``` var path = require('path'); var fs = require('fs'); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; function mkdirP (p, opts, f, made)...
validator.js是一个对字符串进行数据验证和过滤的工具库,同时支持Node端和浏览器端,github地址是[https://github.com/chriso/validator.js](https://github.com/chriso/validator.js) 主要API如下: ## 验证API #### contains(str, seed) 验证str中是否含有seed  #### equals(str, comparison) 验证是否相等  #### isAfter(str[, date]) 验证str是否是一个指定date之后的时间字符串,默认date为现在,与之相反的是isBefore方法  #### isBoolean(str) 检查是否是布尔值  #### isCreditCard(str) 检查是否是信用卡 #### isDivisibleBy(str, number) 检查str是否是一个可以被number整除的数字...
 在[Shell编程快速入门指南](https://github.com/huruji/blog/issues/18)一文中已经简单介绍了字符串的变量命名、截取、获取长度等操作,但通常我们对字符串的操作的需求远远不止这些,Shell本身一起已经内置了一些对字符串的操作。 ## 判断和读取字符串 + **${var-default}**和**${var=default}**:如果var没有被声明,则使用$default为其值 ```shell a="linux" b="win" c=${d-$b} e=${a-$b} echo $c echo $e # 输出 # win # linux ``` + **${var:-default}** 和 **${var:=default}**:如果var没有被声明或者为空,则使用$default为其值 例子使用上例 ```shell c=${d-$b} e=${a-$b}...
 ## 第一个shell脚本 ``` #!/bin/bash echo "hello, world" ``` 运行程序可以作为解释器参数或者作为可执行程序 ``` bash test.sh ``` ``` chmod +x test.sh test.sh ``` ## 变量 **命名** ``` name="huruji" ``` 需要注意的是变量名与等号之间不能有空格。 #### 使用 ```...
 对于AMD规范的具体描述在这里可以找到[AMD (中文版)](https://github.com/amdjs/amdjs-api/wiki/AMD-(%E4%B8%AD%E6%96%87%E7%89%88)). AMD规范作为JavaScript模块加载的最流行的规范之一,已经有很多的实现了,我们就来实现一个最简单的AMD加载器 首先我们需要明白我们需要有一个所有模块的入口也就是主模块,主模块的依赖加载的过程中迭代加载相应的依赖,我们使用use方法来加载使用主模块。 同时我们需要明白加载依赖之后需要执行模块的方法,这显然应该使用callback,同时为了多个模块依赖同一个模块的时候,不会多次执行这个模块我们应该判断这个模块是否已经加载过,因此我们可以使用一个对象来描述一个模块。而所有的模块我们可以一个对象来存储,使用模块名作为属性名来区分不同模块。 首先我们先来实现use方法,这个方法就是主模块方法,使用这个模块的方法就是加载依赖之后,执行主模块的方法,如下: ```javascript function use(deps, callback) { if(deps.length === 0) { callback(); } var depsLength = deps.length; var params = []; for(var i = 0;...
 在上一篇文章中,我们已经基本完成了模块加载器的基本功能,接下来来完成一下路径解析的问题。 在之前的功能中,我们所有的模块默认只能放在同级目录下,而在实际项目中,我们的js很有可能位于多个目录,甚至是CDN中,所以现在这种路径解析是非常不合理的,因此我们需要将每个模块的name转化为一个绝对路径,这样才是一个比较完美的解决方案。 借鉴部分requirejs的思想,我们可以通过配置来配置一个baseUrl,当没有配置这个baseUrl的时候,我们认为这个baseUrl就是html页面的地址,所以我们需要对外暴露一个config方法,如下: ```javascript var cfg = { baseUrl: location.href.replace(/(\/)[^\/]+$/g, function(s, s1){ return s1 }) } function config(obj) { obj && merge(cfg, obj); } function merge(obj1, obj2) { if(obj1...
 在上一篇文章中,我们的AMD模块加载器基本已经能够使用了,但是还不够,因为我们没有允许匿名模块,以及没有依赖等情况。实际上在amd的规范中规定的就是define函数的前两个参数是可选的,当没有id(模块名)的时候也就意味着不会有模块依赖于这个模块。很显然,我们的define函数的每个参数的类型是不同的,因此我们需要一些函数来做类型判断,如下: ```javascript function isFun(f) { return Object.prototype.toString.call(f).toLowerCase().indexOf('function') > -1; } function isArr(arr) { return Array.isArray(arr); } function isStr(str) { return typeof str === 'string'; } ``` 将这些类型判断函数运用在define函数,判断这个模块是否有依赖,是否为匿名模块,这是一个比较简单的工作,修改define函数如下: ```javascript function...