zoukankan      html  css  js  c++  java
  • nodejs入门

    一、Nodejs介绍

    简单的说 Node.js 就是运行在服务端的 JavaScript的代码解析器。

    首先要清楚Node不是一个Web服务器,这十分重要。它本身并不能做任何事情。它无法像Apache那样工作。如果你希望它成为一个HTTP服务器,你必须借助它内置库自己编写。Node.js只是计算机上执行代码的另一种方式,它是一个简单的JavaScript Runtime.

    Node.js把 JavaScript 的使用从浏览器端扩展到了服务器端,使得前端开发人员可以用熟悉的语言编写服务器端代码。这一变化使得 NodeJS 很快就流行起来。在 NodeJS 社区中有非常多的高质量模块可以直接使用。

    官网介绍:

    Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
    Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的、可扩展的网络应用。Node.js采用事件驱动和非阻塞I/O模型,使其变得轻量和高效,非常适合构建运行在 分布式设备的数据密集型的实时应用。

    1、node.js是一个平台,或者说是一个运行环境。

    2、node.js是一个基于Chrome JavaScript 运行时建立的一个平台,具体是基于 Chrome V8 引擎,V8引擎执行Javascript的速度非常快,性能非常好。

    3、node.js旨在提供一种简单的构建 快速、可伸缩网络程序的方法。

    4、使用数据驱动,非阻塞IO模型

    5、轻量、可伸缩,适用于实时数据密集的交互应用。

    6. 单进程,单线程

    运行于浏览器的JavaScript,浏览器就是JavaScript代码的解析器,而Node.js则是服务器端JavaScript的代码解析器,存在于服务器端的JavaScript代码由Node.js来解析和运行。

    JavaScript解析器只是JavaScript代码运行的一种环境,浏览器是JavaScript运行的一种环境,浏览器为JavaScript提 供了操作DOM对象和window对象等的接口。Node.js也是JavaScript运行的一种环境,Node.js为JavaScript提供了操 作文件、创建HTTP服务、 创建TCP/UDP服务等的接口,所以Node.js可以完成其他后台语言(Python、PHP等)能完成的工作。

    二、执行环境

    Node.j提供了一个交互式运行环境REPL,通过这个环境,可以立即执行javascript代码块,使用方法类似Chrome浏览器中Firebug插件的Console。

    输入node或node.js进入node.js的交互式运行环境。ctrl+d退出。

    1、通过交互式环境执行javascritp代码块

    $ node
    > console.log('liuxiaoyan');

    2、通过交互式环境运行javascript文件

    $ node test.js

    三、node.js模块和包

    1、模块

    一个模块就是一个文件。

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js)、JSON文本文件(.json)和二进制模块文件(.node)。

    node.js官方提供了很多模块,这些模块分别实现特定功能,如操作文件的模块fs,构建http服务的模块http。

    可以用官方的模块,也可以自己写。

    2、包 

    包是一个文件夹,将多个具有依赖关系的模块组织在一起,封装多个模块,方便管理。

     Node.js才有CommonJS规范,包内必须包含一个JSON文件,命名为package.json。

    package.json应该包含以下字段:

    name:包名。包名是唯一的,只能包含小写字母、数字和下划线。
    version:包版本号。
    description:包说明。
    keywords:关键字数组。用于搜索。
    homepage:项目主页。
    bugs:提交bug的地址。
    license:许可证。
    maintainers:维护者数组。
    contributors:贡献者数组。
    repositories:项目仓库托管地址数组。
    dependencies:包依赖。

    示例:

    {
        "name": "shiyanlou",
        "description": "Shiyanlou test package.",
        "version": "0.1.0",
        "keywords": [
            "shiyanlou",
            "nodejs"
         ],
        "maintainers": [{
            "name": "test",
            "email": "test@shiyanlou.com"
        }],
        "contributors": [{
            "name": "test",
            "web": "http://www.shiyanlou.com/"
        }],
        "bugs": {
            "mail": "test@shiyanlou.com",
            "web": "http://www.shiyanlou.com/"
        },
        "licenses": [{
            "type": "Apache License v2",
            "url": "http://www.apache.org/licenses/apache2.html"
        }],
        "repositories": [{
            "type": "git",
            "url": "http://github.com/test/test.git"
        }],
        "dependencies": { 
            "webkit": "1.2",
            "ssl": { 
                "gnutls": ["1.0", "2.0"],
                "openssl": "0.9.8"
            }
        }
    }
    View Code

    bin文件夹存放二进制文件。

    lib文件夹存放javascript文件。

    doc文件夹存放文档。

    test文件夹存放单元测试。

    3、npm包管理工具

    npm是node.js的包管理工具,npm定义了包依赖关系标准,npm主要用来下载管理第三方包。

    常用命令如下:

    搜索第三方包:

    $ sudo npm search express

    安装包:

    $ sudo npm install -g express

    更新包:

    $ sudo npm update express

    卸载包:

    $ sudo npm uninstall express

    四、模块的

    1、模块的分类和引用

    文件路径,模块名,用模块名来引用非核心模块的话,nodejs最后会把模块名映射到对应的模块文件的路径。

    核心模块在node启动时会被预先加载。

    2、模块的写法和调用

    重点是了解下模块的流程:创建模块、导出模块、加载模块和使用模块。

    1、写法1和调用方法1

    mymodule.js代码如下,通过module.exports和exports对外提供接口。

    function hello() {
        console.log('Hello');
    }
    
    function world() {
        console.log('World');
    }
    
    exports.hello = hello;
    exports.world = world;

    在index.js中调用

    var hello = require('./mymodule'); // 也可以写作 var hello = require('./mymodule.js');
    
    // 现在就可以使用mymodule.js中的函数了
    hello.hello(); // >> Hello
    hello.world(); // >> World

    2、写法2和调用方法2

    function Hello() {
        this.hello = function() {
            console.log('Hello');
        };
    
        this.world = function() {
            console.log('World');
        };
    }
    
    module.exports = Hello;

    在index.js中调用

    var Hello = require('./mymodule');
    
    var hello = new Hello();
    
    hello.hello(); // >> Hello
    hello.world(); // >> World

    五、module.exports和exports 

    module是以对象,每个模块都有一个module对象,module是当前模块的一引用。

    module.exports对象是Module系统创建的,而exports可以看作是对module.exports对象的一个引用。

    在模块中require另一模块时,以module.exports的值为准,因为有的情况,module.exports和exports它们的值是不同的。

    // module.exports和exports相同的情况
    var m = {};        // 表示 module
    var e = m.e = {};  // e 表示 exports, m.e 表示 module.exports
    
    m.e.a = 5;
    e.b = 6;
    
    console.log(m.e);  // Object { a: 5, b: 6 }
    console.log(e);    // Object { a: 5, b: 6 }
    // module.exports和exports不同的情况
    var m = {};        // 表示 module
    var e = m.e = {};  // e 表示 exports, m.e 表示 module.exports
    
    m.e = { c: 9 };    // m.e(module.exports)引用的对象被改了
    e.d = 10;
    
    console.log(m.e);  // Object { c: 9 }
    console.log(e);    // Object { d: 10 }

    本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5035208.html有问题欢迎与我讨论,共同进步。

    参考:

    http://www.xprogrammer.com/159.html

    http://nodeschool.io/zh-cn/

  • 相关阅读:
    面试题25二叉树中和为某一值得路径+递归函数详细解析
    [Codeforces 1199D]Welfare State(线段树)
    [Codeforces 1199C]MP3(离散化+二分答案)
    [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)
    [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)
    [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)
    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
    [Codeforces722E] Research Rover (dp+组合数学)
    [POJ3612] Telephone Wire(暴力dp+剪枝)
    [Codeforces600E] Lomsat gelral(树上启发式合并)
  • 原文地址:https://www.cnblogs.com/starof/p/5035208.html
Copyright © 2011-2022 走看看