windows系统中配置环境变量问题:
windows系统中需要配置环境变量,环境变量其实指的是一个个的路径。当我们在命令行窗口打开一个文件,或调用一个程序时,如果找到了则直接打开,如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止,如果没找到则报错。因此我们可以将一些经常需要访问的程序和文件的路径添加到path中,这样就可以在任意为止访问这些文件和程序。
进程和线程
进程
- 进程负责为程序的运行提供必备的环境
- 进程相当于工厂中的车间
线程
- 线程计算机中的最小的额计算单位,线程负责执行进程中的程序
- 线程就相当于工厂中的工人
单线程
- JS,Node是单线程
- Node的服务器是单线程的,但是在后台拥有一个 I/O 线程池
多线程
- 传统的服务器都是多线程的,每进来一个请求,就创建一个线程去处理请求
Node.js简介
- Node.js能够在服务器端运行JS
- Nod采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能
- Node大部分基本模块都使用JavaScript编写
Node的用途
- Web服务API,比如REST
- 实时多人游戏
- 后端的Web服务,例如跨域,服务器端的请求
- 基于Web的应用
- 多客户端的通信,如即时通信
在node中有一个全局对象 global , 他的作用和网页中 window 类似,
在全局中创建的变量都会作为 global 的属性保存
在全局中创建的函数都会作为 global 的方法保存
当node 在执行模块中的代码时,它会将代码包装载下面的函数中执行,并且在函数执行时,同时传递进了5个实参。(遵循CommonJS的规范)
function (exports,require,module,__filename,__dirname) {
}
exports
- 该对象用来将变量或函数暴露到外部
require
- 函数,用来引入外部的模块
module
-
module代表的是当前模块本身
-
exports就是module的属性
-
module.exports == exports
__filename
- 当前模块的完整路径
__dirname
- 当前模块所在文件夹的完整路径
这五个属性都是可以直接用的
exports 和 module.exports
- 通过exports 只能使用 . 的方式向外暴露内部变量
- exports.xxx = xxx
- 而module.exports既可以通过 . 的形式,也可以直接赋值
- module.exports.xxx = xxx
- module.exports = { }
node 诞生的初衷
node诞生的初衷是为了解决 I/O 阻塞的问题。因为传统的服务器都是多线程的,会导致 I/O阻塞。而node 是单线程的,会缓解阻塞
node和npm关系:
node.js是javascript的一种运行环境,是对Google V8引擎进行的封装。是一个服务器端的javascript的解释器。
包含关系,nodejs中含有npm,比如说你安装好nodejs,你打开cmd输入npm -v会发现出啊线npm的版本号,说明npm已经安装好。
引用大神的总结:
其实npm是nodejs的包管理器(package manager)。我们在Node.js上开发时,会用到很多别人已经写好的javascript代码,如果每当我们需要别人的代码时,都根据名字搜索一下,下载源码,解压,再使用,会非常麻烦。于是就出现了包管理器npm。大家把自己写好的源码上传到npm官网上,如果要用某个或某些个,直接通过npm安装就可以了,不用管那个源码在哪里。并且如果我们要使用模块A,而模块A又依赖模块B,模块B又依赖模块C和D,此时npm会根据依赖关系,把所有依赖的包都下载下来并且管理起来。试想如果这些工作全靠我们自己去完成会多么麻烦!
npm install 包名 --save // 安装包并添加到依赖中
npm install 包名 -g // 全局安装包(全局安装的包一般都是一些工具包)
Buffer(缓冲区),用来保存数据
- Buffer的结构和数组很像,操作的方法也和数组类似
- 数组中不能存储二进制的文件,而Buffer是专门用来存储二进制数据
- 使用buffer不需要引入模块,直接使用即可
- 在buffer中存储的都是二进制数据,但是在显示时都是以十六进制的形式显示的(00 ~ ff, 因为计算机中最小的数据存储单位是字节(Byte),计算机最小的数据传输单位是:位/比特(bit), 一个字节等于8bit, 所以存储时是 00000000 ~ 11111111, 也就是 00 ~ ff)
fs (文件系统)
通过Node 来操作系统中的文件。服务器的本质就是将本地的文件发送过远程的客户端
- 使用fs不需要引入模块,直接使用即可
const fs = require('fs');
- 打开文件 > 写入内容 > 关闭文件
同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出。这时就需要流式文件写入。
创建一个可写流 fs.createWriteStream
打开流 > 写入内容 > 关闭流
pipe() 可以将可读流中的东西直接输入到可写流中
var fs = require("fs")
// 创建一个可读流
var rs = fs.createReadStream("c:/User/aaa")
// 创建一个可写流
var ws = fs.createWriteStream("b.mps");
// pipe() 可以将可读流中的东西直接输入到可写流中
rs.pipe(ws)