zoukankan      html  css  js  c++  java
  • Node.js学习笔记(1)

    Node是用c++语言开发,能运行javascript语言的环境。

    使用的时候格式为node helloworld.js,helloword.js为服务器端或者系统级端的javascript代码。

    Node有很多特性,这里不再一一展开。先用node创建一个http服务器监听固定端口:

    var http = require('http');

    http.createServer(function (req, res) {

    res.writeHead(200, {'Content-Type': 'text/plain'});

    res.end('Hello World\n');

    }).listen(80, "127.0.0.1");

    简单解释:创建一个简单的http服务器,箭筒80端口。对于任何的http请求,服务器返回头部状态码为200,content-type值为text/plain的hello world的文字响应。

    简单来说,此时用浏览器访问指定端口,会有相应的响应。

    在createserver函数的参数中有一个回调函数,当有http请求的时候,node就调用这个回调函数处理请求并实现响应。

    在介绍javascript闭包特性的时候,有这样一段代码应当引起重视:(另外关于函数的闭包,之后会更深入的研究,谨记!)

    var hostRequest = http.request(requestOptions,function(response) {

    var responseHTML ='';

    response.on('data', function (chunk) {

    responseHTML = responseHTML + chunk;

    });

    response.on('end',function(){

    console.log(responseHTML);

    // do something useful

    });

     });

    简单解释:上面的代码要用end事件处理responseHTML变量,根据函数闭包的特性,可以在两个回调函数之外定义responseHTML变量然后再data事件中根据需要修改这个变量的值,并且送到end事件中执行。

    Node.js的模块机制:

    Javascript的缺陷:

    没有模块系统;没有原生的支持密闭作用域或依赖管理。

    没有标准库;除了一些核心库之外,没有文件系统的API。

    没有标准接口;没有数据库的统一接口;

    没有包管理系统;不能自动加载和安装依赖。

    于是有了CommonJS规范的出现。于是node.js就成了这种规范的实现者。

    Node.js用require机制可以实现对文件的调用:在require这个文件之后,定义在exports对象上的方法便可以随意调用。

    举例如下:

    var PI = Math.PI;

    exports.area = function (r) {

     return PI * r * r;

    };

    exports.circumference = function (r) {

     return 2 * PI * r;

    };

    这个文件存储为xx.js文件,在app.js文件中用require调用:var circle = require('./xx.js');,之后就可以使用xx.js中的以exports开头的函数。

    举例如下(app.js):

    var circle = require('./xx. js');

    console.log( 'The area of a circle of radius 4 is ' + circle.area(4));

    最后一句中的circle.area(4)就是在调用事先在xx.js中定义的

    exports.area = function (r) {

     return PI * r * r;

    };

    这个函数。最后采用字符串的拼接完成The area of a circle of radius 4 is 50.26548245743669的显示。

    这里有一个问题:为什么我没在app.js中定义require这个变量,但是能正常使用不报错?

    原因我们从输入node app这个口令后说起。
    在你砸下enter之后,编译器开始包装这个app.js这个文件,包装之后的这个文件变成:

    (function (exports, require, module, __filename, __dirname) {

    var circle = require('./app.js');

    console.log('The area of a circle of radius 4 is ' + circle.area(4));

    });

    原来的两句变成了三句,成为了一个函数,并且还有五个参数。

    这段包装好之后的代码有一个类似eval的工具执行,返回一个具体的function对象,最后传入module对象的这五个参数(或方法),作为实参并执行。

    所以,在app.js中并没有定义exports,但是这个方法还是存在的原因。在这个文件中,可以继续用require来引用新的模块执行新的功能,事实上require调用的是load方法。

    load方法在载入、编译、缓存了module后,返回module的exports对象。这就是xx.js文件中只有定义在exports对象上的方法才能被外部调用的原因。(待续)

    (还请各位指点一二,共同进步^_^)

  • 相关阅读:
    什么是Servlet?
    哪种情况下用哪种域对象
    相对于Statement,PreparedStatement的优点是什么?
    JDBC的PreparedStatement是什么?
    execute,executeQuery,executeUpdate的区别是什么?
    什么是JDBC,在上面时候会用到它?
    ArrayList、LinkedList、Vector 的区别。
    int 和 Integer 有什么区别
    Java 为每个原始类型提供了哪些包装类型
    什么是JDBC,在上面时候会用到它?
  • 原文地址:https://www.cnblogs.com/lamian/p/3944673.html
Copyright © 2011-2022 走看看