Nodejs学习开端篇

222 阅读8分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

前言

以前总是对学习全栈开发嗤之以鼻,觉得做前端就学好前端就ok,毕竟术业有专攻,况且前端的技术内容繁杂且日新月异,但今时不同往日现在觉得以前的自己还是太年轻,以前的想法被完全颠覆了。如今大前端、低代码、微前端、Serverless等众多技术思想如雨后春笋般涌出,前端发展大好,想要更好的做好前端,学习全栈开发只会锦上添花。最重要的是不再依赖于后端小伙伴,可以自由地调试实践,把自己的想法变成现实或者一个完整的产品(这会是一件有趣的事情),那么就现在从学习 Nodejs 开始吧,再出发🏄

开篇

浏览器中javascript包括:JS核心语法WEBAPI1643355178(1).png

Javascript为什么可以在浏览器中被执行?

浏览器中有Javascript解析引擎专门用来解析执行javascript代码。不同的浏览器使用不同的Javascript解析引擎,Chrome浏览器使用V8解析引擎,FireFox使用OdinMonkey,Safri使用JSCore,IE使用Chakra等等,其中Chrome浏览器的V8引擎性能最好。

为什么Javascript可以操作DOM和BOM?

每个浏览器都内置了DOM、BOM的API函数,因此浏览器中的js才可以调用它们。 image.png 浏览器中的Javascript运行环境 运行环境是指代码正常运行所需的必要环境,包括V8引擎和内置API。 以chrome浏览器为例: image.png

总结:

  1. V8引擎负责解析和执行JS代码。
  2. 内置API是由运行环境提供的特殊接口,只能在所运行环境中被调用。

Javascript可以做后端开发吗?

是的,可以。常见的后端开发语言有JAVA、Python、PHP,而我们知道JS在前端是运行在浏览器中的,但是如果做后端开发它的运行环境是什么呢? 这时候大名鼎鼎的Nodejs就闪亮登场啦。

了解node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。

Nodejs 最擅长的是处理高并发,在 JAVA、PHP 等服务的语言中会为每个客户端连接创建一个新的线程,而每个线程需要耗费大约 2MB 内存,那么理论上一个 8GB 的服务器可同时连接的最大用户数为 4000 个左右,要让 web 应用程序服务更多的用户需要增加服务器的数量,那么 web 应用程序的硬件成本也会随之增加。Nodejs 不是为每个客户端连接创建一个新的线程,而仅仅使用一个线程,当有用户连接时就触发一个内部事件通过非阻塞 I/O、事件驱动机制让 Nodejs 程序宏观上并行,使用 Nodejs,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。

Nodejs中的Javascript运行环境 image.png

注意:

  1. 浏览器是JS的前端运行环境,
  2. Nodejs是JS的后端运行环境,
  3. Nodejs是独立的运行环境,Nodejs中无法调用DOM和BOM等浏览器内置API。

Nodejs作为js的运行环境,仅仅提供了基础的功能和API,然而基于Nodejs提供的这些基础功能,很多强大的工具和框架如雨后春笋层出不穷,那么Nodejs可以做哪些事情呢?

对于前端开发者来说有了js的功底,学习nodejs的成本相对较低。借鉴js的学习路径JS基础语法 ---> 浏览器内置API(DOM、BOM)---> 第三方库/框架(JQuery、vue、React等)。那么Nodejs的学习路径大致如下:JS基础语法 ---> Nodejs内置API模块(fs、path、http等)---> 第三方API模块(express、egg、mysql等)。

安装&第一个Node程序

建议下载安装稳定版,LTS为长期维护版,Current为最新尝鲜版(含最新功能,不推荐企业级项目使用)。 更多关于Nodejs安装和配置...

node -v // 查看Nodejs版本号

在Nodejs环境中执行js代码

// D:lemon/Node/website/hello.js (后面的文件也都以此为目录D:lemon/Node/website)
console.log('Hello Nodejs!')

在app.js文件所在目录打开终端执行:node hello.js image.png

