初识NodeJS

时间:2022-04-22
本文章向大家介绍初识NodeJS,主要内容包括1.JavaScript 模块化规范、2.Node.js 介绍、2.2 几个问题、2.3 什么是Node、2.4 使用 Node 可以做什么、2.5 Node 的特点、2.6 为什么要学习 Node、2.7 总结、2.8 Node 学习资源推荐、3.安装与配置 Node 开发环境、3.2 使用 nvm 安装和管理多个 node 版本、3.3 如何验证是否有Node环境、4.快速体验、4.2 文件IO:读写文件、4.3 网络IO:HTTP服务器、5.Node 基础、5.2 Node 中的模块系统、6.调试 Node、6.2 Node 中的 Debug、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1.JavaScript 模块化规范

  • 浏览器环境
    • AMD
      • Asynchronous Module Definition
      • RequireJS
    • CMD
      • Common Module Definition
      • SeaJS
  • Node 环境
    • CommonJS
      • Node.js
      • CommonJS 是一个社区,该社区为 JavaScript 没有触及到的领域指定了很多的规范(社区制定的)
      • JavaScript 模块化、IO操作、网络编程、二进制操作
  • ECMAScript(任何环境都可以)
    • ECMAScript 6、ECMAScript 2015
    • ECMAScript Module 定义规范
    • export 关键字用于导出接口
    • import 关键字用于加载模块接口
    • 在最新版的 Node 中,对 ES6 中模块系统还没有支持,但是可以通过 babel 等相关工具转换使用
  • UMD
    • Universal Module Definition 通用模块定义规范
    • UMD 不是任何模块规范,也不是模块加载器
    • 一个模块既兼容 AMD 、CMD、CommonJS、 ECMAScript 6 那这个模块就是一个 UMD 模块
    • 目的是为了在任何模块加载器中都可以直接加载
    • 一般是做一些前后端模块共用的,不涉及具体环境依赖的API,例如 underscoremoment 就是一个典型的例子

2.Node.js 介绍

以下简称 Node。

划时代意义的 Node ,开启了大前端时代 node 让前端进入了工业自动化时代 node 还让原来的小前端可以有机会踏入后端开发领域,使用 JavaScript 语言进行服务器编程 总而言之:学习了 Node ,就开启了前端工程师的 全栈开发 之旅

  2.1 客户端和服务器

  2.2 几个问题

  •   什么是 JavaScript
    • 一种运行在浏览器端的脚本语言。
    • JavaScript + DOM + BOM
    • ECMAScript + W3C
    • ECMAScript + BOM + DOM
    • BOM和DOM等都是浏览器环境提供的接口API,供 JavaScript 语言来调用。
  • JavaScript 和 ECMAScript 是什么关系
    • ECMAScript 是 JavaScript 语言的标准规范
      • var、if-else、for、Object、Array、String。。。
    • JavaScript 是 ECMAScript 标准规范的一个实现
  • 浏览器和 JavaScript 是什么关系
    • JavaScript 是运行在浏览器环境中的
    • 寄宿关系
    • 浏览器就是 JavaScript 的一个执行环境
  • 浏览器中的 JavaScript 可以做什么
    • DOM操作、表单验证、动画、ajax 请求
  • 从功能角度 浏览器中的 JavaScript 和其它语言有什么差别
    • 弱类型
    • 浏览器中的 JavaScript 专注于处理 GUI 编程(图形界面)
    • 文件操作
      • HTML5中有一个 FileReader(只能读取用户通过file类型的input标签选择的文件)
      • 浏览器中的 JavaScript 没有主动操作文件的权限
    • 网络IO
      • 接收网络中传输过来的数据,处理网络中传输过来的数据,发对方发送响应
  • ECMAScript 只可以运行在浏览器中吗
    • JavaScript 不仅仅可以运行在浏览器环境中
    • 也可以运行在别的环境、平台 

  2.3 什么是Node 

