node.js

Posted feiru-cnblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js相关的知识,希望对你有一定的参考价值。

cmd

  • 环境变量(windows系统中的变量)
  • path环境变量
    path坏境变量中保存的是一个一个的路径,路径之间使用;隔开-作用:
  • 当我们在命令行窗口中调用一个命令,或访问一个文件时,系统会先在当前文件夹中寻找,如果找不到则依次去path的路径下寻找,如果找到则直接使用,如果没有找到则继续向下一个路径去寻找,如果所有的路径中都没有找到,则报错
  • 可以将一些常用的文件或程序的路径添加到path下,这样我们就可以在任意位置来访问这些文件了

进程和线程

  • 进程
    -- 进程负责为程序的运行提供必备的环境-进程就相当于工厂中的车间
    线程
  • 线程计算机中的最小的计算单位,线程负责执行进程中的程序,线程就相当于工厂中的工人
  • 单线程
  • 多线程

Node.js简介

  • Node.js是一个能够在服冬瞾端运行JavaScript的开放源代码、跨平否JavaScript运行环境。
  • Node采用Google开发的V8引擎运行js代码,使用事件驱动非阻塞和异步I/o模型等技术来提高性能,可优化应用程序的传输量和规模。
  • Node大部分基本模块都用JavaScript编写。在Node出现之前,
  • 通常作为客户端程序设计语言使用,以S写出的程序常在用户的浏览器上运行。
  • 目前,Node已被IBM、、Microsoft、Yahoo!、Walmart、Groupon.SAP、LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企业采用
  • Node的服务器单线程的
  • Node处理请求时是单线程,但是在后台拥有一个
    IO线程池

模块化

  • 在node中有一个全局对象globalThis,它的作用和网页中window类似
  • 在全局中创建的变量都会作为global的属性保存
  • 在全局中创建的函数都会作为global的方法保存
  • 当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
function (exports, require, module, _filename, _dirname) 

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参:
- exports
-- 该对象用来将变量或函数暴露到外部
- require
-- 函数,用来引入外部的模块
- module
-- module代表的是当前模块本身,exports就是module的属性
- 既可以使用exports导出,也可以使用module.exports导出
- filename
-- 当前模块的完整路径
- dirname
-- 当前模块的目录文件夹

## exports和module.export
- 通过exports只能使用.的方式来向外暴露内部变量
`exports.XXX=XXX`
- 而`module.exports`既可以通过.的形式,也可以直接赋值
`module.exports.XXX=XXXX`
`module.exports =`

## 包基础
- CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由**包结构**和**包描述文件**两个部分组成。
- 包结构 
-- 用于组织包中的各种文件
- 包描述文件
-- 描述包的相关信息,以供外部读取分析

### 包结构
-- 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
- package.json 描述文件(必须存在的文件)
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试

## NPM(Node Package Manager)
- CommonJS包规范是理论,NPM是其中一种实践。
对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。

## 模块的标识
-- 模块的标识就是模块的名字或路径
- 我们node通过模块的标识来寻找模块的
- 对于核心模块〈npm中下载的模块),直接使用模块的名字对其进行引入
- `var fs =require ( "fs");`
- `var express =require ("express");`
- 对于自定义的文件模块,需要通过文件的路径来对模块进行引入,路径可以是绝对路径,如果是相对路径必须以./或../开头:`var router = require("./router" );`

## npm的命令
- npn -v查看npm的版本
- npmn version查看所有模块的版本 npm search包名搜索包
- npm install / i 包名 安装包
- npm remove / r 包名 删除包
- npm install 包名--save 安装包并添加到依赖中
- npm install 下载当前项目所依赖的包
- npm install 包名 -g 全局安装包(全局安装包一般是一些工具)

## node搜索包的流程
- 通过npm下载的包都放到node_modules文件夹中
我们通过npm下载的包,直接通过包名引入即可
- node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块
如果有则直接使用,如果没有则去上一级目录的node_modules中寻找,如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止直到找到磁盘的根目录,如果依然没有,则报错

