初学node(一)

1.什么是Node?

Node.js 是基于Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。

不需要处理兼容性问题 2009.05

1.1Node是一个JS的运行环境

​ js的运行方式:

​ 1.客户端:把js文件引入,然后打开浏览器,控制台查看

​ 2.node服务端:

​ 1.cmd窗口中cd命令切换到需要打开的文件夹下,运行 node 文件名

​ 2.直接在文件夹下 shift+右键

​ 3.vscode编辑器中直接在当前文件的终端中打开,submint编辑器是需要安装terminal插件

1.2对比浏览器中的JS

1.2.1 浏览器中的JS

在这里插入图片描述

web api 提供了操作浏览器窗口和页面的功能。例如:BOM操作,DOM操作,AJAX

这些功能有局限性。例如:跨域问题,文件读写

1.2.2 Node中的JS

在这里插入图片描述

nodeAPI几乎提供了所有能做的事情

1.2.3 Node中的JS对比浏览器中的JS

在这里插入图片描述

​ ① 浏览器提供了有限的能力,JS只能使用浏览器提供的功能做有限的操作

​ ② Node提供了完整的控制计算机的能力,NodeJS几乎可以通过Node提供的接口,实现对整个操作系统的控制

1.3官方文档

​ Node官网:https://nodejs.org/en/

​ Node中文官网(民间网):http://nodejs.cn

2.Node可以做什么?

2.1 开发桌面应用程序

​ 例如QQ,微信… 经常用的VScode就是用node开发的

2.2 开发服务器应用程序

结构1:微型结构

​ Node服务器要完成请求的处理、响应、和数据库交互、各种业务逻辑

​ 这种结构通常应用在微型的站点上。例如:个人博客、公司官网

结构2:大型结构

​ 这种结构非常常见,应用在各种规模的站点上

Node服务器

​ 不做任何与业务逻辑有关的事情。绝大部分时候,只是简单的转发请求。但可能会有一些额外的功能

​ 1.简单的信息记录:请求日志、用户偏好、广告信息

​ 2.静态资源托管

​ 3.缓存

后端服务器

​ 处理大型的业务逻辑

3.为什么要学习NodeJS?

​ 1. JS开发省时,省力

​ 2. 因为nodeJS是单线程,没有线程切换的损耗,没有线程之间的竞争。

​ 3. IO处理非常快

​ 4. node不适合处理复杂运算,例如java可以开多线程进行并行运算

​ 其他服务端语言(例如java,.net)能做的事情,node全部都能做。语言没有好坏之分,只有场景的适合。

​ node开发者就是为了寻找快速的IO处理的语言,所以选择了JavaScript

4.全局对象

global

​ 跟浏览器环境中的this相同,表示顶级对象

​ 注意:浏览器的全局环境this表示window,node中this不是表示global

// 全局对象
console.log(global)
console.log(this)//在node中的this不指向window,就是一个空对象

var a = 123;
console.log(global.a == a)//在node中变量声明不提升至global中
console.log(a)

1.setTimeout,setInterval

​ 用法跟浏览器环境完全相同。

​ 注意:浏览器返回的是ID,node环境中返回的是对象

2.setImmediate

​ 类似于 setTimeout 0

setInterval(()=>{
    console.log(123)
},1000)

setTimeout(() => {
    console.log("延时定时器")
},0);


setImmediate(()=>{
    console.log("qwe")
},0)

3.console

​ 浏览器在控制台输出

​ node在命令行输出

4.__dirname*

console.log(__dirname)

​ 获取当前模块所在的目录

注意:并非global属性

5.__filename*


console.log(__filename)

​ 获取当前模块的文件路径

注意:并非global属性

6.Buffer

buffer类似于数组,是一种数据的传输格式,16进制的数字
和字符串的区别:
字符串只读,并且对字符串进行修改可以得到一个新的字符串,原字符串保持原样
buffer内存分配不在v8的堆内存中,在node中c++层面实现单独内存的申请
​ 类型化数组

​ 继承自 UInt8Array

​ 计算机中存储的基本单位:字节

​ 使用时、输出时可能需要用十六进制表示

7.process

cwd()

​ 返回当前nodejs进程的工作目录,运行的cmd窗口的目录

exit()*

​ 强制退出当前node进程

​ 可传入退出码,0表示成功退出,默认为0,主要是为了输入到日志里面的

argv*

​ 获取命令中的所有参数

platform