Node官方网站

  • Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
    • NodeJS 是一个构建与 Chrome V8 JavaScript 解析引擎之上的一个运行时环境
    • Chrome V8 开源的
    • Chrome V8 引擎在所有浏览器的 JavaScript 解析引擎中是最快的
    • 维基百科 - JavaScript引擎
  • Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.
    • event-driven:事件驱动
    • non-blocking I/O model:非阻塞IO模型
    • lightweight and efficient:轻量和高效
    • Node 本身知识提供了一些系统级别操作API
  • Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
    • package ecosystem, npm:包管理系统 npm
    • largest ecosystem of open source libraries in the world.
      • 目前世界上最大的开源库生态系统
      • 50W + 就好比 Sublime编辑器一样,本身只提供很简单的功能
      • 大部分都需要依靠社区中的插件、包来开发咱们的应用程序
      • 如果英语好,占优势
      • npm 两层含义:
        • 第一是一用来托管基于Node开发的包的
        • 第二是一个命令行工具,可以用来下载npm网站上托管的Node包
        • 有了 npm,就会成为完全傻瓜式的开发
        • 直接拿来解决你的问题就可以了,能让你更加专注于业务的处理
  • Node 是基于 Chrome V8 解析引擎之上构建的一个 JavaScript 运行时环境,或者说平台
    • 在 Node 中,可以使用 JavaScript 语言进行编程吧
  • Node 能解析和执行 JavaScript(ECMAScript) 代码
  • Node 是一个平台,让 JavaScript 可以脱离浏览器环境运行
  • Node 自身使用 c++ 语言写出了很多系统级别相关的 API,暴露了一些 JavaScript 环境 API
    • 例如文件操作
    • 网络操作
    • 。。。
  • 使用 Node 可以轻松的进行文件系统访问、HTTP 服务器开发等功能
  • 免费开源

  2.4 使用 Node 可以做什么

  • 高性能的网站服务器
  • 实时多人游戏后台服务器
  • 简单易用的命名行应用程序
    • gulp、less、bower、fis、http-server
    • ant、ruby、.net nuget
  • 高大上的桌面应用程序
    • 使用 Web 技术 作为解决方案
    • electron Linus + Max + Windows
  • 底层的物联网开发
    • 树莓派
  • 移动开发
    • Ionic 安卓 IOS
    • 使用 Web 技术作为解决方案

  2.5 Node 的特点

  • Single Thread:单线程
  • event-driven:事件驱动
  • non-blocking I/O model:非阻塞IO模型
    • 文件IO、网络IO 基本上都是异步的
    • 所以在 Node 中会看到各种各样的花式回调
  • Node 采用的是 事件驱动和非阻塞IO模型 使它本身非常的轻量级和高效。
  • 开源免费、跨平台 

  2.6 为什么要学习 Node 

  • Node 打破了过去 JavaScript 只能在浏览器中运行的局面
  • 前后端编程环境统一,大大降低了前后端语言切换的代价
  • 全栈开发工程师
    • 后端开发工程师
    • 前端开发工程师
    • 移动端开发工程师
  • 前端 + 后端 

  2.7 总结

  Node 是基于 Chrome V8 引擎,一个 JavaScript 运行时环境。 Node 可以解析和执行 JavaScript(ECMAScript) 脚本代码, 而且提供了很多系统级别的API(文件读写、进程管理、网络通信)。

  Node 不是一个新的语言,而且一个运行时环境,类似于浏览器环境或者说平台, 可以用来解析和执行 JavaScript 语言代码。

  JavaScript 长久以来一直被限制在浏览器的沙箱中运行, 它的能力取决于浏览器中间层提供的支持多少。 Node 将高性能的 V8 带到了服务器端,使 JavaScript 也可以开发出实时高性能的服务器。 在 Node 中,不再与CSS样式表,DOM树打交道, 可以随意的访问本地文件,搭建 WebSocket 服务器,连接数据库等系统级底层操作。 Node 不处理 UI,只关心数据,无论是本地数据还是网络数据。 前后端编程统一,大大降低了前后端编程切换的代码。

  对于前端工程师而言,自己熟悉的 JavaScript 如今竟然可以在另一个地方大放异彩, 不谈其他原因,仅仅因为好奇,也值得去关注和探究它。

JavaScript 全栈开发工程师,JavaScript 语言的责任已经越来越重了。

  2.8 Node 学习资源推荐

3.安装与配置 Node 开发环境

  3.1 普通方式安装

  • 下载地址:https://nodejs.org/en/download/
  • 下一步下一步即可 

  3.2 使用 nvm 安装和管理多个 node 版本

  • nvm node version management
  • nvm 是一个命令行程序,可以非常方便的安装和管理多个 Node 版本
  • 下载地址:https://github.com/coreybutler/nvm-windows

  3.3 如何验证是否有Node环境

  打开终端,输入 node -v

  $ node -v
  $ vx.x.x

  如果能看到输出一个版本号,例如 v6.8.1 的文本,说明当前计算机有 Node环境。

