zoukankan      html  css  js  c++  java
  • 浅理解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,把复杂的工作拆分成小时间,提高响应速度,节省响应时间(本人此处理解不太透)

    我要慢慢的往前爬啊,喵~
  • 相关阅读:
    500. 键盘行
    657. 判断路线成圈
    771. 宝石与石头
    461. 汉明距离
    Java 基本数据类型
    Windows下的DOM操作
    jQuery学习笔记
    Java(16-19)
    Java(1-15)
    总结
  • 原文地址:https://www.cnblogs.com/hellolm/p/4395935.html
Copyright © 2011-2022 走看看