NodeJS

243 阅读8分钟

NodeJS


命令行

命令行窗口(小黑屏)、CMD窗口、终端、shell

  • 常用的指令: dir 列出当前目录下的所有文件 cd 目录名 进入到指定的目录 md 目录名 创建一个文件夹 rd 目录名 删除一个文件夹

    • 目录 . 表示当前目录 .. 表示上一级目录

    • 环境变量(windows系统中变量) path C:\work\jdk\jdk1.7.0_75/bin; %CATALINA_HOME%/bin; C:\work\soft\tools\AppServ\Apache24\bin; C:\work\soft\tools\AppServ\php5; C:\Users\lilichao\AppData\Local\Programs\Fiddler; C:\work\environment\Egret\Egret Wing 3\bin; C:\Users\lilichao\AppData\Roaming\npm; C:\Program Files\MongoDB\Server\3.2\bin; C:\Users\lilichao\Desktop\hello

      • 当我们在命令行窗口打开一个文件,或调用一个程序时, 系统会首先在当前目录下寻找文件程序,如果找到了则直接打开 如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止 如果没找到则报错

      • 所以我们可以将一些经常需要访问的程序和文件的路径添加到path中, 这样我们就可以在任意位置来访问这些文件和程序了

进程和线程

- 进程
	- 进程负责微为程序的运行提供必备的环境
	- 进程就是一个一个的工作计划(工厂中的车间)
	
- 线程
	- 线程是计算机中最小的运算单位,线程负责执行进程中的程序
	- 线程相当于工厂中的工人
			
- 传统的服务器都是多线程的
	- 每进来一个请求,就创建一个线程去处理请求
	
- Node的服务器是单线程的
	- Node处理请求时是单线程,但是在后台拥有一个I/O线程池

Node.JS

官方文档

中文文档

Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。

Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。

nodejs 的模块

  1. 内置模块 : 可以直接引入使用

  2. 第三方模块 : 需要通过 npm 命令下载安装 然后引入使用

  3. 自定义模块 : 通过 module.exports 和 exports 定义导出模块

    • node的特点: 1.非阻塞、异步的I/O 2.事件和回调函数 3.单线程(主线程单线程,后台I/O线程池) 4.跨平台

    • 模块化

      • 在node中为了对模块管理,引入了CommonJS规范

        • 模块的引用
          • 使用 require()函数来引入一个模块
          • 例子: let 变量 = require("模块的标识");
        • 模块的定义
          • 在node中一个js文件就是一个模块
          • 默认情况下在js文件中编写的内容,都是运行在一个独立的函数中, 外部的模块无法访问
          • 导出变量和函数
            • 使用 exports,exports 指向 module.exports
              • 例子: exports.属性 = 属性值; exports.方法 = 函数;
            • 使用module.exports
              • 例子: module.exports.属性 = 属性值; module.exports.方法 = 函数; module.exports = {}; exports只能使用.的方式来向外暴露内部变量而 module.exports既可以通过.的,也可以直接赋值
        • 模块的标识
          • 模块的标识就是模块的名字或路径 对于核心模块(内置模块),直接使用模块的名字对其进行引入 var fs = require("fs"); var express = require("express");

          • 对于自定义的文件模块,需要通过文件的路径来对模块进行引入 路径可以是绝对路径,如果是相对路径必须以./或 ../开头 var router = require("./router");

npm

npm(Node Package Manager node的包管理器)
	- 通过npm可以对node中的包进行上传、下载、搜索等操作
	- npm会在安装完node以后,自动安装
	- npm的命令
		- npm -v 查看npm的版本
		- npm version 查看所有模块的版本
		- npm init 初始化项目(创建package.json)
		- npm search 包名 搜索包
		- npm install / i 包名 安装包
		- npm remove / r 包名 删除包
		- npm install 包名 --save 安装包并添加到依赖中 *****
		- npm install 包名 -g 全局安装包(全局安装的包一般都是一些工具)
		- npm install 包名 -registry=地址 从镜像源安装
		- npm config set registry 地址 设置镜像源
		
- 包(package)
	- 将多个模块组合为一个完整的功能,就是一个包
	- 包结构
		bin
			- 二进制的可执行文件,一般都是一些工具包中才有
		lib
			- js文件
		doc
			- 文档
		test
			- 测试代码
		package.json
			- 包的描述文件
			
	- package.json	
		- 它是一个json格式的文件,在它里面保存了包各种相关的信息
			name 包名
			version 版本
			dependencies 依赖
			main 包的主要的文件
			bin 可执行文件

Buffer(缓冲区)

  • Buffer和数组的结构的非常类似,Buffer是用来存储二进制数据的,但是是以十六进制形式显示。

    • Buffer的方法

      • Buffer.from(字符串):将一个字符串中内容保存到一个buffer中
      • Buffer.toString():将buffer转换为一个字符串
      • Buffer.alloc(size):创建一个指定大小的buffer对象
      • Buffer.allocUnsafe(size):创建一个指定大小的buffer对象,可以包含敏感数据
      • Buffer.write(string):向缓冲区中写入字符串
      • Buffer[index]:替换指定索引位置的数据
      • Buffer.fill(value):将指定值填入到缓冲区的指定位置
      /* 
      	不需要引入模块,可直接使用
      	buffer中的一个元素,占用内存一个字节
      */
      
      let str = "hello world"
      
      // 将一个字符串保存到buffer中
      let buf = Buffer.from(str) 
      
      // 占用内存的大小
      let length = buf.length
      
      // 创建一个指定大小的Buffer
      let buf2 = Buffer.alloc(10) // 10字节的buffer
      

