Node.js入门

Node.js入门

[TOC]

简介

​ 简单来说,Node.js 就是运行在服务端的 JavaScript。是一个基于Chrome JavaScript 运行时建立的一个平台,是一个事件驱动I/O服务端JavaScript环境。

创建第一个服务器应用

​ 一般而言,创建一个node.js应用需要以下步骤:

  1. 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。

    1
    var http=require("http");
  2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。

    1
    2
    3
    4
    http.createServer(function (request,response){
    response.writeHead(200,{'content-type':'text/plain'});
    response.end("hello world\n");
    }).listen(8888);
  3. 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。

    在命令行中运行js文件。

    1
    node server.js

    然后就相当于启动了一个web服务器,直接在浏览器中即可访问到接口。

    这里写图片描述

模块的基本概念

​ 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Node环境中,一个.js文件就称之为一个模块(module)。

1
2
3
4
5
6
7
8
9
'use strict';
var s = 'Hello';
function greet(name) {
console.log(s + ', ' + name + '!');
}
//把函数greet作为模块的输出暴露出去,这样其他模块就可以使用greet函数了。
module.exports = greet;

在其他js文件中通过以下办法引用模块

1
2
3
4
5
6
7
8
'use strict';
// 引入hello模块:
var greet = require('./hello');
var s = 'Michael';
greet(s); // Hello, Michael!d

node查找模块的顺序依次为:内置模块、全局模块和当前模块;

了解模块的原理

  • 这种模块加载机制被称为CommonJS规范。在这个规范下,每个.js文件都是一个模块,它们内部各自使用的变量名和函数名都互不冲突。那么node是如何做到命名不冲突的呢?这里就需要使用到js的特性了。这里的 node将我们编写的js文件通过函数包裹起来,将其声明的全局变量都变成了局部变量。从未防止了命名冲突的问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //原本代码
    var s = 'Hello';
    var name = 'world';
    console.log(s + ' ' + name + '!');
    //包装后的代码
    (function () {
    // 读取的hello.js代码:
    var s = 'Hello';
    var name = 'world';
    console.log(s + ' ' + name + '!');
    // hello.js代码结束
    })();

    通过这种方法从而实现了模块的隔离。

  • node是如何将模块暴露给其他js文件呢

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 准备module对象:
    var module = {
    id: 'hello',
    exports: {}
    };
    var load = function (module) {
    // 读取的hello.js代码:
    function greet(name) {
    console.log('Hello, ' + name + '!');
    }
    module.exports = greet;
    // hello.js代码结束
    return module.exports;
    };
    var exported = load(module);
    // 保存module:
    save(module, exported);
    1. 变量module是Node在加载js文件前准备的一个变量,并将其传入加载函数,我们在hello.js中可以直接使用变量module原因就在于它实际上是函数的一个参数:
    2. 通过把参数module传递给load()函数,hello.js就顺利地把一个变量传递给了Node执行环境,Node会把module变量保存到某个地方。
    3. 由于Node保存了所有导入的module,当我们用require()获取module时,Node找到对应的module,把这个moduleexports变量返回,