NodeJS笔记
什么是 Node
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. --选自:https://nodejs.org/en/
翻译:
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
- Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
- Node.js 的包管理器 npm,是全球最大的开源库生态系统
--选自:http://nodejs.cn/
NodeJS 是一个构建于Chrome V8 引擎之上的一个JavaScript的运行时环境
Node 可以像浏览器一样去解析和执行JavaScript代码
-
JavaScript 特点:
- 动态语言
- 预编译
- 再执行
- 编译和执行都在浏览器环境中完成
- JavaScript包括
- ECMAScript
- var
- if
- while
- function
- Date
- Math
- ....
- DOM
- document
- BOM
- window
- ECMAScript
- 通过编译解析引擎解析和执行JavaScript脚本代码
- Chorme V8 引擎是所有浏览器里面解析和执行js最快的
- JavaScript包括
- 动态语言
-
NodeJS特点:
- NodeJS 的作者将 Chrome 的 V8 引擎移植出来,作为NodeJS 的运行时环境
- 在Node 中,没有界面,没有样式(不需要再关心HTML、CSS)
- 又基于 V8 引擎构建了一系列的API
- ECMASCript:
- var
- if
- while
- function
- Date
- Math
- ....
- 文件操作
- 网络操作
- 让JavaSCript代码具有了服务器编程能力(使JavaScript代码成为了服务器端代码)
- ECMASCript:
- 事件驱动
- 非阻塞IO模型:大量的异步编程接口与
- ajax 一样的 API 调用方式
- 异步:回调
- 跨平台
- 单线程
- 轻量和高效
- Node.js 的包管理器 npm,是全球最大的开源库生态系统
- npm 是世界上最大的开源生态系统
- 在 npm 上发布的第三方包已经接近 35 万个之多
- 每个包只能解决单一问题,解决不了业务
Chrome V8引擎 浏览器内核可以分为两个部分,即:渲染引擎和JS引擎。 渲染引擎:负责对网页语法的解释(如HTML、JavaScript)并渲染网页。 所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法 的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因。 JS引擎:解析 Javascript语言,执行 javascript语言来实现网页的动态效果 Chrome V8引擎:作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。
为什么要学习NodeJS
- 打开服务器的黑盒子
- 满足公司的招聘需求:需要具有一定的服务器开发经验
- 提供更广阔的发展前景:如果是纯粹的前端想要向高级前端发展,服务端就是瓶颈
- 成为全栈的必经之路
Node 应用场景
- 提供服务(Java , PHP , .Net , Python , Ruby 等服务器语言能做的Node都能做)
- 网站开发,提供网站服务器
- 数据库交互
- 移动应用:后台
- 网络游戏:后台
- CLI (Commond Line Interface)程序:
- git
- gulp
- hexo
- Node 具有开发命令行工具的能力
- webpack 打包构建工具
- http-server 在终端中快速提供一个服务
- borwer-sync 提供服务,提供浏览器自动刷新的能力
Node 的优势领域
-
对 IO 操作比较频繁的操作
- 文件读写
- 和数据库交互:网络数据IO
-
实时通信
-
聊天软件:微信、QQ、直播
-
NodeJS 学习资源
- 《Node.js 权威指南》:官方API详解:https://nodejs.org/dist/latest-v6.x/docs/api/
- JavaScript 标准参考教程(alpha): http://javascript.ruanyifeng.com/nodejs/fs.html
- Node 入门:http://www.nodebeginner.org/index-zh-cn.html
- 中文文档(版本比较旧,凑合看):http://www.nodeclass.com/api/node.html
- CNODE社区:http://cnodejs.org
- CNODE-新手入门:http://cnodejs.org/getstart
- Node.js包教不包会:https://github.com/alsotang/node-lessons
- 朴灵:《深入浅出Node.js》
NodeJS 安装
- 使用NodeJS 安装包安装
- 安装方法,见:安装包--->直接安装Node
- 使用 nvm 安装和管理 Node
- 安装方法,见:安装包--->使用nvm安装
判断Node 是否安装成功的方法:
1.0 打开CMD
2.0 输入 node + 回车
Node 中的组成
- 基本语法 ECMAScript
- var
- if
- while
- function
- Date
- Math
- console
- 定时器函数
- setTimeout clearTimeout
- setInterval clearInterval
- global
- ....
- 用户自定义模块
- 关键字:
- reuqire:
- 是一个函数,可以在任何NodeJS脚本文件中使用
- 作用:就是用来加载模块的(加载解析执行JavaScript脚本文件)
- 注意:加载自定义模块时一定要加上“./”,否则加载不出来
- module.exports:
- 每个模块都会提供一个接口对象module.exports
- 作用:通过require加载可以得到模块返回的module.exports对象(相当于每个模块最后面都会有一句:reutrn module.exports)
- 特点:
- 自己写每个JS文件都是一个模块
- 模块天生就是一个私有的作用域
- 可能通过global设置全局变量(不建议)
- reuqire:
- 关键字:
- 第三方模块(由社区/公司/个人提供:如果jquery)
- 所有第三方模块用法都差不多:
- 通过npm 下载
- 通过require函引包
- 查看第三方包的 API 文档(例如:moment)
- 所有第三方模块用法都差不多:
- 核心模块
- 核心模块是由Node环境平台本身提供的
- 以一个唯一核心 模块标识名称进行暴露
- 使用的时候直接通 “require” 进行函数加载
- 如:文件操作模块“fs”,网络操作模块“http”
- 总结:
- 将来我们会结合以上的功能去开发 Node 应用程序,这里先宏观了解一下
- 模块的加载机制,会随着课程的深入再具体讲解。
path 环境变量
问题:为什么不管我们把文件放在哪个目录下面,都可以在CMD中通过Node来运行文件?
答案:环境变量。
- 什么是环境变量?
- 在CMD中,我们输入一段字符时,系统会将字符当作一个程序去当前路径下面去找对应的程序,如果有,直接运行
- 如果没有,系统会去用户变量对应的路径下去找程序,如果能找到直接运行
- 如果没有, 系统会去系统变量对应的路径下去找程序,如果能找到,直接运行
- 如果都没有,报错
- path变量特点:
- 由一个或者多个路径组成,路径之间以 英文分号 隔开
- 将来CMD会按照path中的路径一个一个去找对应的程序,如果有就运行,如果没有就出错
- 环境变量除了可以是直接放路径以外,还可以通过用户自己来创建一个变量,以: %变量名% 的形式添加到path中
常用核心模块
NodeJS 版 hello word
1. 创建一个文件,后缀名改为:.js
2. 在文件中输入 console.log("hello word");
3. 使用 node 打开文件:
方法一:通过 CMD 转到文件所在的路径下面:node + 文件名
方法二:直接找到文件所在目录,在空白处:shift + 右键 ----> 在此外打开命令窗口 ----> 在cmd中输入: node + 文件名
NodeJS 读写文件
读文件:
var fs = require("fs");
fs.readFile("./01_hello word.js",function(err,data){
if (err) {
console.log("读取出错");
}
else {
console.log(data.toString());
}
});
写文件:
var fs = require("fs");
fs.writeFile("./00selfbuild.js","这是我自己写的内容",function(err,data){
if (err) {
console.log("写入文件失败");
} else {
console.log("写入完成");
}
});
NodeJS 开启服务器
var http = require('http');
var server = http.createServer();
server.on('request', function(request, response) {
console.log('收到客户端请求了');
response.write('<h1>hello word</h1>');
response.write('over');
response.end();
});
server.listen( 3000, function() {
console.log('服务器启动成功');
});
构建HTTP服务
-
编写一个响应 “hello word” 服务
var http = require('http'); var server = http.createServer(); server.on('request', function(request, response) { console.log('收到客户端请求了'); response.write('hello word'); response.end(); }); server.listen( 3000, function() { console.log('服务器启动成功'); });
- 注意:
- 服务开启之后除了 request 中的内容会执行多次以外,其它的代码只会执行一行
- 一个端口号只能被一个程序占用。
- 注意:
-
根据不同请求输出不同响应服务var http = require('http');
var server = http.createServer(); server.on('request', function(request, response) { var url = request.url; if ( url == '/') { response.end('home index'); } else if (url == '/a'){ response.end('aaa index'); } }); server.listen( 3000, function() { console.log('服务器启动成功'); }); 注意: 所有请求都是以 “/” 开头的
-
根据不同请求输出不同文件服务:
var http = require('http'); var fs = require('fs'); var server = http.createServer(); server.on('request', function( req, res){ var url = req.url; if (url == '/') { fs.readFile('./temp/index.html',function(err,data) { res.end(data); }); } else if ( url == '/a') { res.end('请求的是a'); } }); server.listen(3000,function() { console.log("服务器开启成功"); });
- 注意:
- 可以通过自己写的服务在不同的页面中跳转,跳转时可以不加ip和端口号
- 如果在自己的html页面中添加一些css文件/图片,那么将来服务是没有办法拿到css文件件/图片的。
- 注意:
-
构建一个类似于 Apache 的功能
var http = require('http'); var fs = require('fs'); var server = http.createServer(); server.on('request', function( req, res){ var url = req.url; var filePath = '.' + url; fs.readFile( filePath, function(err,data) { if (err) { res.end('404 Not Found') } else { res.end(data); } }); }); server.listen(3000,function() { console.log("服务器开启成功"); });
- 注意:文件的命名不能以“/”开头,否则服务器会去当前文件处的磁盘根目录去找到文件