核心模块API

fs(文件系统)

  • fs模块
    • 在Node通过fs模块来对系统中的文件进行操作,直接引入即可
    • 引入fs:let fs = require("fs");
    • fs模块中的大部分操作都提供了两种方法,同步方法和异步方法
      • 同步方法带sync,同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。

      • 异步方法没有sync,异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

        • 写入文件 1.同步写入 2.异步写入 3.简单写入 4.流式写入

        • 读取文件 1.同步读取 2.异步读取 3.简单读取 4.流式读取

        • 方法

          • 打开文件 fs.open(path, flags[, mode], callback) fs.openSync(path, flags[, mode])

          • 读写文件 fs.write(fd, string[, position[, encoding]], callback) fs.writeSync(fd, string[, position[, encoding]])

            fs.read(fd, buffer, offset, length, position, callback) fs.readSync(fd, buffer, offset, length, position)

          • 关闭文件 fs.close(fd,callback) fs.closeSync(fd);

          • 简单文件读取和写入 fs.writeFile(file, data[, options], callback) fs.writeFileSync(file, data[, options])

            fs.readFile(path[, options], callback) fs.readFileSync(path[, options])

          • 流式文件读取和写入

            • 流式读取和写入适用于一些比较大的文件 fs.createWriteStream(path[, options]) fs.createReadStream(path[, options]) open(),close() once(),end()

目录操作


/*
    目录操作
    1、创建目录
    fs.mkdir(path[, mode], callback)
    fs.mkdirSync(path[, mode])
    2、读取目录
    fs.readdir(path[, options], callback)
    fs.readdirSync(path[, options])
    3、删除目录
    fs.rmdir(path, callback)
    fs.rmdirSync(path)
*/
const path = require("path");
const fs = require("fs");
// 创建目录
fs.mkdir(path.join(__dirname, "abc"), (err) => {
  console.log(err);
});
fs.mkdirSync(path.join(__dirname, "hello"));
// --------------------------------
// 读取目录
fs.readdir(__dirname, (err, files) => {
  files.forEach((item, index) => {
    fs.stat(path.join(__dirname, item), (err, stat) => {
      if (stat.isFile()) {
        console.log(item, "文件");
      } else if (stat.isDirectory()) {
        console.log(item, "目录");
      }
    });
  });
});
let files = fs.readdirSync(__dirname);
files.forEach((item, index) => {
  fs.stat(path.join(__dirname, item), (err, stat) => {
    if (stat.isFile()) {
      console.log(item, "文件");
    } else if (stat.isDirectory()) {
      console.log(item, "目录");
    }
  });
});
// ------------------------------
// 删除目录
fs.rmdir(path.join(__dirname, "abc"), (err) => {
  console.log(err);
});
fs.rmdirSync(path.join(__dirname, "qqq"));

 多个模块可以形成包,不过要满足特定的规则才能形成规范的包

 全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具。

包的安装方式

  • 全局安装
  • 本地安装

解决npm安装包被墙的问题

  • --registry      npm config set registry=https//registry.npm.taobao.org 
  • cnpm      淘宝NPM镜像,与官方NPM的同步频率目前为10分钟一次       官网: npm.taobao.org/       npm install -g cnpm –registry=https//registry.npm.taobao.org       使用cnpm安装包: cnpm install 包名
  • nrm      作用:修改镜像源       项目地址:www.npmjs.com/package/nrm       安装:npm install -g nrm

npm常用命令

  • 安装包 npm install package_name@version

  • 更新包 npm update package_name@version

  • 卸载包 npm uninstall package_name@version

  • save (向生产环境添加依赖 dependencies)

  • save-dev (向开发环境添加的依赖 devDependencies)

yarn基本命令

  • 类比npm基本使用

Image.png

自定义包

包的规范
  • package.json必须在包的顶层目录下
  • 二进制文件应该在bin目录下
  • JavaScript代码应该在lib目录下
  • 文档应该在doc目录下
  • 单元测试应该在test目录下
package.json字段分析
  • name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格
  • description:包的简要说明
  • version:符合语义化版本识别规范的版本字符串
  • keywords:关键字数组,通常用于搜索
  • maintainers:维护者数组,每个元素要包含name、email(可选)、web(可选)字段
  • contributors:贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一- 个元素
  • bugs:提交bug的地址,可以是网站或者电子邮件地址
  • licenses:许可证数组,每个元素要包含type(许可证名称)和url(链接到许可证文本的- 地址)字段
  • repositories:仓库托管地址数组,每个元素要包含type(仓库类型,如git)、url(仓- 库的地址)和path(相对于仓库的路径,可选)字段
  • dependencies:生产环境包的依赖,一个关联数组,由包的名称和版本号组成
  • devDependencies:开发环境包的依赖,一个关联数组,由包的名称和版本号组成