浅理解node.js
最近开始了解node.js,在这里把最近看的(七天学会nodejs)大概串一下,加深一下理解。
node.js是一个解析器——一种运行环境,允许JS使用运行环境提供的内置对象和方法做一些事情。例如fs/http内置对象。
——运行在服务端的JavaScript
1 先来个实际点的小例子,感受一下nodejs
var http = require(‘http‘); http.createServer(function (request, response) { response.writeHead(200, {‘Content-Type‘: ‘text/plain‘}); response.end(‘Hello World\n‘); }).listen(8888); console.log(‘Server running at http://127.0.0.1:8888/‘);
这样就创建了一个http服务器了。在http://127.0.0.1:8888上用浏览器访问,就可以看到输出的Hello World了。
2 模块
require //引用模块
main.js中引用其它模块
var hello=require(‘./hello.js‘);
exports //导出对象给require改模块的模块使用
exports.hello=function(){console.log(‘hello world‘);}
function hello(){ console.log(‘hello world‘); } exports.hello=hello;
module //可访问当前模块的信息,主要用于替换模块的默认导出对象
注意:模块中的代码仅在初始化时执行一次,再次利用时调用缓存重复利用
当一个包中有多个模块,可将主模块名为index.js,或者package.json,通过目录作为访问包的入口(而不是文件路径);
package.json { "name":"package" //模块的当前文件夹所在的文件夹 “main”:"./lib/main.js" // / home /node/package/lib/xx.js } //访问模块 require(‘/home/node/package‘) 哈,一看就是访问包的感觉
4 npm
获取第三方包
下载第三方包 npm install agrv;
或者在package.json 里配置
{ "name": "node-echo", "main": "./lib/echo.js", "dependencies": { "argv": "0.0.2" } }
5 正式一点的,小文件的copy
var fs=require(‘fs‘) //内置文件模板 function copy(src,dst){ fs.writeFileSync(dst,readFileSync(src)) } function main(argv){ copy(argv[0],argv[1]); } main(process.argv.slice[2]);//argv[0],argv[2]分别储存的执行程序和主模块的绝对路径
上述小文件属于一次性写入内存,一次性读出,会引起内存爆仓
大文件的写入(流水式)
var fs = require(‘fs‘); function copy(src, dst) { fs.createReadStream(src).pipe(fs.createWriteStream(dst));(边读边写) } function main(argv) { copy(argv[0], argv[1]); } main(process.argv.slice(2));
6 event的对象,eventemitter 时间发射和事件监听功能的封装
每个事件有一个事件名(字符串)和若干参数组成,一个事件可以有多个事件监器
var events = require(‘events‘); var emitter = new events.EventEmitter(); emitter.on(‘someEvent‘, function(arg1, arg2) { //注册事件监听器 console.log(‘第一个事件‘, arg1, arg2); }); emitter.on(‘someEvent‘, function(arg1, arg2) { console.log(‘第二个事件‘, arg1, arg2); }); emitter.emit(‘someEvent‘, ‘byvoid‘, 1991); //发射事件,依次调用事件监听
eventemitter API:
eventemitter.on(event,listener);
eventemitter.once(event,listener);事件只用一次解除
eventemitter.removeListener(event,listener);移除事件
error是eventemitter的特殊事件
遇到异常是发射error事件,调用监听函数,避免程序崩溃
var events = require(‘events‘); var emitter = newevents.EventEmitter(); emitter.on(‘error‘,function(){ console.log(‘error‘) }) emitter.emit(‘error‘);
关于继承:大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
7 全局变量
process:
process.argv 命令行参数数组
process.stdout/process.stdin
process.stdin.resume(); process.stdin.on(‘data‘, function(data) { process.stdout.write(‘read from console: ‘ + data.toString()); });
process.nextTick(callback),为时间循环设置任务,下次循环响应事调用callback,把复杂的工作拆分成小时间,提高响应速度,节省响应时间(本人此处理解不太透)
(今天先写这些,以后接着写)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。