终端快捷键:

  1. tab键快速补全路径
  2. esc键快速清空当前已输入命令
  3. 输入cls可以情况终端面板

Nodejs模块

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。一个.js文件就称之为一个模块(module)。

使用模块的好处: 最大的好处是大大提高了代码的可维护性。 避免函数名和变量名冲突。 引入模块: 我们有了一个hello.js

// hello.js
function greet(name) {
    console.log('Hello, ' + name + '!');
}

module.exports = greet;

再创建一个app.js

// 引入hello模块:
const greet = require('./hello');

const friend = 'Lemon';
greet(friend); // Hello, Lemon!

执行node app.js

image.png

在使用require()引入模块的时候,请注意模块的相对路径。这种模块加载机制被称为CommonJS规范。在这个规范下,每个.js文件都是一个模块,它们内部各自使用的变量名和函数名都互不冲突。

fs文件系统模块

Node.js内置的fs模块就是文件系统模块,负责读写文件。 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法。例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。 建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。 注意:注释代码也会被读取到。

异步读取文件

fs.readFile(filename[, options], callback)

参数说明:

  • 参数1,path:必选参数,字符串,表示文件路径
  • 参数2,options:可选参数,字符串,表示已什么编码格式读取文件
  • 参数3,callback:必选参数,回调函数,文件读取完成后,通过回调函数拿到读取的结果。callback,Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。

以utf-8的编码格式读取指定文本文件的内容:

// fs.js
const fs = require('fs');
// demo.txt在当前目录且文件编码是utf-8

fs.readFile('demo.txt', 'utf-8', function (err, data) {
    if (err) {
      return console.log(err);
    } 
    console.log(data);
});

同级目录创建demo.txt内容如图: image.png

执行node fs.js打印结果如下:

image.png

读取二进制文件流:

// 读取二进制文件
fs.readFile('01.png', function (err, data) {
  if (err) {
    return console.log(err)
  }
  console.log(data)
  // Buffer -> String
  var text = data.toString('utf-8')
  // console.log(text)
  // String -> Buffer
  var buf = Buffer.from(text, 'utf-8')
  console.log(buf)
  
})

执行:node fs.js终端打印结果如下: image.png

同步读取文件

fs.readFileSync(path[, options])

同步读取的函数和异步函数相比,多了一个Sync后缀,并且不接收回调函数,函数直接返回结果。

// fs.js
/*同步读取*/
var data = fs.readFileSync('demo.txt')
console.log('同步读取: ' + data.toString())
console.log('--程序执行完毕--')

以上代码执行结果如下:

image.png

写文件

fs.writeFile(filename, data[, options], callback)

如果文件存在,该方法写入的内容会覆盖旧的文件内容。 参数说明: file - 必选参数,指定一个文件路径的字符串,表示文件的存放路径(如果是文件名,表示是当前路径)。 data - 必选参数,要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。 options - 可选参数,表示以什么格式写入文件内容,该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w' callback - 必选参数,写入文件后的回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

// write-file.js
const fs = require('fs')

fs.writeFile('demo1.txt', '123123', (err) => {
  if (err) {
    return console.log(err)
  }
  console.log('写入成功!')
})

若当前目录不存在要写入的文件,将创建文件并写入内容;若写入一个不存在的盘,将写入失败。 以上代码执行结果: image.png 注意:在使用fs模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的路径,注意路径的动态拼接。代码运行时会以执行node命令时所处的目录动态拼接出被操作文件的完整路径,或者可以直接使用绝对路径,这时可以使用__dirname(表示当前文件所处目录)

fs.readFile(__dirname + '/demo.txt', 'utf-8', function (err, data) {
  if (err) {
    return console.log(err)
  }
  console.log('异步读取: ' + data)
})

最后

如果对你有所帮助的话,帮忙点赞呀👍,你的阅读和点赞带给我莫大的鼓励,感谢、加油💪

参考:www.liaoxuefeng.com/wiki/102291…www.runoob.com/nodejs/node…

如果有错别字或者不对的地方欢迎指出,将在第一时间改正,有更好的实现或想法希望留下你的评论 🔥