4.快速体验

  4.1 Hello World

  使用 node 命令执行一个 JavaScript 脚本文件:

  1. 打开任意终端
  2. 使用 cd 命令切换到要执行的 js 脚本文件所属的目录
  3. 使用 node 文件名 去执行对应的 js 脚本文件
  4. node 会解析和执行该文件中的代码,然后将执行结果输出到终端

  当你在终端中输入 node example.js, 实际上就是使用安装目录中的 node.exe 可执行程序, node.exe 程序会自动读取该文件中的内容, 读取到该文件内容之后,node 环境开始解析和执行, 如果有 console.log 这样的代码,node 会将该输出打印到控制台中。

  • 注意1:文件名不要使用 node 命名
  • 注意2:文件名和路径最好不要使用中文,路径中也最好不要有空格 

  4.2 文件IO:读写文件

var fs = require('fs')

// 读取文件
// fs.readFile('./README', function(err, data) {
//   if (err) {
//     // return console.log('读取文件失败了')
//     throw err
//   }
//   console.log(data.toString())
// })

// 写入文件
fs.writeFile('./a.txt', 'hello aaa', function (err) {
  if (err) {
    throw err
  }
  console.log('文件写入成功')
})

  4.3 网络IO:HTTP服务器

var http = require('http')

// 1. 创建 HTTP 服务器,得到一个 服务器实例对象
var server = http.createServer()

var money = 0

// 2. 给 Server 对象添加 request 事件处理函数
// 回调函数需要接收两个参数:
//    第一个参数:Request,用来获取当前客户端的请求信息
//                Request 对象可以获取客户端请求中的 url 请求地址、查询字符串、post 请求提交的数据等
//    第二个参数:Response 也是一个对象,一般用来给本次请求发送响应数据
server.on('request', function(request, response) {
  money++

  // 告诉客户端,本次响应的数据是文本类型,utf-8 编码
  response.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  })
  response.write('回家过年了,今年赚了:' + money + ' RMB')
  response.end()
})

// 3. 通过 Server 对象的 listen 函数,设置一个监听的端口号,启动服务器
server.listen(3000, function() {
  // 当服务器开启监听成功之后,会触发该回调处理函数
  console.log('server is running at port 3000.')
})

5.Node 基础

  5.1 Node 中的 JavaScript

  • REPL运行环境
    • R:read
    • E:Eval
    • P:Print
    • L:Loop
  • ECMAScript
    • Node 对最新的 ECMAScript 语言标准支持的非常好
    • 对最新的 ES6 支持了将近 96% 的语法
    • Node 除了官方的 ECMAScript 语言规范
    • 同时将 console 对象、定时器等函数也移植到 Node 中
  • 全局对象
    • global
      • 相对于浏览器中的的全局对象 window
      • 全局作用域和模块作用域的概念
    • Console
      • log
      • info
      • warn
      • error
    • process
      • 进程对象
    • Buffer
  • 全局函数
    • setInterval 和 clearInterval
    • setTimeout 和 clearTimeout
    • setImmediate 和 clearImmediate
  • 模块内成员
    • dirname 和 filename
    • require
    • exports
    • module

     5.2 Node 中的模块系统

  • Node 根据 CommonJS 规范实现了自己的一套模块系统
  • 一个单独的文件就是一个模块
    • 如何定义模块:
    • Node 天生就已经实现了一个模块系统解决方案
    • 默认在Node中运行的 JavaScript 脚本文件,就是一个模块,而且是私有作用域
  • 每一个模块都是一个单独的作用域
    • 没有浏览器中 window 全局作用域的概念了
  • 每个文件对外接口是 module.exports 对象
  • require 方法用于加载模块
    • 执行被加载模块中的 JavaScript 代码
    • 得到模块的 module.exports 接口对象
  • 核心模块和文件模块

6.调试 Node

  一个优秀的开发人员调试能力很重要 任何一个平台的开发都离不开调试,调试不仅仅是工具,更多的是套路

  6.1 关于 Debug

  所谓的 Debug ,也就是找到并去除缺陷的过程,这些过程呢,其实也是由套路规则可循的,以下是我总结的一些调试经验:

  • 系统化注释掉或禁用代码块:排除法
  • 分析网络数据流,确定问题是客户端还是服务器
  • 使用之前能用的输入,并一点一定地修改输入,直到问题呈现
  • 用版本控制逐次回退,直到问题消失

     6.2 Node 中的 Debug

  • console.log
  • node-inspector
    • 这个一个可以在浏览器中调试 Node 的一个工具
  • visual studio code
    • 这也是一个编辑器,内部类似于 Webstorm,也集成了一个调试Node代码的功能
  • Webstorm