NodeJS笔记
什么是 Node
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
- ....
- 文件操作:(IO操作)文件的读取(o:output)/写入(I:input)
- 网络操作
- ....
- 让JavaSCript代码具有了服务器编程能力(使JavaScript代码成为了服务器端代码)
- ECMASCript:
- npm的两种含义
- 1)它是node的包管理器
- 2)npm 是世界上最大的开源生态系统(npmjs.com)
Chrome V8引擎 浏览器内核可以分为两个部分,即:渲染引擎和JS引擎。 渲染引擎:负责对网页语法的解释(如HTML、JavaScript)并渲染网页。 所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法 的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因。 JS引擎:解析 Javascript语言,执行 javascript语言来实现网页的动态效果 Chrome V8引擎:作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。
为什么要学习NodeJS
- 打开服务器的黑盒子
- 满足公司的招聘需求:需要具有一定的服务器开发经验与后台技术开发保持良好沟通
- 提供更广阔的发展前景:如果是纯粹的前端想要向高级前端发展,服务端就是瓶颈
- 成为全栈的必经之路
- nodejs在国内已经慢慢慢慢的成长起来
Node 应用场景
- 提供服务(Java , PHP , C#, Python , Ruby 等服务器语言能做的Node都能做)
- 网站开发,提供网站服务器
- 数据库交互
- 桌面应用程序
- 区块链
NodeJS 学习资源
- 《Node.js 权威指南》:官方API详解:https://nodejs.org/dist/latest-v6.x/docs/api/
- JavaScript 标准参考教程(alpha): http://javascript.ruanyifeng.com/nodejs/fs.html(仅仅只是对fs模块的介绍,知识点不太全面)
- 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
判断Node 是否安装成功的方法:
1.0 打开CMD
2.0 输入 node + 回车
Node 中的组成
- 基本语法 ECMAScript
- var
- if
- while
- function
- Date
- Math
- console
- 定时器函数
- setTimeout clearTimeout
- setInterval clearInterval
- global
- ....
- 核心模块
- 第三方模块
- 用户自定义模块
核心模块
- 核心模块是由Node环境平台本身提供的
- 以一个唯一核心 模块标识名称进行暴露
- 使用的时候直接通 “require” 进行函数加载
- 核心模块的使用步骤:
- 1)使用require关键字引入核心模块
- 2)调用核心模块中的方法
- 文本操作模块:file system--->简写:fs
- http模块(网络操作):http
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("服务器开启成功"); });
- 注意:文件的命名不能以“/”开头,否则服务器会去当前文件的磁盘根目录去找到文件
第三方模块
由公司/社区/个人提供的一套模块,可以帮助我们解决一类问题。
所有第三方模块用法都差不多:
- 通过npm 下载
- 通过require关键字引包
- 查看第三方包的 API 文档(例如:moment)
用户自定义模块
- 关键字:
- reuqire:
- 是一个函数,可以在任何NodeJS脚本文件中使用
- 作用:就是用来加载模块的(加载解析执行JavaScript脚本文件)
- 注意:加载自定义模块时一定要加上“./”,否则加载不出来
- module.exports:
- 每个模块都会提供一个接口对象module.exports
- 作用:通过require加载可以得到模块返回的module.exports对象(相当于每个模块最后面都会有一句:reutrn module.exports)
- 特点:
- 自己写每个JS文件都是一个模块
- 模块天生就是一个私有的作用域
- 可能通过global设置全局变量(不建议)
- reuqire:
模块化思想
node中有一个思想:模块化。
- 将所有的功能都分解为一个单独的模块,
- 将来要组成一个大型的项目,只需要将这些模块组装起来就可以了
关键字
-
require
引入模块
-
module.exports
暴露接口(导出对象)
-
注意点:
- 在nodejs中一个js文件就是一个模块