node基础
1. 命令行窗口、CMD窗口、终端、shell
- windows ——> cmd ——> 回车
- 常用指令:
- dir : 列出当前目录下的所有文件
- cd 目录名 : 进入到指定目录
- md 目录名 : 创建一个文件夹
- rd 目录名 : 删除一个文件夹
- 文件名 : 打开此文件
- e: : 进入e盘
- d: : 进入e盘
- cls : 清屏
- 目录
- . : 表示当前目录
- .. : 表示上一级目录
- 环境变量(windows系统中变量,打开方式 : 设置 ——> 系统 ——> 关于——> 高级系统设置)
Path(用户变量)
C:UsersLENONO.dnxin
C:UsersLENONOAppDataLocalProgramsPythonPython36Scripts
C:UsersLENONOAppDataLocalProgramsPythonPython36- 当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开。如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止。如果还是没找到则报错,类似于作用域链。
- 所以我们可以将一些经常需要访问的程序和文件的路径添加Path中,这样我们就可以在任意位置来访问这些文件和程序了。
- 注意,配置完需重启命令行窗口方可生效。
2. node简介
- I/O (Input/Output)指的是对磁盘的读写操作。
- Node可以在后台来编写服务器。
- Node.js是一个能够在服务器端运行JavaScript的运行环境。
- Node可以在后台来编写服务器,传统的服务器都是多线程的,Node的服务器单线程的。
3. 使用 node 运行 js文件
- 在命令行通过命令进入文件所在文件夹(也可以在图形界面进入此文件夹,在文件夹路径栏直接输入cmd),输入 node xxx.js 来运行。
- 在vscode的终端上运行。
4. 模块化简介
模块化
- 如果程序设计的规模达到了一定程度,则必须对其进行模块化。
- CommonJS 的模块功能可以帮我们解决该问题。
CommonJS规范
- CommonJS规范的提出,主要是为了弥补ES5没有模块化标准的缺陷。
- CommonJS对模块的定义十分简单:
- 模块引用
- 模块定义
- 模块标识
模块引用
- 在 node 中,通过 require() 函数来引入外部的模块。require() 可以传递模块标识表示作为参数。
- 使用 require() 引入模块以后,该函数会返回一个对象,这个对象是引入的模块的 exports 对象。
var math = require("./math.js");
模块定义
- 在Node中,一个js文件就是一个模块。
- 在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块的中的变量和函数在其他模块中无法访问。
- 我们可以通过 exports 来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为 exports 的属性即可。
模块标识
- 我们使用 require() 引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
- 模块分成两大类
- 核心模块
- 由node引擎提供的模块。
- 核心模块的标识就是模块的名字。
- 示例:var fs = require("fs")
- 文件模块
- 由用户自己创建的模块。
- 文件模块的标识就是文件的路径(绝对路径,相对路径),相对路径使用./或../开头。
- 核心模块
node中的全局对象
- 在node中有一个全局对象 global,它的作用和网页中window类似。
- 在全局中创建的变量都会作为 global 的属性保存。
- 在全局中创建的函数都会作为 global 的方法保存。
模块的原理
//当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
function (exports, require, module, __filename, __dirname) {
//在代码的最底部,添加如下代码
}
-
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参。(该函数由node.js调用)
- exports
- 该对象用来将变量或函数暴露到外部,值与 module.exports 的值相等,指向同一个对象。
- require
- 函数,用来引入外部的模块。
- module
- module代表的是当前模块本身。
- exports就是module的属性。
- 既可以使用 exports 导出,也可以使用 module.exports 导出。
- __filename
- C:UserslilichaoWebstormProjectsclass0705 1.node 4.module.js
- 当前模块的完整路径。
- __dirname
- C:UserslilichaoWebstormProjectsclass0705 1.node
- 当前模块所在文件夹的完整路径。
- exports
-
exports 和 module.exports
- 通过exports只能使用.的方式来向外暴露内部变量。
exports.xxx = xxx
- 而module.exports既可以通过.的形式,也可以直接赋值。
module.exports.xxx = xxxx module.exports = {}
- 不能使用 exports = {},因为这样 exports 指向的就不是 module.exports 所指向的对象 (实际暴露的是这个对象) 了。
5. 包 package
简介
- CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。
- CommonJS的包规范由包结构和包描述文件两个部分组成:
- 包结构 : 用于组织包中的各种文件。
- 包描述文件 : 描述包的相关信息,以供外部读取分析。
- 所谓的包就是把你所写的一组模块放到一个文件夹内,加一个 package.json 。
包结构
- 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,必须包含这个文件:package.json 描述文件。
包描述文件
- 包描述文件用于表达非代码相关的信息,最重要的是包描述文件是 package.json。它是一个JSON格式的文件 package.json,位于包的根目录下,是包的重要组成部分。
- 注意:在JSON文件不能写注释!
6. NPM(Node Package Manager)
- 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
- node所有下载的模块都会放入 node_modules 文件夹中。
- node在使用模块名字来引入模块时,它会首先在当前目录的 node_modules 中寻找是否含有该模块,如果有则直接使用。如果没有则去上一级目录的 node_modules 中寻找,如果有则直接使用。如果没有则再去上一级目录寻找,直到找到磁盘的根目录,如果依然没有,则报错。
- npm 命令:
- npm init : 安装包之前最好先用此命令创建 package.json
- npm -v : 查看版本
- npm : 帮助说明
- npm search 包名 : 搜索包
- npm install/i : 下载当前项目所依赖的包
- npm install/i 包名 : 在当前目录安装包
- npm install/i 包名 -g : 全局模式安装包(全局安装的包一般都是一些计算机使用的工具)
- npm remove/r 包名 : 删除一个模块
- npm install/i 包名 --save : 安装包并将其添加到依赖中 (vscode不用加 --save 自动向依赖添加/删除)
7.cnpm
- 镜像服务器。
8. Buffer(缓冲区)
- Buffer 的结构和数组很像,操作的方法也和数组类似。
- 数组中不能存储二进制的文件,而 Buffer 就是专门用来存储二进制数据。
- 使用 Buffer 不需要引入模块,直接使用即可。(是node中扩充的一个对象)
- 在 Buffer 中存储的都是二进制数据,但是在显示时都是以16进制的形式显示,但是只要是数字输出在控制台,就是10进制。
- Buffer 中的一个元素,占用内存的一个字节,Buffer 中每一个元素的范围是从00 - ff 0 - 255。
- 在 Buffer 中一个汉字占用3个字节。
- Buffer 的大小一旦确定,则不能修改,Buffer 实际上是对底层内存的直接操作。(原因:再扩充会导致buffer所占用的不是连续的内存空间,不好维护。)
- var buf = Buffer.alloc(10),buf.length 是 buf 占用内存的大小。
- new Buffer() 方法都被弃用了。
- Buffer 方法 :
- Buffer.from(str) 将一个字符串转换为buffer
- Buffer.alloc(size) 创建一个指定大小的Buffer
- Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据(alock会初始化所分配的内存空间,allockUnsafe不会初始化)
- buf.toString() 将缓冲区中的数据转换为字符串
- 服务器读取/发送数据之前,数据先存在缓冲区中。简单来说 Buffer 就是一个类似于数组的东西,但是存储的是二进制数据。
9. fs 文件系统(File System)
- 文件系统简单来说就是通过Node来操作系统中的文件。
- 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载。
var fs = require("fs")
同步和异步调用
- fs模块中所有的操作都有两种形式可供选择同步和异步。
flag
写入读取文件
- 同步文件写入/读取(打开、读写、关闭)
- 异步文件写入/读取
- 简单文件写入/读取
- fs.writeFile()
- fs.writeFileSync()
- fs.readFile()
- fs.readFileSync()
- 流式文件写入/读取
- 写入或读取大量数据时,最好的方法之一是使用流。
- 使用流需要创建 :
- fs.createWriteStream()
- fs.createReadStream()
- 使用了 ws = fs.createWriteStream() ,就可以使用 ws.write() 方法来写入它,写入完成后,在调用 ws.close() 方法来关闭流。
- 如果要读取一个可读流中的数据,必须要为可读流绑定一个 data 事件, data 事件绑定完毕,它会自动开始读取数据(用on绑定)。
- pipe() 可以将可读流中的内容,直接输出到可写流中。
- 可以通过监听流的open和close事件来监听流的打开和关闭(用once监听)。
- on() : 可以为对象绑定一个事件
- once() : 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效
- 读取文件时返回 buffer ,因为读的不一定是文本,也有可能是图片视频。
其余fs方法见文档
学识浅薄,如有错误,恳请斧正,在下不胜感激。