初识NodeJS

1.JavaScript 模块化规范

  • 浏览器环境html

    • AMD
      • Asynchronous Module Definition
      • RequireJS
    • CMD
      • Common Module Definition
      • SeaJS
  • Node 环境前端

    • CommonJS
      • Node.js
      • CommonJS 是一个社区,该社区为 JavaScript 没有触及到的领域指定了不少的规范(社区制定的)
      • JavaScript 模块化、IO操做、网络编程、二进制操做
  • ECMAScript(任何环境均可以)node

    • ECMAScript 六、ECMAScript 2015
    • ECMAScript Module 定义规范
    • export 关键字用于导出接口
    • import 关键字用于加载模块接口
    • 在最新版的 Node 中,对 ES6 中模块系统尚未支持,可是能够经过 babel 等相关工具转换使用
  • UMDc++

    • Universal Module Definition 通用模块定义规范
    • UMD 不是任何模块规范,也不是模块加载器
    • 一个模块既兼容 AMD 、CMD、CommonJS、 ECMAScript 6 那这个模块就是一个 UMD 模块
    • 目的是为了在任何模块加载器中均可以直接加载
    • 通常是作一些先后端模块共用的,不涉及具体环境依赖的API,例如 underscoremoment 就是一个典型的例子

2.Node.js 介绍

如下简称 Node。git

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

  2.1 客户端和服务器

  

  

  2.2 几个问题

  •   什么是 JavaScriptweb

    • 一种运行在浏览器端的脚本语言。
    • JavaScript + DOM + BOM
    • ECMAScript + W3C
    • ECMAScript + BOM + DOM
    • BOM和DOM等都是浏览器环境提供的接口API,供 JavaScript 语言来调用。
  • JavaScript 和 ECMAScript 是什么关系ajax

    • ECMAScript 是 JavaScript 语言的标准规范
      • var、if-else、for、Object、Array、String。。。
    • JavaScript 是 ECMAScript 标准规范的一个实现
  • 浏览器和 JavaScript 是什么关系数据库

    • JavaScript 是运行在浏览器环境中的
    • 寄宿关系
    • 浏览器就是 JavaScript 的一个执行环境
  • 浏览器中的 JavaScript 能够作什么npm

    • 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
相关文章
相关标签/搜索