============================
- 《Node.js实战》(node-in-action) book:
A neat wrapper around node.js fs.watch / fs.watchFile / fsevents. https://paulmillr.com
fairyilys@gmail.com fairy
N-blog: https://github.com/nswbmw/N-blog/tree/master/book
https://github.com/tywei90/CMS-of-Blog_Production
gitbook: https://maninboat.gitbooks.io/n-blog/content/
n-chat: https://github.com/nswbmw/N-chat
mystudy-blog: https://github.com/fairyly/mynodedemo/tree/myblog-node-addcomment
方法一
同样使用npm
npm install --global --production windows-build-tools
使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。
语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
+ 如果只是修复bug,需要更新Z位。
+ 如果是新增了功能,但是向下兼容,需要更新Y位。
+ 如果有大变动,向下不兼容,需要更新X位。
========================================================
-
Node 特点:
- 异步 I/O
- 事件与回调函数
- 单线程
- 跨平台
-
Node 应用场景
- I/O 密集型
- CPU 密集型
-
CommonJS 的模块规范
- 模块引入
- 模块定义
- 模块标识
-
Node 引入模块
- 路径分析
- 文件定位
- 编译执行
Node 模块分为两类: Node 提供的模块-核心模块;用户编写的模块-文件模块;
-
模块编译
- JavaScript 编译会在头部添加
(function (exports, require, module, __filename, __dirname) {\n,在尾部添加了\n})
- JavaScript 编译会在头部添加
在编译的过程中,Node对获取的JavaScript文件内容进行了头尾包装。在头部添加了(function (exports, require, module, __filename, __dirname) {\n,在尾部添加了\n});。一个正常的JavaScript文件会被包装成如下的样子:
(function (exports, require, module, __filename, __dirname) {
var math = require('math');
exports.area = function (radius) {
return Math.PI * radius * radius;
};
});
- 事件循环
- 观察者
- 请求对象
- I/O 线程池
- 定时器 (setTimeout(),setInterval(),setImmediate())
- process.nextTick()
process.nextTick()的意思就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行
function foo() {console.error('foo');}process.nextTick(foo);console.error('bar');
也可以使用setTimeout()函数来达到貌似同样的执行效果:
setTimeout(foo, 0);
console.log('bar');
但在内部的处理机制上,process.nextTick()和setTimeout(fn, 0)是不同的,process.nextTick()不是一个单纯的延时,他有更多的 特性。
更精确的说,process.nextTick()定义的调用会创建一个新的子堆栈。在当前的栈里,你可以执行任意多的操作。但一旦调用netxTick,函数就必须返回到父堆栈。 然后事件轮询机制又重新等待处理新的事件,如果发现nextTick的调用,就会创建一个新的栈。
-
Node提供以下几个全局对象
global:表示Node所在的全局环境,类似于浏览器的window对象。需要注意的是,如果在浏览器中声明一个全局变量,实际上是声明了一个全局对象的属性,比如var x = 1等同于设置window.x = 1,但是Node不是这样,至少在模块中不是这样(REPL环境的行为与浏览器一致)。在模块文件中,声明var x = 1,该变量不是global对象的属性,global.x等于undefined。这是因为模块的全局变量都是该模块私有的,其他模块无法取到。 process:该对象表示Node所处的当前进程,允许开发者与该进程互动。 console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。
-
Node还提供一些全局函数。
setTimeout():用于在指定毫秒之后,运行回调函数。实际的调用间隔,还取决于系统因素。间隔的毫秒数在1毫秒到2,147,483,647毫秒(约24.8天)之间。如果超过这个范围,会被自动改为1毫秒。该方法返回一个整数,代表这个新建定时器的编号。 clearTimeout():用于终止一个setTimeout方法新建的定时器。 setInterval():用于每隔一定毫秒调用回调函数。由于系统因素,可能无法保证每次调用之间正好间隔指定的毫秒数,但只会多于这个间隔,而不会少于它。指定的毫秒数必须是1到2,147,483,647(大约24.8天)之间的整数,如果超过这个范围,会被自动改为1毫秒。该方法返回一个整数,代表这个新建定时器的编号。 clearInterval():终止一个用setInterval方法新建的定时器。 require():用于加载模块。 Buffer():用于操作二进制数据。
-
Node提供两个全局变量,都以两个下划线开头。
__filename:指向当前运行的脚本文件名。 __dirname:指向当前运行的脚本所在的目录。
-
核心模块
http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
- nodejs 接收 base64 转二进制存储
/* node.js
app.post('/upload', function(req, res){
//接收前台POST过来的base64
var imgData = req.body.imgData;
//过滤data:URL
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile("image.png", dataBuffer, function(err) {
if(err){
res.send(err);
}else{
res.send("保存成功!");
}
});
});
*/