「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
前言
以前总是对学习全栈开发嗤之以鼻,觉得做前端就学好前端就ok,毕竟术业有专攻,况且前端的技术内容繁杂且日新月异,但今时不同往日现在觉得以前的自己还是太年轻,以前的想法被完全颠覆了。如今大前端、低代码、微前端、Serverless等众多技术思想如雨后春笋般涌出,前端发展大好,想要更好的做好前端,学习全栈开发只会锦上添花。最重要的是不再依赖于后端小伙伴,可以自由地调试实践,把自己的想法变成现实或者一个完整的产品(这会是一件有趣的事情),那么就现在从学习 Nodejs 开始吧,再出发🏄
开篇
浏览器中javascript包括:JS核心语法和WEBAPI。
Javascript为什么可以在浏览器中被执行?
浏览器中有Javascript解析引擎专门用来解析执行javascript代码。不同的浏览器使用不同的Javascript解析引擎,Chrome浏览器使用V8解析引擎,FireFox使用OdinMonkey,Safri使用JSCore,IE使用Chakra等等,其中Chrome浏览器的V8引擎性能最好。
为什么Javascript可以操作DOM和BOM?
每个浏览器都内置了DOM、BOM的API函数,因此浏览器中的js才可以调用它们。
浏览器中的Javascript运行环境
运行环境是指代码正常运行所需的必要环境,包括V8引擎和内置API。
以chrome浏览器为例:
总结:
- V8引擎负责解析和执行JS代码。
- 内置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运行环境
注意:
- 浏览器是JS的前端运行环境,
- Nodejs是JS的后端运行环境,
- Nodejs是独立的运行环境,Nodejs中无法调用DOM和BOM等浏览器内置API。
Nodejs作为js的运行环境,仅仅提供了基础的功能和API,然而基于Nodejs提供的这些基础功能,很多强大的工具和框架如雨后春笋层出不穷,那么Nodejs可以做哪些事情呢?
- 基于express框架快速构建web应用
- 基于Electron框架可构建跨平台桌面应用
- 基于restify框架可快速构架API接口项目
- ......
对于前端开发者来说有了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
终端快捷键:
tab键快速补全路径esc键快速清空当前已输入命令- 输入
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
在使用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内容如图:
执行node fs.js打印结果如下:
读取二进制文件流:
// 读取二进制文件
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终端打印结果如下:
同步读取文件
fs.readFileSync(path[, options])
同步读取的函数和异步函数相比,多了一个Sync后缀,并且不接收回调函数,函数直接返回结果。
// fs.js
/*同步读取*/
var data = fs.readFileSync('demo.txt')
console.log('同步读取: ' + data.toString())
console.log('--程序执行完毕--')
以上代码执行结果如下:
写文件
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('写入成功!')
})
若当前目录不存在要写入的文件,将创建文件并写入内容;若写入一个不存在的盘,将写入失败。
以上代码执行结果:
注意:在使用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…
如果有错别字或者不对的地方欢迎指出,将在第一时间改正,有更好的实现或想法希望留下你的评论 🔥