闵超的主页

Nodejs入门

2017-07-20
闵超

Nodejs

什么是nodejs

Node.js是一个JavaScript运行环境(runtime)。实际上它是对GoogleV8引擎进行了封装。由于拥有异步非阻塞、环境搭建简单、事件应用快等特性,使得其在新一代编程开发中更为流行。

Node是脱离浏览器编写JavaScript应用的平台。这里的JavaScript并非是我们在浏览器中熟悉的JavaScript,Node没有内置DOM,也没有任何浏览器的功能。

Node无法用于实现桌面GUI应用。目前Node既没有内置相当于Swing(或SWT)的功能组件,也没有Node扩展GUI工具包。而且不能内嵌到浏览器中。

题外话:

Node.js不是一种独立的语言,与PHP、Python、Perl、Ruby的”既是语言也是平台”不同。

Node.js也不是一个JavaScript框架,不同于CakePHP、Django、Rails。

Node.js更不是浏览器端的库,不能与jQuery、ExtJS相提并论。

Node与JavaScript的关系

说起JavaScript,不得不让人想起浏览器,传统意义上,JavaScript是由ECMAScript、文档对象模型(DOM)和浏览器对象模型(BOM)组成的,也有说法指出JavaScript是由Core JavaScript和 Client JavaScript组成。

Nodejs中的JavaScript实际上只是Core JavaScript。也可以说是ECMAScript的一个实现,并不包含DOM、BOM或者Client JavaScript。

Node是一个让JavaScript运行在浏览器之外的平台。它实现了诸如文件系统、模块、包、操作系统API、网络通信等Core JavaScript没有或者不完善的功能。

历史上,将JavaScript移植到浏览器之外的计划不只node一个,但node是最成功的一个。随着node的流行,各种浏览器之外的JavaScript实现逐渐兴起,因此产生了CommonJS规范。

Node的JavaScript引擎是V8,是谷歌的项目,V8号称是目前世界上最快的JavaScript引擎,经理了数次引擎革命。Nodejs不运行在浏览器中,所以也就不存在JavaScript的浏览器兼容问题。

Node能做什么

除了能原生执行JavaScript外,Node捆绑的模块还能提供如下功能:

  • 命令行工具(shell脚本风格)
  • 交互式TTY风格编程(REPL)
  • 出色的进程控制函数能监控子进程
  • 用Buffer对象处理二进制数据
  • 使用全面事件驱动回调函数的TCP或UDP套接字
  • DNS查找
  • 基于TCP库的HTTP和HTTPS客户端服务器
  • 文件系统的存取
  • 内置了基于断言的单元测试能力

正如JavaScript为客户端而生,Node.js为网络而生,Node能做的远不止开发一个网站那么简单,使用Node.js,你可以轻松地开发:

  • 具有复杂逻辑的网站
  • 基于社交网络的大规模Web应用
  • Web Socket 服务器
  • TCP/UDP套接字应用程序
  • 命令行工具
  • 交互式终端程序
  • 带有图形用户界面的本地应用程序
  • 单元测试工具
  • 客户端JavaScript编译器

为什么要使用Node

JavaScript由于无处不在的浏览器而流行。它实现了许多现代高级语言的概念,比其他任何语言都不逊色。JavaScript是一门动态编程语言,拥有松散类型且可动态扩展的对象(能按需非正式地声明)。

JavaScript的一个短板是全局对象。所有的顶级变量都被扔给一个全局对象,这在混用多个模块时会导致难以预料的混乱。由于Web应用通常有大量的对象,且很可能是多个组织编写的,所以你自然会认为Node中的全局对象冲突会是个”雷区”。

而Node使用CommonJS模块系统,这意味着模块的局部变量即使看起来像全局变量,实际上也是局部变量。这种模块间的清晰分离避免了全局对象的问题。

有了Node,客户端和服务器端使用相同编程语言的梦想终于有望实现了,这门语言就是JavaScript。语言在前后端通用有如下几个优势:

  • 网线两端都是相同的程序员
  • 代码能更容易地在服务器端和客户端间迁移
  • 服务器端和客户端使用相同的数据格式(JSON)
  • 服务器端和客户端使用相同的开发工具
  • 服务器端和客户端实用相同的测试或质量评估工具
  • 当编写Web应用时,视图模板能在两端共享
  • 服务器端和客户端团队可使用相似的编程风格。

CommonJS规范和实现

正如当年统一了JavaScript语言标准,人们制定了ECMAScript规范一样,如今为了统一JavaScript在浏览器之外的实现,CommonJS诞生了。CommonJS视图定义一套普通应用程序的API,从而填补JavaScript标准库过于简单的不足。CommonJS的终极目标是制定一个像C++标准库一样的规范,使得基于CommonJS API的应用程序可以在不同的环境下运行。

