NODE VIDEO(一起来使用node.js制作一个小视频吧)
一、详解如何实现一个简单的Node.js脚手架
原因
在工作中,需要开发一个脚手架,用于给相关用户提供相关的开发便利性。
适合人群
对前端、Node操作有一定的了解,同时向了解脚手架开发过程或者需要自己实现一个脚手架的开发者。
目标
开发一个简单的脚手架,能够提供给用户进行安装。
能够输出相关提示。
对用户文件进行读写操作。
在脚手架中使用Shell脚本。
步骤
开发脚手架
脚手架的开发最开始过程与普通的前端项目相同,需要一个入口文件command.js和配置文件package.json。
与其他配置文件不同的是,需要在package.json文件中加上一下一项:
{
...,
"bin":{
"cm-cli":"command.js"
}
}
在配置文件中增加了此项后,只需要在配置文件根目录下执行npm link命令,即可使用cm-cli--help命令来查看加载的cm-cli脚手架。
如果你发布了你的脚手架,那么在其他用户使用命令npm install-g cm-cli之后,便可以在全局下使用你的脚手架了。
对用户进行提示
在对注释和命令进行提示中,我们需要使用到commander包,使用npm install commander即可进行安装。(如果NPM版本低于5,则需要添加--save参数保证更新package.json配置文件)。
commander是一个提供用户命令行输入和参数解析的强大功能。有需要的可以阅读相关的库文档。在这里我介绍两个用的最多的方法。
option
能够初始化自定义的参数对象,设置关键字和描述,同时还可以设置读取用户输入的参数。具体用法如下:
const commander= require('commander');
commander.version('1.0.0')
.option('-a,--aaa','aaaaa')
.option('-b,--bbb','bbbbb')
.option('-c,--ccc [name]','ccccc')
.parse(process.argv);
if(commander.aaa){
console.log('aaa');
}
if(commander.bbb){
console.log('bbb');
}
if(commander.ccc){
console.log('ccc', commander.ccc);
}
具体展示如下:
command
该方法能够在命令行增加一个命令。用户在执行此命令后,能够执行回调中的逻辑。具体用法如下:
commander
.command('init<extensionId>')
.description('init extension project')
.action((extensionId)=>{
console.log(`init Extension Project"${extensionId}"`);
// todo something you need
});
具体展示效果如下:
对用户文件进行读写操作
通过上面的步骤,我们已经能够完成一个简单的脚手架了。下面,我们需要读取用户配置,同时为用户生成一些模板文件。
读取文件
现在,我们需要读取用户的cm-cli.json配置文件来进行一些配置。
我们可以使用Node.js的fs文件模块来对文件进度读操作,由于此处没有太多难点,因此略去。
写入文件模板
我们提前将模板文件存储在CDN上,再根据本地读取到的相关脚手架配置文件来进行模板的下载。
注:脚手架中读取的路径为使用者使用时当前路径,因此没有办法将模板文件存储在脚手架中进行读取。
我们可以使用诸如request这种库来帮助我们进行文件下载,简化操作步骤。执行npm install request`即可进行安装。
注:在文件写入时建议先判断文件是否存在,再进行覆盖。
使用Shell脚本
与Node.js提供的API函数来看,有些人更加倾向于使用Shell脚本来进行文件操作。幸运的是,我们也可以在我们的脚手架中引入node-cmd来启用对Shell脚本的支持。执行npm install node-cmd即可进行安装。
具体示例如下:
commander
.command('init<extensionId>')
.description('init extension project')
.action((extensionId)=>{
id= extensionId;
console.log(`init Extension Project"${extensionId}"`);
cmd.get(
`
mkdir-p static/${extensionId}
mkdir tmp
mkdir tmp/source-file
mkdir tmp/build-file
curl-o tmp/source-file/index.js
touch tmp/source-file/index.css
curl-o tmp/build-file/server.js
curl-o tmp/build-file/router.js
curl-o tmp/build-file/package.json
cp tmp/source-file/* static/${extensionId}
cp tmp/build-file/*./
rm-fr tmp
npm install
`,
(err, data)=>{
console.log(data)
if(!err){
console.log('init success');
return;
}
console.error('init error');
});
});
我们可以快速的使用Shell脚本来进行文件夹的创建和文件模板的下载。
脚手架想要在终端能够快速执行,可以在package.json配置文件中增加相关字段。
脚手架需要能够读取相关终端输入,可以使用commander库来快速开发。
脚手架需要能够执行Shell脚本,可以使用node-cmd库来快速实现需求。
二、如何用 Node.js 制作验证码
node-ccap模块生成captcha验证码
用node做web开发很多都可能碰到需要验证码的地方,之前在github上搜索,有一些比如node-captcha等的类库,都需要依赖第三方的图形处理库或者软件,像我之前安装cario这个图形库时,真是费了好大一番劲,但是其实我们只用到了这些图形库的一点点小功能,比如图片的尺寸修改裁剪,或者生产验证码。
先介绍一下CImg这个c++的图形库吧,CImg是一个跨平台的C++的图像处理库,提供了加载、处理、显示、保存等一系列功能,最吸引人的地方是整个图形库就一个CImg.h这个文件,所以非常的便携绿色环保,带到哪里都可以进行编译使用,不用安装一大推依赖。于是我就想利用这个CImg图形库做一个简单的demo,就从实现验证码这个功能入手,当然可以完全利用这个库来做裁剪图片等其他功能。
ccap模块是基于CImg图形库的封装,让它可以供node使用,由于CImg图形库的便携性,所以ccap模块可以完全不依赖其他任何第三方图形库或者软件而独立工作,也就说如果只是想要生成简单的验证码,只要require这个ccap模块即可。
生成的图片示例:
1、安装:
通用方法:npm install ccap
或者通过github下载,地址:
2、性能:
在2cpu的linux 64位服务器上生成验证码速度可以达到1200次/秒,测试生成的图片是BMP的,jpeg的图片验证码生成速度大约在600次/秒。
3、声明方法:
varccap=require('ccap');
varcaptcha1=ccap();
varcaptcha2=ccap(width,height,offset);
varcaptcha3=ccap({
width:256,//setwidth,defaultis256
height:60,//setheight,defaultis60
offset:40,//settextspacing,defaultis40
quality:100,//setpicquality,defaultis50
generate:function(){//Customthefunctiontogeneratecaptchatext
//generatecaptchatexthere
returntext;//returnthecaptchatext
}
});
可以通过上述代码实例化一个ccap类。
1、不传任何参数,全部使用默认的参数进行生成验证码
2、只传递宽,高,偏移进行实例化,调整图片的大小,和图片中文字的间隔
3、传递一个对象,除了宽,高和偏移,还传递了图片质量以及生成随机数的方法,ccap模块会根据自定义函数return的字符串作为图片验证码的内容,默认是0-9,A-Z的6位随即字符串。
理论上可以生产很多不同的ccap的实例,而且他们之间互相没有影响,所以即使是通过cluster开启多进程的node同时生产验证码也不存在互相锁止的影响。
对于图片质量只对jpeg图片有效,如果没有安装任何jpeg的lib库的话,只能使用bmp未压缩图形了,体积比较大,但是生成速度比较快。
4、使用方法,get():
var ccap= require('ccap');
var captcha= ccap();
var ary= captcha.get();//ary[0] is captcha's text,ary[1] is captcha picture buffer.
var text= ary[0];
var buffer= ary[1];
实例化ccap类之后,会得到captcha对象,这个对象只有一个对外方法,get(),这个方法每次调用都会返回验证码buffer和对应的text字符串内容,保存在数组里,类似这样的结构:
["captcha text","picture buffer"]
5、一个简单的web例子:
varhttp=require('http');
varccap=require('ccap')();//Instantiatedccapclass
http.createServer(function(request,response){
if(request.url=='/favicon.ico')returnresponse.end('');//Interceptrequestfavicon.ico
varary=ccap.get();
vartxt=ary[0];
varbuf=ary[1];
response.end(buf);
console.log(txt);
}).listen(8124);
console.log('Serverrunningat
;
);
上面这个例子会将验证码返回给客户端,并且把对应的验证码的文字输出出来,同时拦截了favicon.ico的请求。
结果如下图:
有兴趣的TX可以下载下来试试,如果安装有jpeg库的话,可以把根目录下的binding.jpeg.gyp覆盖改名为binding.gyp然后rebuild就可以使用jpeg图片作为验证码了,体积会小很多。另外ccap模块做了一些缓存的机制,尽量发挥更好的性能。
目前ccap已经对linux系统支持jpeg验证码,体积从45kb直降到6kb
三、开发一个网站用php还是node.js
你会javascript,肯定学node.js更快一些,因为node.js就是运行在javascript环境下的。此外没有什么是不适合新手的,几乎每一种语言都希望自己被普及,因此都是被设计得让人容易理解和接受的。
和php比,node.js有优势也有劣势。据google自己说,node.js比php、python等都快,尤其在处理大量并行访问的时候。因此如果你要开发的网站,在同一时间会有很多人访问,那么选node.js是不错的;劣势就是太年轻,没有php普及,也许还潜藏着很多问题,毕竟php发展到今天,历经多个版本的修正、无数服务器的检验,而且教程和例子比node.js要多的多。
node.js还有一个小优势,因为都是javascript环境,可以更轻松的发挥javascript动态编程的特点,建立服务器和浏览器之间的动态应用(注意,php也是可以的,只不过在编程的时候程序员要时常切换语言模式,稍微麻烦一些)。
所以,选哪个主要看你的网站是什么样子的。一般的网站,选php就行了。游戏网站,或客户数非常多的应用网站,可以选node.js。