浅理解node.js

最近开始了解node.js,在这里把最近了解的大概串一下,加深一下理解。

 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   文件处理,文件处理一般存在两个版本:同步,异步。

//文件的读取
fs.readFile(filename,[encoding],[callback(err,data)])
fs.readFileSync(filename,[encoding],[callback(err,data)]) //同步
  • filename(必选),表示要读取的文件名。
  • encoding(可选),表示文件的字符编码。
  • callback 是回调函数,用于接收文件的内容。

如 果不指 定 encoding,则 callback 就是第二个参数。回调函数提供两个参数 err 和 data,err 表 示有没有错误发生,data 是文件内容。如果指定了 encoding,data 是一个解析后的字符 串,否则 data 将会是以 Buffer 形式表示的二进制数据。

小文件的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,把复杂的工作拆分成小时间,提高响应速度,节省响应时间(本人此处理解不太透)

我要慢慢的往前爬啊,喵~
原文地址:https://www.cnblogs.com/hellolm/p/4395935.html