一.初识Node.Js
1.命令行窗口
1.1 命令行窗口(小黑屏)、CMD窗口、终端、shell
开始菜单 -> 运行 -> cmd -> 回车 / 直接url栏中输入cmd
1.2 常用指令
1.dir 列出当前目录下面的所有文件
2.cd 目录名 进入到指定的目录
3.md 目录名 创建一个文件夹
4.rd 目录名 删除一个文件夹
5.文件名.后缀名 打开文件
6.del 文件名.后缀名 删除一个文件
7.(盘符名)D: 进入(盘符名)D盘
8.cls 清空当前终端里面的内容
1.3 目录
1.. 表示当前目录
2... 表示上一级目录
1.4 环境变量(windows系统中变量)
1.path:环境变量中保存的是一个一个的路径,路径之间使用;隔开。里面放的都是路径,该路径下
的文件,可以直接打开
2.作用:当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首选在当前目录下寻找文
件程序,如果找到了则直接打开,如果没有找到则会依次到环境变量path的路径中寻找,直到找到
为止,如果没有找到则报错。所以我们可以将一些经常需要访问的程序和文件的路径添加到path
中,这样我们就可以在任意位置来访问这些文件和程序了。
2.进程和线程
2.1 进程
进程负责为程序的运行提供必备的环境。进程就相当于工厂中的车间。
2.2 线程
线程是计算机中的最小的计算单位,线程负责执行进程中的程序。线程就相当于工厂中的工人。
2.3 单线程
例如:js是单线程的。
2.4. 多线程
例如:java是多线程的。
3.Node.JS
是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。采用Google开
发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程
序的传输量和规模。
3.1 I/O(Input/Output)
I/O操作指的是对磁盘的读写操作
3.2 Node
1.Node是对ES标准的一种实现,Node也是一个JS引擎。
2.通过Node可以使js代码在服务器端运行。
3.Node仅仅对ES标准进行了实现,所以在Node中不包含DOM 和 BOM。
4.Node中可以使用ES所有的内建对象
(1) String | Number | Boolean | Math | Date | RegExp | Function | Object | Array
(2) 可以使用 console 也可以使用定时器(setTimeout() setInterval())
5.Node 可以在后台来编写服务器
6.Node编写服务器都是单线程的服务器
(1) 进程就是一个一个的工作计划(工厂中的车间)
(2) 线程是计算机最小的运算单位(工厂中的工人)
(3) 线程是干活的
7.传统的服务器都是多线程的
(1) 每进来一个请求,就创建一个线程去处理请求
8.Node的服务器是单线程的
(1) Node处理请求时是单线程,但是在后台拥有一个I/O线程池
9.运行:node XXX.js运行
3.3 为什么选择Node
使用JavaScript语法开发后端应用,生态系统活跃,有大量开源库可以使用,前端开发工具大多基于
Node开发
3.4 Node是什么
Node是一个基于Chrome V8引擎的JavaScript代码运行环境。
浏览器(软件)能够运行JavaScript代码,浏览器就是JavaScript代码的运行环境
Node(软件)能够运行JavaScript代码,Node就是JavaScript代码的运行环境
3.5 Node.js 的组成
JavaScript 由三部分组成,ECMAScript,DOM,BOM。
Node.js是由ECMAScript及Node 环境提供的一些附加API组成的,包括文件、网络、路径等等一些
更加强大的 API。(ECMAScript + Node模块API)
4.模块化
JavaScript开发弊端:JavaScript在使用时存在两大问题,文件依赖和命名冲突。
软件中的模块化开发:一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影
响其他功能的运行。
4.1 模块化
将一个完整的程序分成一个一个小的程序,降低耦合度,方便代码的复用。在node中,一个js文件
就是一个模块。在node中,每一个js文件中的js代码 都是独立运行在一个函数中,而不是全局作用
域,所以一个模块中的变量和函数在其他模块中无法访问。
(function(){
....
})()
我们可以通过 exports 来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为
exports的属性即可。
exports.x = 100
exports.fn = function(){}
Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法
得到。模块内部可以使用exports对象行成员导出,使用require方法导入其他模块。
4.2 引入其他的模块
在node中,通过require()函数来引入外部的模块。require() 可以传递一个文件的路径作为参数,
node将会自动根据该路径来引入外部模块。这里路径,如果使用相对路径,必须以.或..开头
使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块。
4.3 模块标识
我们使用require()引入外部模块时,使用的就是模块标识。
require( './02module.js ')
'./02module.js'这个路径就是一个模块标识。我们可以通过模块标识来找到指定的模块。
模块分成两大类:核心模块和文件模块
核心模块:
1.由node引擎提供的模块
2.核心模块的标识就是模块的名字 (或者npm下载的模块,都是直接写名字)
文件模块:
1.由用户自己创建的模块
2.文件模块的标识就是文件的路径 (可以是绝对路径 或 相对路由)相对路径使用 . 或 .. 开头。
4.4 什么是系统模块
Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块
4.4.1 系统模块fs 文件操作:
f:file 文件 ,s:system 系统,文件系统。
const fs = require('fs');
读取文件内容
fs.readFile('文件路径/文件名称'[,'文件编码'], callback);
写入文件内容
fs.writeFile('文件路径/文件名称', '数据', callback);
const content = '
正在使用fs.writeFile写入文件内容
';fs.writeFile('../index.html', content, err => {
if (err != null) {
console.log(err);
return;
}
console.log('文件写入成功');
});
4.4.2 系统模块path 路径操作:
为什么要进行路径拼接,不同操作系统的路径分隔符不统一。
/public/uploads/avatar Windows 上是 \ / Linux 上是 /
路径拼接语法: path.join('路径', '路径', ...)
// 导入path模块
const path = require('path');
// 路径拼接
let finialPath = path.join('itcast', 'a', 'b', 'c.css');
// 输出结果 itcast\a\b\c.css
console.log(finialPath);
相对路径VS绝对路径:
大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
在读取文件或者设置文件路径时都会选择绝对路径,使用__dirname获取当前文件所在的绝对路径
4.5 什么是第三方模块
别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。
第三方模块有两种存在形式:
1.以js文件的形式存在,提供实现项目具体功能的API接口。
2.以命令行工具形式存在,辅助项目开发。
npmjs.com:第三方模块的存储和分发仓库。
4.5.1 第三方模块 nodemon
nodemon是一个命令行工具,用以辅助项目开发。在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
使用步骤:
1.使用npm install nodemon –g 下载它
2.在命令行工具中用nodemon命令替代node命令执行文件
5.global
5.1 全局变量
在node中有一个全局变量 global, 它的作用和网页中window类似。在全局中创建的变量都会作为global的属性保存。在全局中创建的函数都会作为global的方法保存。
console.log(global);
Node中全局对象下有以下方法,可以在任何地方使用,global可以省略。
console.log() 在控制台中输出
setTimeout() 设置超时定时器
clearTimeout() 清除超时时定时器
setInterval() 设置间歇定时器
clearInterval() 清除间歇定时器
5.2 模块作用域
当node在执行模块中的代码时,类似用如下代码包裹模块代码
function (exports, require, module, __filename, __dirname) {
//模块代码
}
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参
exports 该对象用来将变量或函数暴露到外部 require 函数,用来引入外部模块
module 代表的是当前模块本身 exports就是module的属性,既可以使用 exports 导出,也可以使用module.exports 导出.
__filename 当前模块的完整路径 __dirname 当前模块所在文件夹的完整路径
查看的方式:
console.log(arguments);
arguments.callee:保存的是当前执行的函数的对象
console.log(arguments.callee+'');
console.log(module.exports === exports);
console.log(__filename);
console.log(__dirname);
5.2.1. exports 和 module.exports
exports 实际指向 module.exports。通过exports只能使用.的方式来向外暴露内部变量
exports.xxx = xxx
而module.exports既可以通过.的形式,也可以直接赋值
module.exports.xxx = xxx
module.exports = {}