初识NodeJS
1.JavaScript 模块化规范
浏览器环境
- AMD
- Asynchronous Module Definition
- RequireJS
- CMD
- Common Module Definition
- SeaJS
- AMD
Node 环境
- CommonJS
- Node.js
- CommonJS 是一个社区,该社区为 JavaScript 没有触及到的领域指定了很多的规范(社区制定的)
- JavaScript 模块化、IO操作、网络编程、二进制操作
- CommonJS
ECMAScript(任何环境都可以)
- ECMAScript 6、ECMAScript 2015
- ECMAScript Module 定义规范
export
关键字用于导出接口import
关键字用于加载模块接口- 在最新版的 Node 中,对 ES6 中模块系统还没有支持,但是可以通过
babel
等相关工具转换使用
UMD
- Universal Module Definition 通用模块定义规范
- UMD 不是任何模块规范,也不是模块加载器
- 一个模块既兼容 AMD 、CMD、CommonJS、 ECMAScript 6 那这个模块就是一个 UMD 模块
- 目的是为了在任何模块加载器中都可以直接加载
- 一般是做一些前后端模块共用的,不涉及具体环境依赖的API,例如
underscore
、moment
就是一个典型的例子
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 标准规范的一个实现
- ECMAScript 是 JavaScript 语言的标准规范
浏览器和 JavaScript 是什么关系
- JavaScript 是运行在浏览器环境中的
- 寄宿关系
- 浏览器就是 JavaScript 的一个执行环境
浏览器中的 JavaScript 可以做什么
- DOM操作、表单验证、动画、ajax 请求
从功能角度 浏览器中的 JavaScript 和其它语言有什么差别
- 弱类型
- 浏览器中的 JavaScript 专注于处理 GUI 编程(图形界面)
- 文件操作
- HTML5中有一个 FileReader(只能读取用户通过file类型的input标签选择的文件)
- 浏览器中的 JavaScript 没有主动操作文件的权限
- 网络IO
- 接收网络中传输过来的数据,处理网络中传输过来的数据,发对方发送响应
ECMAScript 只可以运行在浏览器中吗
- JavaScript 不仅仅可以运行在浏览器环境中
- 也可以运行在别的环境、平台
2.3 什么是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 学习资源推荐
- 深入浅出Node.js
- Node.js实战(第一季)
- Node与Express开发
- 菜鸟教程 - Node.js
- 七天学会NodeJS
- Node中文社区
- Node V4.2.1中文文档
- Node.js 包教不包会
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
脚本文件:
- 打开任意终端
- 使用
cd
命令切换到要执行的 js 脚本文件所属的目录 - 使用
node 文件名
去执行对应的 js 脚本文件 - 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
- global
全局函数
- 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
初识NodeJS的更多相关文章
- 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境
思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...
- Nodejs学习笔记(一)——初识Nodejs
前言:目前工作的分内之事相对较为单一,希望可以通过工作之余的时间给自己充充电,只是没有一个学伴或大神带,只能说是摸索着前进.起初准备好好研究下Spring这个框架,下载了源码,结合书籍准备一探究竟,看 ...
- 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点
一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...
- 【nodejs】初识 NodeJS(二)
上一节我们构建了一个基础的 http 服务器,我们可以接收 http 请求,但是我们得做点什么吧 – 不同的 http 请求,服务器应该有不同的响应. 路由模块 处理不同的 http 请求在我们的代码 ...
- 【nodejs】初识 NodeJS(一)
构建一个基础的 http 服务器 需要引用 http 模块,http 模块是 node.js 的内置模块. var http = require('http'); http.createServer( ...
- 【nodejs】初识 NodeJS(四)
上节我们把服务器.路由和请求处理程序结合在一起了,下面就编写一个具体的 web 应用. 上传图片的 web 应用 服务器模块(server.js) var http = require('http') ...
- 【nodejs】初识 NodeJS(三)
上节我们将 http 服务器(server.js)和请求路由模块(route.js)整合在一起了,当然这还不够,路由,顾名思义,是指我们要针对不同的 url 有不同的处理方式. 请求处理程序模块(re ...
- 初识NodeJS服务端开发(Express+MySQL)
http://www.alloyteam.com/2015/03/sexpressmysql/
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...
随机推荐
- ubuntu 14.04LTS 环境下配置NFS服务
简言之,NFS(Network FileSystem,网络文件系统)用于在不同机器,不同操作系统之间通过网络互相分享各自的文件.NFS设计之初就是为了在不同的系统间使用,所以它的通讯协议设计与主机及操 ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- svn迁移gitlab,构建前端打包发布流程
前端资源迁移 目前公司的前端资源托管在svn服务器上,由于团队的逐渐扩大,svn的分支管控越来越不灵活,而且对于以后前端流程一体化的处理支持不是很好,因此决定在版本控制上转向git.git的好 ...
- android使用ImageLoader实现图片缓存(安卓开发必备)
相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...
- Javascript中关于cookie的那些事儿
Javascript-cookie 什么是cookie? 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).简单点来说就是:浏览器缓存. cookie由什 ...
- .NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用
在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
在上篇随笔<C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)>介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务 ...
- windows go安装
1.安装git 因为golang是通过git来管理远程包的,所以我们首先要安装git,下载地址:http://www.git-scm.com/download/. git安装比较简单,直接下一步即可( ...
- 关于mysql字段时间类型timestamp默认值为当前时间问题
今天把应用部署到AWS上发现后台修改内容提交后程序报错,经过排查发现是更新数据的时候,有张数据表中的一个timestamp类型的字段默认值变成了"0000-00-00 00:00:00.00 ...
- [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制
原文出处: 原文作者:云中岳 原文链接:http://www.cnblogs.com/netlover/archive/2011/07/08/Win7_IIS_Upload.html IS 7 默认文 ...