一篇文章 从入门 到 我是Node.js 高手 😎
Node.js是一个基于Chrome V8 JavaScript引擎的开源、跨平台运行时环境,它允许开发者使用JavaScript编写服务器端代码。自从2009年发布以来,Node.js因其非阻塞、事件驱动的架构在开发高性能网络应用中变得非常受欢迎。 它不仅可以在浏览器中运行JavaScript,还可以在服务器端运行,使得JavaScript不仅仅局限于前端开发,还可以与后端关联,扩大了js的使用范围。Node.js也是后端技术,主要用于与服务器通信和与操作系统交互。
Node.js的基本概念
Node.js是什么
- JavaScript运行环境:Node.js基于Chrome V8引擎,能够在服务器端执行JavaScript代码。
- 后端技术:Node.js用于开发服务器端应用,与服务器和操作系统进行交互。
- JavaScript执行器:Node.js提供了许多可以与操作系统交互的模块,并支持JavaScript进行调用。
为什么选择Node.js?
-
单一编程语言:前端和后端都使用JavaScript,使得全栈开发更加简单。
-
高性能:基于V8引擎,执行速度快。
-
事件驱动:非阻塞I/O模型,非常适合处理高并发。
-
丰富的包生态系统:通过npm,可以轻松找到和使用大量现成的模块和包。
安装 nvm
以及 Node.js
安装
作为一名前端开发者,不建议就直接先去安装一个 Node.js ,对后期 Node 版本管理,以及多版本 Node 的切换使用会十分麻烦。在这里优先推荐去安装一个 nvm
。
Node Version Manager (nvm) 是一个用于管理多个Node.js版本的工具。使用nvm,可以轻松地在不同版本的Node.js之间切换。
注:如果在安装nvm前已经安装了node,建议先将原来的node进行卸载或删除
下载并安装nvm,下载地址:github.com/coreybutler…,下载.zip后缀的这个文件,下载后解压安装即可
然后查看安装的版本号,检查安装是否成功,在命令行直接敲:nvm
接着使用nvm安装多版本Node.js
首先查看所有可安装的版本
nvm list available
然后选择你要安装的版本(建议安装稳定版本
LTS
那一列)
nvm install 20.16.0
使用指定版本或切换到指定版本
nvm use 20.16.0
查看当前版本信息
node -v (查看当前版本)
nvm list (查看已安装的所有nodejs版本)
有*的是当前使用的版本。
到现在 nvm
和 Node.js
便已经安装好了。
Node.js 项目启动
首先,在控制台打印一个最基础的 hello world
index.js
const str = 'hello world'
console.log(str)
然后在控制台输入
node index.js
原本js文件要在浏览器才能运行,但是有了node后,js也能去调用系统以及服务器端去实现一些后端的功能!
Node.js 重要的全局对象
本文我们仅介绍几种常见的全局对象,如果想要深入学习可以参考首页 | Node.js v20 文档 (nodejs.cn)
Process
process
是Node.js中的一个全局对象,它提供了有关当前Node.js进程的信息和控制。
process
对象包含多个属性和方法,用于访问和控制Node.js进程的运行状态。可以获取进程的ID、环境变量、当前工作目录等。
Process的应用场景
- 获取进程信息,如进程ID和内存使用情况。
- 处理命令行参数。
- 控制进程退出和处理退出事件。
// 打印进程ID和Node.js版本
console.log(`Process ID: ${process.pid}`);
console.log(`Node.js version: ${process.version}`);
// 获取并打印环境变量
console.log(`Environment Variables: ${JSON.stringify(process.env)}`);
// 捕获并处理未捕获的异常
process.on('uncaughtException', (err) => {
console.error('There was an uncaught error', err);
process.exit(1); // 非零退出码表示失败
});
这便都打印出来了!
Global对象
global
是Node.js中的一个全局对象,可以在任何地方访问。它相当于浏览器中的window
对象。
global
对象包含了许多全局变量,如process
、Buffer
、setTimeout
等。可以在任何地方访问这些变量和函数,而不需要require
它们。可以说是最大的全局对象了。
Global的应用场景
- 定义全局变量和函数。
- 访问Node.js提供的全局API。
通过下面的示例
// 定义一个全局变量
global.myVariable = 'Hello, Global!';
console.log(global.myVariable); // 输出: Hello, Global!
// 访问全局函数
global.setTimeout(() => {
console.log('This message is displayed after 1 second');
}, 1000);
require和module对象
require
函数用于引入模块,而module
对象表示当前模块。每个模块都有一个独立的module
对象。
require
用于引入其他模块,并返回模块的导出对象。而 module
对象用于定义当前模块的导出内容。也就是说,module
抛出的就是由 require
给引入,和 Vue 使用的 ES6 语法的 import
和 export
差不多。
我们用两个文件来作为示例
math.js
function add(a, b) {
return a + b;
}
module.exports = { add };
index.js
const math = require('./math');
console.log(math.add(2, 3));
可以看到成功引入了在
math.js
文件定义的函数。可以说 require
和 module
是Node生态最重要的一部分,下文还将详细说明。
Node.js 模块化
模块化是指将一个大的程序拆分成多个小的模块,每个模块都是独立的,并且可以被其他模块引用。Node.js中主要有两种模块化语法:CommonJS和ES6模块。
- CommonJS:Node.js最初的模块系统,使用
require
导入和module.exports
导出。math.js
function add(a, b) {
return a + b;
}
module.exports = { add };
index.js
const math = require('./math');
console.log(math.add(2, 3)); // 输出: 5
- ES6模块:ECMAScript 2015标准引入的模块系统,使用
import
和export
语法。这也是我们使用Vue
经常会用到的但切记在使用Node
的时候不要搞混了需要在package.json
中设置"type": "module"。math.js
export function add(a, b) {
return a + b;
}
index.js
import { add } from './math.mjs';
console.log(add(2, 3)); // 输出: 5
使用模块化可以更好组织和管理代码、提高程序的可维护性和可扩展性、复用代码等。
Node.js 模块
模块是Node.js程序的基本组成部分。每个文件都是一个模块,具有自己的作用域。Node.js中有三种类型的模块:
- 核心模块:Node.js内置的模块,如
fs
、http
。 - 文件模块:用户创建的模块,通过相对路径或绝对路径引入。
- 第三方模块:通过npm安装的模块。
模块的使用
-
核心模块:直接引入,无需安装。
-
文件模块:通过相对路径或绝对路径引入。
-
第三方模块:先通过npm安装,再通过模块名称引入。
核心模块
Node
的核心模块有20多种,这里简单介绍一下fs
模块和 http
模块。
fs
模块是Node.js内置的文件系统模块,fs
模块允许我们读取、写入、删除和操作文件及目录。它提供了同步和异步两种API,分别用于阻塞和非阻塞操作。读取文件内容、写入文件、删除文件、操作目录。
http
模块是Node.js内置的模块,用于创建HTTP服务器和客户端。它提供了HTTP服务器和客户端的基本功能,使我们能够处理HTTP请求和响应。
http
模块通过创建服务器对象,可以监听特定的端口和处理HTTP请求。我们可以定义请求处理函数来处理客户端的请求,并返回相应的响应。
HTTP模块的应用场景:
- 创建Web服务器。
- 处理HTTP请求和响应。
- 构建API服务。
以这个示例
index.js
const http = require('http'); // 引入http模块
const fs = require('fs); //引入fs模块
// 创建HTTP服务器
http.createServer((req, res) => {
if (req.url === '/index') {
const content = fs.readFileSync('./index.html', { encoding: 'utf-8' }); // 读取文件内容
console.log(content); // 输出文件内容到控制台
res.end(content); // 发送响应数据
} else {
res.end('hello world'); // 默认响应
}
}).listen(3000); // 服务器监听端口3000
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>你好世界</h2>
</body>
</html>
我们便将后端的数据以响应方式输送到前端渲染。
第三方模块
我们可以去npm
官网去查询大佬写的第三方模块。npm | Home (npmjs.com)
直接去搜索需要引入的模块
这里我以
lodash
模块为例子介绍。
进入到模块的详情页面。
这是如何用npm
安装这个模块
这部分是这个模块的git地址和官网
通过阅读官方文档,我们可以得知Lodash是一个功能强大的JavaScript实用工具库,提供了一系列实用函数,用于数组、对象、字符串、数值等数据类型的处理。
我们先安装依赖
npm i lodash
index.js
const _ = require('lodash');
const array = [1, 2, 3, 4, 5];
const reversedArray = _.reverse(array.slice());
console.log(reversedArray); // 输出: [5, 4, 3, 2, 1]
可以看到真的将数组反转了!
如果以后学有所成也可以将自己写的模块分享在 npm
社区。
总结
在本篇文章中,我们从如何配置Node.js
环境、nvm
安装、npm
使用,到入门的Node.js
的基本概念,
再到Node.js
的应用场景原理,再进阶到最重要的模块化和模块,最后还聊了引入第三方模块的拓展。通过这些示例,我们不仅掌握了Node.js核心模块的使用,还了解了如何通过第三方模块进一步提升开发效率和代码质量。希望这篇文章能够帮助你更好地理解和应用Node.js,在实际项目中高效地进行全栈开发。如果文章对你有帮助,可以给点个赞哦😊!
转载自:https://juejin.cn/post/7397616334653685798