Node.js 第一天
1、node.js 介绍
node.js 是什么?
- 概念:
- 不是一门语言、一个库、一个框架
- 而是一个 JavaScript 运行时环境(runtime)
- 作用:
- 解析和执行 JavaScript 代码
- 使 JavaScript 可以完全脱离浏览器来运行
node.js 和浏览器中的 JavaScript 的区别
- 浏览器中的 JavaScript
- EcmaScript
- BOM
- DOM
- Node.js
- EcmaScript
- 变量
- 方法
- 数据类型
- 内置对象(Array、Object、Date、Math ...)
- 在 Node 这个 JavaScript 执行环境中,为 JavaScript 提供了一些服务器级别的操作 API(模块)
- 文件读写模块
- http(网络)服务模块
- os 操作系统模块
- path 路径操作模块
- 等处理...
- EcmaScript
V8引擎
-
node.js,构建于 Chrome 的 V8 引擎之上
- 代码只是具有特定格式的字符串而已
- 引擎可以认识它,引擎可以帮你去解析和执行
- Google Chrome 的 V8 引擎是目前公认的解析执行 JavaScript 代码最快最高效的
- node.js 的作者把 V8 引擎移植了出来,开发了一个独立的 JavaScript 运行时环境
node.js的特性
- event-driven 事件驱动
- non-blocking I/O nodel非阻塞IO模型(异步)
- lightweight and efficient轻量和高效
npm
- npm 是世界上最大的开源库生态系统
- 接大多数 JavaScript 相关的包都存放在了 npm 上,这样做的目的是为了让开发人员更方便的下载使用
npm install jquery
node.js 能做什么?
- web 服务器后台
- 命令行工具
- npm(node 开发的)
- git(用 c 语言开发的,node 也可以做)
- hexo(node 开发的)
- 对于前端开发工程师来讲,接触 node 最多的是它的命令行工具
- 自己写的很少,主要是使用别人第三方的
- webpack
- gulp
- npm
- 自己写的很少,主要是使用别人第三方的
预备知识
- HTML
- CSS
- JavaScript
- 简单的命令行工具
- cd
- dir
- ls
- mkdir
- rm
能学到啥?
- B/S 编程模型
- Browser-Server
- back-end
- 任何服务端技术与 BS 编程模型都是一样的,和语言无关,Node.js 只是作为我们学习BS编程模型的一个工具而已
- 模块化编程
- RequireJS
- SeaJS
@import('文件路径');
- 以前认知的 JavaScript 只能通过
script
标签来加载 - 在 Node 中可以想
@import()
一样来引用加载文件
- Node 常用 API
- 异步编程
- 回调函数
- Promise
- async
- generator
- Express Web 开发框架
- EcmaScript 6
- 只是一个新的语法而已
2、起步
安装
-
查看版本号
-
node --version
与node -v
都是查看 node.js 的版本号 -
npm -version
是查看npm
的版本号
-
-
官网直接下载安装
-
环境变量
执行
- 创建
node.js
文件,比如index.js
注意
- 不要创建名为
node.js
的文件名,不会执行该文件,并弹出文件代码 - 除了这个名字,可以随便起,但不要起中文名
特点
-
没有 BOM 和 DOM
-
完全就没有
BOM
和DOM
,没有这些 API,它的 API 比如实现读写文件
-
文件操作能力
- 浏览器中的 JavaScript 是没有文件操作能力的,但 node.js 中的 JavaScript 具有文件操作的能力,node.js 提供了实现这些功能的 API
-
模块介绍(API)
-
Node
为JavaScript
提供了很多服务器级别的API
,这些API
绝大多数都被包装到了一个具名的核心模块中了。 -
例如文件操作的
fs
核心模块,http
服务构建的http
模块,path
路径操作模块、os
操作系统信息模块等等。 -
例如:
var fs = require('fs');
var http = require('http');
var OS = require('os');
var path = require('path');
- 作用域:
- Nodejs
没有全局作用域
,只有模块作用域
- 超出模块的内容都不能被访问,外部文件访问不到内部文件内容,内部也访问不到外部。各个模块要想通信,需要用到
require
和exports
require
-
它是一个
Node
方法,用来加载模块的 -
被加载的模块,会立马执行,执行完毕后,再执行
require
之后的代码 -
注意,自行编写的模块,被加载的时候,
可以省略后缀名
。不过,就算引入文件就在该目录下,也一定要用相对路径./
来引入。只有核心模块的引用可以不用相对路径。
exports
-
拿到被加载文件模块导出的接口对象(
exports
),这是一个空对象{}
,如果要使用另外require
模块里面的数据,可以使用exports
设置。 -
exports
简介:-
在每个文件模块中,都提供了一个对象:exports,可以设置并供其它模块使用该对象里面的内容
-
exports默认是一个空对象
-
-
如何使用:
- 设置 a.js:
var bExports = require('./b'); console.log(bExports.foo); // 打印结果为 “hello world” console.log(bExports.add(1,2)); // 打印结果为 3
- 设置 b.js:
var foo = 'hello world'; // 这里设置的foo只能在b模块中使用 exports.foo = foo; // 不过在此处,局部变量 foo 被赋值给 exports.foo ,即可以在任意模块require b.js使用 exports.add = function (x,y) { // 定义函数add到exports对象中 return x+y; };
- 执行a.js:
node a.js // 打印结果为 “hello world”
- 模块分三种:
- 具名的核心模块,例如
fs
、http
、os
等 - 用户
自己编写
的文件模块
核心模块
fs 文件操作系统
-
介绍
- 是 filesystem 的简写,就是文件系统的意思
- 在 Node 中如果想要进行文件操作,就必须引入
fs
这个核心模块
-
使用:
在 fs 这个核心模块中,就提供了所有的文件操作相关的 API,在 fs 这个核心模块中,就提供了所有的文件操作现观的 API
- 通过 require 方法加载 fs 核心模块
var fs = require('fs');
-
读取文件
readFile 方法:
fs.readFile('life.md',function (error,data){});
// 第一个参数:文件路径
// 第二个参数:回调函数
举例:
fs.readFile('hello.js',function (error,data) { if (error) { console.log('读取文件失败了') } else{ console.log('文件读取成功'); console.log(data.toString()); } });
在
console.log(data.toString());
这里运用了toString方法
,它可以将16进制字符转化成我们能够认识的文字或字符 -
创建文件
举例:
```JavaScript
fs.writeFile('haha.js','大家好,我是node.js',function (error){
if(error){
console.log('文件创建失败')
}else{
console.log('文件创建成功');
}
});
```
// 第一个参数:文件路径
// 第二个参数:文件内容
// 第三个参数:回调函数
-
error :
在以下两种情况下,error的值为何?
成功 失败 data:数据 data:undefined error:null error:错误对象
http 文件操作系统
-
通过引入
var http = require('http');
实现 -
举例:最简单的http服务
// 1、加载 http 核心模块 var http = require('http'); // 2、使用http.createServer()方法创建一个Web服务器 var server = http.createServer(); server.on('request',function () { console.log('收到客户端的请求了'); }); server.listen(3000,function () { console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问'); });
-
举例:完整的请求和响应,在不同访问路径做不同的响应
// 1、加载 http 核心模块 var http = require('http'); // 2、使用http.createServer()方法创建一个 Web 服务器 var server = http.createServer(); server.on('request',function (request,response) { // 这里 url 取的值,是地址栏中链接第一个 / 开始的地方。 console.log('收到客户端的请求了,请求路径是:' + request.url); var url = request.url; // 根据请求url,书写内容 if (url == '/'){ response.write('index.html'); } if (url == '/login'){ response.write('this is login page!'); } if (url == '/regist'){ response.write('this is regist page!'); } // 写完后,一定要有结束函数 // end函数内可以传字符串,代替write函数 response.end(); }); // 绑定端口号,这里绑定的是3000,但也可以80,这样直接用127.0.0.1就可以访问 server.listen(3000,function () { console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问'); });
- Request 请求对象
- 请求对象可以用来获取客户端的一些请求信息,例如请求路径
- Response 响应对象
- 响应对象可以用来给客户端发送响应消息,只能够响应二进制与字符串,
数字
、数组
、对象
、boolean
都不行
- 响应对象可以用来给客户端发送响应消息,只能够响应二进制与字符串,
- Request 请求对象
-
响应内容类型
- 引入
var http = require('http'); var server = http.createServer(); server.on('request',function (req,res) { // 这一行会打出 “hello 涓栫晫”,因为服务器用UTF-8包装的字符串,被nodejs默认使用当前计算机系统的默认编码(GBK)进行了解析,所以,我们需要设置响应头 res.end('hello 世界'); }); server.listen(3000,function () { console.log('Server is running...'); });
-
url
- 概念:资源定位符,只是一个标示,末尾不一定是文件名,可以自己随便取名字,不过,一般最好还是要有含义
- 例如:
- 我们可以用 http://127.0.0.1:3000/steve 来定位我们的任何资源
- 资源可以是图片、文件(mp3、jpg、png、md等)、文档(js、java、php等)
-
Content-Type:
- 设置
response(res)
的响应头,告诉浏览器正确的传输内容编码格式
res.setHeader('Content-Type','text/plain;charset=utf-8');
- 响应类型:
- utf-8:代表使用utf-8编码模式进行解析
- text/plain:文本文档
- text/html:HTML文档
- image/jpeg:jpg文件
- 注意,jpg、mp3等
二进制文件
,不需要制定编码,一般字符数据
才指定编码
- 注意,jpg、mp3等
- 等等...
- 前端工具网址:tool.oschina.net
- 设置
-
补充:
- 查找端口被占用情况,并获取PID值:
sudo lsof -i tcp:端口号
- 杀死占用该端口的进程:
sudo kill -9 PID值
- 查找端口被占用情况,并获取PID值:
os 操作系统
- 通过引入
var os = require('os');
来实现 - 举例:
var os = require('os');
// 获取当前机器的 CPU 信息
console.log(os.cpus());
// 获取内存信息
console.log(os.totalmem());
path 路径操作系统
-
通过引入
var path = require('path');
来实现 -
举例:
var path = require('path'); // 获取该路径文件的 后缀名 console.log(path.extname('hello.txt'));
IP地址和端口号
-
综合介绍:
- 所有
联网的程序
都需要进行网络通信,但计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须是唯一的(网卡是通过唯一的 ip 地址
来进行定位的),所以诞生了端口
这个概念
- 所有
-
ip
地址与端口号
的关系和异同:-
ip 地址用来定位计算机
-
端口号用来定位具体的app
-
-
所有
需要联网通信
的应用程序都会占用
一个端口号
-
端口号的范围
0 ~ 65536
之间 -
在计算机中,有一些默认的端口号,最好不要去使用
- http 服务的 80
-
我们开发过程中使用一些简单好记的就可以了,例如 3000、5000等没什么含义