## Buffer (缓冲区)
- Buffer的结构和数组很像,操作的方法也和数组类似
- 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据-使用buffer不需要引入模块,直接使用即可
- 在buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示,buffer中每一个元素的范围是从00 - ff
- 00000000 - 11111111
- 计算机一个0或一个1我们称为1位(bit)
- 8bit = 1byte(字节)
- buffer中的一个元素,占用内存的一个字节
- `Buffer.from (str)`将一个字符串转换为buffer
- `Buffer.alloc (size)`创建一个指定大小的Buffer
- `Buffer.alloUnsafe(size)`创建一个指定大小的Buffer,但是可能包含敏感数揖
- `Buffer.tostring()`(将缓冲区中的数据转换为字符串

## fs文件系统
- 文件系统(File system)
- 文件系统简单来说就是通过Node来操作系统中的文件
- 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
- 同步和异步调用
- fs模块中所有的操作都有两种形式可供选择同步和异步。
- 同步文件系统会阻塞程序的执行,也就是除非操作完毕,则不会向下执行代码,函数名带有sync
- 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回,函数名不带sync

### 同步文件写入
- 手动操作的步骤
1. 打开文件
fs.opensync(path, flag[,mode])
- path要打开文件的路径
- flags 打开文件要做的操作的类型
-- r只读的
-- w可写的
- mode设置文件的操作权限,一般不传返回值:
- 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作
2. 向文件中写入内容
fs.writesync(fd, stringl , position [ ,encoding] ] )
- fd文件的描述符,需要传递要写入的文件的描述符
- string要写入的内容
- position写入的起始位置
- encoding 写入的编码,默认utf-8
3. 保存并关闭文件
fs.closesync (fd)
- fd要关闭的文件的描述符
【example】

let fs = require(\'fs\');
let res = fs.openSync(\'./JS/1.txt\',\'w\');
console.log(res);
fs.writeSync(res, \'小肥\');
fs.closeSync(res);

### 异步文件的写入

// fs文件系统 异步写入
let fs = require(\'fs\');
fs.open("1.txt",\'w\', function(err, fd)
if (!err)
fs.write(fd, \'这是一段文字\', function(err)
if(!err)
console.log("写入成功");
fs.close(fd, function(err)
if (!err)
console.log("成功");
else
console.warn(err);

);
else
console.warn(err);

);
else
console.warn(err);

);


### 简单文件写入
fs.writeFile(file, data [ , options] , callback )fs.writeFilesync(file, data [ , options ] )
- file要操作的文件的路径
- data要写入的数据
- options 选项,可以对写入进行一些设置
- callback当写入完成以后执行的函数

let fs = require(\'fs\');
fs.writeFile("./JS/1.txt", "11",flag:\'a\',(err)=>
if (err)
console.warn(err);
else
console.log("ok");

)


### 流文件写入
- 同步、异步、简单的写入都不适合大文件的写入,性能较差,容易导致内存溢出

// 流式文件写入
// 导入fs
var fs = require(\'fs\');
// 创建一个可写流
var ws = fs.createWriteStream(\'1.txt\');
// 可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open", function()
console.log("123");
)
// 通过ws向文件中输出内容
ws.write(\'111通过可写流写入的\');
ws.write(\'22通过可写流写入的\');
ws.write(\'33通过可写流写入的\');
ws.write(\'44通过可写流写入的\');
ws.write(\'55通过可写流写入的\');
ws.end();


### 简单文件读取
1.同步文件读取2.异步文件读取3.简单文件读取
fs.readFile(path [ , options] , callback)fs .readFilesync(path [ , options] )
- path要读取的文件的路径
- options读取的选项
- callback回调函数,通过回调函数将读取到内容返回(err,data)
-- err错误数据
-- data读取到的数据,会返回一个Buffer

let fs = require(\'fs\');
fs.readFile(\'1.txt\',(err, data)=>
if (err)
console.warn(err);
else
console.log(data.toString());
fs.writeFile(\'10.txt\',data, (err)=>
if (err)
console.warn(err);
else
console.log(\'ok\');

)

);

4. 流式文件读取
- 流式文件读取也适用于一些比较大的文件,可以分多次文件读取到内存

// 流文件读取
var fs = require(\'fs\');
// 创建一个可读流
var rs = fs.createReadStream("package.json");
var ws = fs.createWriteStream("1.txt");
rs.once("close", function()
rs.close();
)
rs.on("data", function(data)
console.log(data);
ws.write(data);
ws.end();
);
// rs.pipe(ws);

以上是关于node.js的主要内容,如果未能解决你的问题,请参考以下文章

[Node.js]如何在IDEA中配置Node.js

node.js 初识node.js,运行在服务端的 JavaScript

node.js教程基础:node.js命令行选项

Node.js HTTP模块

Node.js基础:第一篇

270 Node.js快速入门:Node.js 的组成,Node.js基础语法,Node.js全局对象global