​ 获取当前的平台系统

kill(pid)

​ 根据进程ID杀死进程

env

​ 获取环境变量对象

5.Node模块化

1.模块的查找

1. 相对路径

2.1 加 ./ 情况

​ 在服务端,一定要加./,表示从当前目录开始

2.2 不加./情况

​ ①检查是否是内置模块,如:fs、path等

​ ②检查当前目录中的node_modules

​ ③检查上级目录中的node_modules

3.后缀名

​ 如果不提供后缀名,自动补全

​ 补全顺序为:js,json,node,mjs

4.文件名

​ 如果仅提供目录,不提供文件名,则自动寻找该目录中的index.js

5.运行node ./

​ package.json中的main字段,默认值为index.js

2.module对象

​ 记录当前模块的信息

3.require函数

​ resolve函数 拼接成一个绝对路径

4.模块化原理

​ 当执行一个模块或使用require时,会将模块放置在一个函数环境中

6.基本内置模块

(在下载号node之后,自动帮你封装好的模块)

1.os

​ 参考地址:https://nodejs.org/dist/latest-v12.x/docs/api/os.html

1.EOL

​ 操作系统版本

2.arch()

​ 操作系统CPU体系结构

3.cpus()

​ CPU内核的信息

4.freemem()

​ 电脑剩余多少内存,返回为字节

5.homedir()

​ 用户目录

6.hostname()

​ 主机名

7.tmpdir()

​ 获取临时文件目录

2.path

​ 参考地址:https://nodejs.org/dist/latest-v12.x/docs/api/path.html

注意:path模块操作全部相当于字符串操作,并不会判断路径是否真实存在

1.basename

​ 获取某段路径的最后一个 / 后面的内容

​ 第二个参数为可选参数,如果匹配,去掉匹配内容

2.sep

​ 操作系统的分隔符

3.delimiter

​ 输出当前操作系统的分隔符

4.dirname

​ 获取路径的目录

5.extname

​ 获取路径的后缀名

6.join

​ 拼接路径,会根据操作系统拼接

7.normalize

​ 根据操作系统规范路径

8.relative

​ 换成相对路径的格式

9.resolve*

​ 转换成绝对路径,根据cmd窗口来拼接

注意:相对于命令行工具,一般使用配合__dirname使用

3.url

​ 参考地址:https://nodejs.org/dist/latest-v12.x/docs/api/url.html

1.parse()*

​ 字符串转换成对象

2.format()

​ 对象转换成字符串

4.util

​ 参考地址:https://nodejs.org/dist/latest-v12.x/docs/api/util.html

1.callbackify

​ 异步函数转换成callback形式

2.promisify

​ callback形式转换成异步函数

3.isDeepStrictEqual

​ 两个对象深度比较

7.文件I/O

1. I/O:input output

​ 对外部设备(磁盘、网卡、显卡、打印机…)的输入输出

​ IO的速度往往低于内存和CPU的交互速度

2.fs模块

​ 参考地址:https://nodejs.org/dist/latest-v12.x/docs/api/fs.html

1. fs.readFile

​ 读取一个文件

2. fs.writeFile

​ 向文件写入内容

文件名不存在会新建,目录不存在报错

3.fs.stat

​ 获取文件或目录信息

1.size

​ 占用字节

2.atime

​ 上次访问时间

3.mtime

​ 上次文件内容被修改时间

4.ctime

​ 上次文件状态被修改时间

5.birthtime

​ 文件创建时间

6.isDirectory()

​ 判断是否是目录

7.isFile()

​ 判断是否是文件

4.fs.readdir

​ 获取目录中的文件和子目录

5.fs.mkdir

​ 创建目录

6.fs.exists

​ 判断文件或目录是否存在

八.前端面试题(一)

1、用setTimeout实现setInterval

function mySetTimout(fn, delay) {
    let timer = null
    const interval = () => {
        fn()
        timer = setTimeout(interval, delay)
    }
    setTimeout(interval, delay)
  
}

// 测试
const { cancel } = mySetTimout(() => console.log(888), 1000)


2.用setInterval实现setTimeout

function mySetInterval(fn, delay) {
            const timer = setInterval(() => {
                fn()
                // clearTimeout(timer)
                clearInterval(timer)
            }, delay)
        }

        // 测试
        mySetInterval(() => console.log(888), 1000)

猜你喜欢

转载自blog.csdn.net/qq_45256777/article/details/120960122