CommonJS规范包括了模块(modules)、包(packages)、系统(system)、二进制(binary)、控制台(console)、编码(encodings)、文件系统(filesystems)、套接字(sockets)、单元测试(unit testing)等部分。

Node已经率先实现了一些功能,并将其反馈给CommonJS规范制定组织,但Node并不完全遵循CommonJS规范。 原因是规范总是滞后于技术的发展。

以上就算是Node的理解,也算是nodejs的入门初探。

正式开始node使用

Node.js的Window运行环境安装步骤很简单,只需注意将执行文件node.js添加到环境变量中。 安装主要分为4个步骤:

  1. 建议下载msi的后缀执行文件,主要是便于后续的项目开发。从官网下载Node.js的Windows系统(32或64)最新版本。下载戳这里
  2. 下载完成后执行MSI的安装文件
  3. 一键安装,安装完成查看Node.js启动文件目录(右键单击Node.js启动快捷方式),一般默认路径是”C:\Program Files\nodejs\node.exe”。
  4. 将node.exe可执行文件添加到Windows的环境变量中:运行cmd,进入dos操作命令窗口,输入node -v查看是否安装成功

Windows添加环境变量的方法:

右键计算机桌面图标 -> 打开右侧导航栏中的”高级系统设置”,打开以后选择其中的”环境变量” -> 之后更改用户的PATH值,在其原值上加上Node的可执行文件路径,两者使用分号分割。例如

C:\Users\AppData\Roaming\npm\;C:\Program Files\nodejs\node.exe

Linux和Mac系统配置Node略,详细请查阅资料。

开始Node.js编程

Node.js具有深厚的开源血统,它诞生于托管了许多优秀开源项目的网站——github。和大多数开源软件一样,它由一个黑客发起,然后吸引了一小拨爱好者参与贡献代码。一开始它默默无闻,靠口口相传扩散,直到某一天被一个黑客媒体曝光,进入了业界视野,随后便有一些远见的公司提供商业支持,使其逐渐发展壮大。

用Node.js编程是一件令人愉快的事。因为你开始用黑客的思维和风格编写代码。你会发现像这样的语言是很容易入门的,可以快速了解它的细节,然后掌握它。

Hello World

第一个node.js程序 打开常用文本编辑器,在其中输入

console.log("Hello World!");

将其保存为helloworld.js文件,打开终端,进入helloworld.js所在的目录,执行以下命令:

node helloworld.js

你会发现,在终端中看到输出Hello World。很简单。

使用Node搭建服务

上面的例子太简单了吧,下面我们来学习用node创建一个node服务器。

Node.js是为网络而诞生的平台,但又与ASP、PHP有很大的不同,究竟不同在哪里呢?作为有过PHP开发经验的人,都知道在成功运行PHP之前先要配置一个功能强大而复杂的HTTP服务器,譬如Apache,ISS或Nginx,还需要将PHP配置为HTTP服务器的模块或者使用FastCGI协议调用PHP解释器。

这种架构是”浏览器——HTTP服务器——PHP解释器”。

而Node服务器直接面向浏览器用户,这种架构是颠覆性的。”浏览器——Node服务器”

这里就不讨论两种架构的利弊了,有兴趣的查阅资料。

node服务器和php服务器的比较.png

回归正题:我们来创建第一个http服务器。

首先建立一个名为app.js的文件,内容为

//app.js

var http = require("http");
http.createServer(function(req, res) {
  res.writeHead( 200 , {"Content-Type":"text/html"});
  res.write("<h1>Node.js</h1>");
  res.write("<p>Hello World</p>");
}).listen(3000);
console.log("HTTP server is listening at port 3000.");

接下来运行hello world一样,运行 node app.js 打开浏览器访问 http://127.0.0.1:300即可看到

node的第一个服务器.png

代码解释:

  • require(“http”):获取Node.js原生模块提供的HTTP模块对象
  • res.writeHead:通过res的HTTP响应对象,编写HTTP响应的头信息,并设定Content-Type指定返回的数据类型为文本text,当然这里的数据类型也可以是其他的格式,例如html、css和image等
  • http.createServer():使用HTTP对象API方法createServer来创建服务器
  • listen:是HTTP对象的一个方法,其主要是启动服务器监听的端口是端口和IP,第二个参数是可选参数,默认为本地127.0.0.1。可以写(8080,localhost)
  • console.log():是Node.js和JavaScript共有的调试接口。

总结: 入门开发中常见的错误:

  • Error1:Cannot find module这个问题主要原因是在当前目录没有找到app.js
  • Error2:listen EACCES。如:1337修改为3000,Windows下可以通过netstatation或findstr “1337”查看被那个程序占用
  • Ctrl+C退出node服务器
  • 更改Node文件,希望服务器立即响应更改,而不需要重新运行文件。导入开源模块node-dev和forever。

Content

如果喜欢,打个赏,加个好友吧

扫描二维码打赏

扫描二维码打赏