Node.js初入门

Node.js是运行在服务端的JavaScript。它是基于Google的V8引擎。它是事件驱动的、非阻塞I/O模型的、轻量、高效的。

很概念是不是?那就用一句简单的话:它现在很流行!

安装配置Node.js

  1. 从Node.js的官网中下载对应的安装程序,按照提示安装。
  2. 配置环境变量PATH(最新版本已经帮你配置好了)
  3. 运行node –version

创建Node.js应用

第一个Node.js程序

第一个程序一般来说就是hello world了。nodejs的官网正好给我们提供了样例hello world,而且还是server类型的。

  1. 创建一个文件夹,如node-example之类的。
  2. 创建文件first-node.js
  3. nodejs.org上复制相关代码

    const http = require('http');
    
    const hostname = '127.0.0.1';
    const port = 3000;
    
    const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Hello World\n');
    });
    
    server.listen(port, hostname, () => {
      console.log(`Server running at http://${hostname}:${port}/`);
    });
    

    粘贴到first-node.js中。

  4. 在命令行中运行node first-node.js
  5. 在浏览器中输入http://localhost:3000/

关于NPM

NPM是随同NodeJS一起安装的包管理工具。你可以通过npm命令从NPM服务器上下载第三方包、程序到本地使用,也可以把自己写的包、程序上传到NPM服务器给他人使用。
常用的命令:

npm init  引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm install --help 帮助信息
npm install 安装package.json中的依赖包
npm install <name> 安装nodejs的依赖包
npm install <name> -g 将nodejs的依赖包安装到全局
npm install <name> --save 在安装nodejs依赖包的同时把信息写入到package.json的dependencies中
npm install <name> --save-dev 在安装nodejs依赖包的同时把信息写入到package.json的devDependencies中
npm remove <name> 移除
npm update <name>更新

package.json文件包含项目详细信息的描述。具体可以参考阮一峰的《package.json文件》一文

工程目录

NodeJS并没有官方要求目录结构应该是怎么样的(我是没有找到,如果有找到的话烦请告知)。但很多第三方的包的程序目录至少看上去像下面这样的。

Directory.jpg
  • bin 存放启动项目的脚本文件,默认www
  • node_modules 存放所有的项目依赖库
  • src 项目的代码
  • tests 测试代码
  • index.js 可以是项目的入口
  • package.json

了解API

NodeJs给我们提供了丰富API。受《七天学会NodeJS》启发,把API分为以下几类,方便查看学习。

文件操作类

  • Buffer(块):用来创建一个专门存放二进制数据的缓存区
  • Stream(流):一个抽象接口,Node 中有很多对象实现了这个接口。存在4种流类型,分别是Readable(可读操作)、Writable(可写操作)、Duplex(可读可写操作)和Transform(操作被写入数据,然后读出结果)。同时,所有的Stream对象都是EventEmitter的实例。
  • File System(文件系统):该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。这个模块几乎对所有操作提供异步和同步两种操作方式。
  • Path(路径):该模块包含一套用于处理和转换文件路径的工具集。
  • zlib:该模块提供了数据压缩和解压的功能。

网络操作类

  • HTTP:提供HTTP服务器或客户端功能。
  • HTTPS:处理HTTPS协议相关。
  • URL:该模块用于生成和解析URL。
  • Query Strings:模块用于实现URL参数字符串与参数对象的互相转换。
  • Net:模块封装了异步网络功能,提供了一些方法来创建服务器和客户端(称之为流)。
  • DNS(域名服务):处理DNS相关。
  • TLS/SSL:模块使用 OpenSSL 来提供传输层安全协议(Transport Layer Security)和/或安全套接层(Secure Socket Layer):加密过的流通讯。
  • UDP/Datagram:数据报套接字。

进程管理类

  • Process(进程):process对象是Node的一个全局对象,提供当前Node进程的信息。它可以在脚本的任意位置使用,不必通过require命令加载。该对象部署了EventEmitter接口。
  • Child Process(子进程):该模块用于新建子进程。子进程的运行结果储存在系统缓存之中(最大200KB),等到子进程运行结束以后,主进程再用回调函数读取子进程的运行结果。
  • Cluster(集群):集群模块允许你方便地创建一个共享服务器端口的进程网络。

基本

  • Crypto(加密):提供一些加密的方法。
  • Errors:提供Error相关。
  • Events(事件):Events模块是Node对“发布/订阅”模式(publish/subscribe)的实现。一个对象通过这个模块,向另一个对象传递消息。该模块通过EventEmitter属性,提供了一个构造函数。
  • Globals(全局对象):它及其所有属性都可以在程序的任何地方访问,即全局变量。
  • Modules(模块):模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js文件就是一个模块,这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展。
  • Utilities(实用工具): 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
  • Punycode(编码系统):处理编码。
  • Timers(定时器):所有的定时器函数都是全局变量。
  • Domain(域):Domain提供了一种方式,即以一个单一的组的形式来处理多个不同的IO操作。如果任何一个注册到domain的事件触发器或回调触发了一个‘error’事件,或者抛出一个错误,那么domain对象将会被通知到。而不是直接让这个错误的上下文从`process.on(’uncaughtException’)’处理程序中丢失掉,也不会致使程序因为这个错误伴随着错误码立即退出。
  • Readline(逐行读取):Readline程序允许逐行读取一个流内容。
  • OS(系统):提供一些基本的操作系统相关函数。
  • String Decoder(字符串解码器):这个模块将一个 Buffer 解码成一个字符串。

其他

  • Assertion Testing(断言):用于编写程序的单元测试用例,通过require(‘assert’)调用。
  • C/C++ Addons(C/C++ 扩展):Addons插件就是动态连接库。它类似胶水,将c、c++和Node粘贴起来。
  • Command Line Options:命令行的选项。
  • Console(控制台):类似于大部分 Web 浏览器提供的 console 对象函数。
  • Debugger(调试器):以debug参数启动Node。通过脚本的源代码中放置 debugger; 语句,您便可启用一个断点。
  • REPL(命令行交互):一个 Read-Eval-Print-Loop(REPL,读取-执行-输出循环)既可用于独立程序也可很容易地被集成到其它程序中。REPL 提供了一种交互地执行 JavaScript 并查看输出的方式。它可以被用作调试、测试或仅仅尝试某些东西。
  • TTY(终端):模块提供了 tty.ReadStream 和 tty.WriteStream 类。在大部分情况下,您都不会需要直接使用此模块。
  • V8:V8相关。
  • VM(虚拟机):虚拟机相关。

参考: