《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》
”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “
什么是 Node.js?
Node.js是一个跨平台JS运行环境,使开发者可以搭建服务器端的JS应用程序
作用:使用 Node.js 编写服务器端程序
✓ 编写数据接口,提供网页资源浏览功能等等
✓ 前端工程化:为后续学习 Vue 和 React 等框架做铺垫
什么是前端工程化?
前端工程化:开发项目直到上线,过程中集成的所有工具和技术
Node.js 是前端工程化的基础(因为 Node.js 可以主动读取前端代码内容)

Node.js 为何能执行 JS?
首先:浏览器能执行 JS 代码,依靠的是内核中的 V8 引擎(C++ 程序)
其次:Node.js 是基于 Chrome V8 引擎进行封装(运行环境)
区别:都支持 ECMAScript 标准语法,Node.js 有独立的 API

注意:Node.js 环境没有 DOM 和 BOM 等
使用 Node.js
需求:新建 JS 文件,并编写代码后,在 node 环境下执行。

模块:类似插件,封装了方法/属性
fs 模块 - 读写文件
fs 模块是 Node.js 中用于与文件系统交互的核心模块。它提供了同步和异步的 API,用于执行文件操作,如读取、写入、删除、重命名文件等。
语法

(1)读取文件
异步读取
fs.readFile('file.txt', 'utf8', (err, data) => {if (err) {console.error('读取文件失败:', err);return;}console.log('文件内容:', data);
});
同步读取
try {const data = fs.readFileSync('file.txt', 'utf8');console.log('文件内容:', data);
} catch (err) {console.error('读取文件失败:', err);
}
(2)写入文件
异步写入
fs.writeFile('file.txt', 'Hello, Node.js!', 'utf8', (err) => {if (err) {console.error('写入文件失败:', err);return;}console.log('文件写入成功');
});
同步写入
try {fs.writeFileSync('file.txt', 'Hello, Node.js!', 'utf8');console.log('文件写入成功');
} catch (err) {console.error('写入文件失败:', err);
}
(3)追加内容
异步追加
fs.appendFile('file.txt', '\n追加内容', 'utf8', (err) => {if (err) {console.error('追加内容失败:', err);return;}console.log('内容追加成功');
});
同步追加
try {fs.appendFileSync('file.txt', '\n追加内容', 'utf8');console.log('内容追加成功');
} catch (err) {console.error('追加内容失败:', err);
}
(4)删除文件
异步删除
fs.unlink('file.txt', (err) => {if (err) {console.error('删除文件失败:', err);return;}console.log('文件删除成功');
});
同步删除
try {fs.unlinkSync('file.txt');console.log('文件删除成功');
} catch (err) {console.error('删除文件失败:', err);
}
path模块-路径处理
Node.js 代码中,相对路径是根据终端所在路径来查找的,可能无法找到你想要的文件。
path 模块是 Node.js 中用于处理文件路径的核心模块。它提供了一系列工具函数,用于解析、拼接、规范化文件路径,以及提取路径中的信息(如文件名、扩展名等)。
所以,在 Node.js 代码中,使用绝对路径更好。
路径拼接:path.join()
将多个路径片段拼接成一个完整的路径,自动处理路径分隔符。
__dirname 内置变量(获取当前模块目录-绝对路径)
const fullPath = path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
console.log(fullPath); // 输出: /foo/bar/baz/asdf
http模块
http 模块是 Node.js 中用于创建 HTTP 服务器和客户端的核心模块。它提供了构建 Web 服务器、处理 HTTP 请求和响应的功能。以下是 http 模块的详细介绍和常见用法:
1. 引入 http 模块
在 Node.js 中,使用 require 引入 http 模块:
const http = require('http');
2. 创建 HTTP 服务器
使用 http.createServer() 方法创建一个 HTTP 服务器。
示例:创建一个简单的 HTTP 服务器
const server = http.createServer((req, res) => {res.statusCode = 200; // 设置状态码res.setHeader('Content-Type', 'text/plain'); // 设置响应头res.end('Hello, World!\n'); // 发送响应内容
});server.listen(3000, '127.0.0.1', () => {console.log('服务器运行在 http://127.0.0.1:3000/');
});
-
req:请求对象,包含客户端请求的信息(如 URL、请求头、请求方法等)。 -
res:响应对象,用于向客户端发送响应。
3. 处理请求
(1)获取请求方法
const method = req.method; // 获取请求方法(GET、POST 等)
(2)获取请求 URL
const url = req.url; // 获取请求的 URL
(3)获取请求头
const headers = req.headers; // 获取请求头
(4)获取请求体(POST 请求)
let body = '';
req.on('data', (chunk) => {body += chunk; // 接收数据块
});
req.on('end', () => {console.log('请求体:', body); // 请求体接收完成
});
4. 发送响应
(1)设置状态码
res.statusCode = 200; // 设置状态码为 200
(2)设置响应头
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
(3)发送响应内容
res.end('Hello, World!\n'); // 发送响应内容并结束响应
5. 处理路由
根据请求的 URL 和方法处理不同的路由。
示例:处理 GET 和 POST 请求
const server = http.createServer((req, res) => {if (req.url === '/' && req.method === 'GET') {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('这是首页\n');} else if (req.url === '/submit' && req.method === 'POST') {let body = '';req.on('data', (chunk) => {body += chunk;});req.on('end', () => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end(`收到的数据: ${body}\n`);});} else {res.statusCode = 404;res.setHeader('Content-Type', 'text/plain');res.end('页面未找到\n');}
});server.listen(3000, '127.0.0.1', () => {console.log('服务器运行在 http://127.0.0.1:3000/');
});
6. 创建 HTTP 客户端
使用 http.request() 或 http.get() 方法创建 HTTP 客户端,发送请求到其他服务器。
示例:发送 GET 请求
const options = {hostname: 'www.example.com',port: 80,path: '/',method: 'GET'
};const req = http.request(options, (res) => {let data = '';res.on('data', (chunk) => {data += chunk;});res.on('end', () => {console.log('响应内容:', data);});
});req.on('error', (err) => {console.error('请求失败:', err);
});req.end(); // 发送请求
简化版 GET 请求
http.get('http://www.example.com/', (res) => {let data = '';res.on('data', (chunk) => {data += chunk;});res.on('end', () => {console.log('响应内容:', data);});
}).on('error', (err) => {console.error('请求失败:', err);
});
7. 处理 HTTPS
Node.js 还提供了 https 模块,用于处理 HTTPS 请求。用法与 http 模块类似。
示例:创建 HTTPS 服务器
const https = require('https');
const fs = require('fs');const options = {key: fs.readFileSync('key.pem'),cert: fs.readFileSync('cert.pem')
};https.createServer(options, (req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello, HTTPS!\n');
}).listen(443, () => {console.log('HTTPS 服务器运行在 https://localhost:443/');
});
Node.js模块化
什么是模块化?

概念:项目是由很多个模块文件组成的
好处:提高代码复用性,按需加载,独立作用域
使用:需要标准语法导出和导入进行使用

CommonJS 标准
在 Node.js 中,CommonJS 规范被广泛采用,例如:
-
使用
require()函数来导入模块。 -
使用
module.exports或exports来导出模块。 -
使用
global对象来访问全局变量。
示例:
// file: math.js
function add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}module.exports = { add, subtract };
// file: app.js
const math = require('./math');const result = math.add(5, 3);
console.log(result); // 输出: 8
ECMAScript 标准(ES6)
默认标准使用:
1. 导出:export default {}
2. 导入:import 变量名 from '模块名或路径'
// math.js
export function add(a, b) {return a + b;
}// app.js
import { add } from './math.js';
console.log(add(5, 10)); // 输出: 15
注意:Node.js 默认支持 CommonJS 标准语法
如需使用 ECMAScript 标准语法,在运行模块所在文件夹新建 package.json 文件,并设置 { "type" : "module" }
包
1. 包的概念
包通常是一个包含 代码、元数据(如 package.json)、依赖项和脚本 的集合,旨在实现某些功能并可以被其他项目或开发者复用。JavaScript 包通常托管在 npm(Node Package Manager) 或 yarn 等包管理器中。
2. 包的结构
一个标准的 npm 包通常包含以下文件:
package.json:包的描述文件,包含 名称、版本、依赖项、脚本、作者信息 等。index.js(或main指向的入口文件):包的主要代码文件。node_modules/:存放安装的依赖包(通常不手动修改)。README.md:包的说明文档。.gitignore:用于 Git 版本控制,忽略不必要的文件。LICENSE:许可证信息(可选)。
3. 如何管理包
(1)安装包
在项目中使用 npm 或 yarn 安装包:
# 使用 npm 安装包
npm install package-name# 使用 yarn 安装包
yarn add package-name
(2)全局安装包
如果想要在整个系统中可用,可以使用 -g(全局安装):
npm install -g package-name
(3)卸载包
npm uninstall package-name
(4)更新包
npm update package-name
4. 如何创建自己的包
如果你想发布自己的 npm 包,可以按照以下步骤:
(1)初始化包
在项目目录下运行:
npm init
然后按照提示填写 包名、版本号、入口文件、作者信息 等。
(2)编写代码
创建 index.js,例如:
module.exports = function() {console.log("Hello from my package!");
};
(3)发布到 npm
首先,登录 npm
npm login
然后发布包:
npm publish
5. 包的作用
- 代码复用:将通用功能封装成包,提高开发效率。
- 模块化管理:减少代码耦合,使项目结构更清晰。
- 社区共享:可以使用开源社区提供的高质量库,而不需要自己从零开始写代码。
相关文章:
《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》
”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “ 什么是 Node.js? Node.js是一个跨平台JS运行环境,使开发者可以搭建服务器端的JS应用程序 作用:使用 Node.js 编写服务器端程序…...
【Java代码审计 | 第八篇】文件操作漏洞成因及防范
未经许可,不得转载。 文章目录 文件操作漏洞文件读取漏洞基于 InputStream 的读取基于 FileReader 的读取 文件下载漏洞文件删除漏洞防范 文件操作漏洞 分为文件读取漏洞、文件下载漏洞与文件删除漏洞。 文件读取漏洞 在Java中,文件读取通常有两种常见…...
在Linux开发板中使用.NET实现音频开发
本文将以Linux开发板为基础,使用ALSA音频框架和C#语言,演示如何实现基础的音频录制与播放功能。 1. 背景 音频处理是嵌入式开发中常见的需求,无论是语音交互、环境监测还是多媒体应用都离不开音频模块的支持。在Linux系统中,ALSA…...
SQL Server核心知识总结
SQL Server核心知识总结 🎯 本文总结了SQL Server核心知识点,每个主题都提供实际可运行的示例代码。 一、SQL Server基础精要 1. 数据库核心操作 -- 1. 创建数据库(核心配置) CREATE DATABASE 学生管理系统 ON PRIMARY (NAME 学生管理系统…...
基于RNN+微信小程序+Flask的古诗词生成应用
项目介绍 平台采用B/S结构,后端采用主流的Flask框架进行开发,古诗词生成采用RNN模型进行生成,客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能(RNN)等多个领域的综合性应用,是课…...
基于单片机的智慧农业大棚系统(论文+源码)
1系统整体设计 经过上述的方案分析,采用STM32单片机为核心,结合串口通信模块,温湿度传感器,光照传感器,土壤湿度传感器,LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测,土壤…...
【AGI】智谱开源2025:一场AI技术民主化的革命正在到来
智谱开源2025:一场AI技术民主化的革命正在到来 引言:开源,一场技术平权的革命一、CogView4:中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM:人机交互的范式跃迁1. 自然语言驱动的跨…...
2025-03-08 学习记录--C/C++-PTA 习题8-9 分类统计各类字符个数
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h> #define MAXS 15void StringCount( …...
yolov8改进|MobileNetV4替换Backbone,轻量化!!
yolov8改进|MobileNetV4替换Backbone,轻量化!! 一级目录二级目录三级目录MobileNetV4简介论文地址核心代码将核心代码放入`ultralytics/nn/modules`中,新建MobileNetV4.py修改`tasks.py``ultralytics/utils/torch_utils.py`中yaml文件一级目录 二级目录 三级目录 各位哥哥…...
OTP单片机调试工具
大部分的OTP单片机开发流程是先用仿真器进行仿真,f仿真完成之后再烧录OTP单片机芯片进行验证,但是很多少时候会发现有一个问题,仿真器仿真都是OK的,但是一旦焊接在板上了,就往往发现有问题,因为硬件条件变化…...
二次SQL注入
原理 用户向数据库存入恶意数据,当数据被送进数据库的时候,会对存入的信息进行转义然后再储存,但是存进去的数据会再次被转义回来(也就是原样不变的存进数据库里,只是害怕攻击者在存入数据的时候捣蛋而已)…...
机器学习:愚者未完成的诗篇(零)
当算法在数据海洋中打捞支离破碎的韵律时,机器学习系统展现出的智慧如同断臂的维纳斯雕像——完美与残缺构成令人战栗的美学悖论。愚者,在词语的混沌中编织逻辑经纬,却总在即将触及诗性本质的瞬间,暴露出认知维度的致命裂隙。 一…...
论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)
论文英文题目:A spatial interaction model of Qin-Han Dynasty organisation on the northern frontier and the location of the Zhidao highway (China) 发表于:journal of archaeological science,影响因子:3.030 论文主要是…...
【贪心算法】将数组和减半的最小操作数
1.题目解析 2208. 将数组和减半的最少操作次数 - 力扣(LeetCode) 2.讲解算法原理 使用当前数组中最大的数将它减半,,直到数组和减小到一半为止,从而快速达到目的 重点是找到最大数,可以采用大根堆快速达到…...
Dify部署踩坑指南(Windows+Mac)
组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本,nginx端口不要直接修改docker-compose.yaml !!!!!!! 1、更换镜像版本 这个文件是由.env自动生成的,在.env配置 …...
无人机端部署 AI 模型,实现实时数据处理和决策
在无人机端部署 AI 模型,实现实时数据处理和决策,是提升无人机智能化水平的关键技术之一。通过将 AI 模型部署到无人机上,可以实现实时目标检测、路径规划、避障等功能。以下是实现这一目标的详细方案和代码示例。 一、实现方案 1. 硬件选择…...
你为什么要写博客?
契机:最近CSDN系统给我发了一条私信,说我成为博主已经四年了,写一篇博客纪念可以得一枚纪念勋章,遂有此文。 机缘 最开始的这篇博客,是为了公司内部的一次分享会准备的,完全是YY出来的,现在看…...
【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽
目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...
P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!
P8685 [蓝桥杯 2019 省 A] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列?省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单,我们可以看见测试用例的时间顺序是不同的&#x…...
VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我,实在受不了Keil的上古编辑页面,周树人说过:由奢入俭难,下面我们一起折腾一下开源软件Vscode, 用以开发51和STM32,有错误之处&…...
JVM类加载器面试题及原理
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库扩展类加载器ÿ…...
在 Maven 中使用 <scope> 元素:全面指南
目录 前言 在 Maven 中, 元素用于定义依赖项的作用范围,即依赖项在项目生命周期中的使用方式。正确使用 可以帮助我们优化项目的构建过程,减少不必要的依赖冲突,并提高构建效率。本文将详细介绍 的使用步骤、常见作用范围、代码…...
tomcat的安装与配置(包含在idea中配置tomcat)
Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器,主要用于运行 Servlet 和 JSP(JavaServer Pages)程序。它属于轻量级应用服务器,适用于中小型系统及开发调试场景,尤其在处理动态内容(如 Jav…...
问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘text‘
项目环境: 我的环境:Window10,Python3.12,Anaconda3,Pycharm2024.3.4 问题描述: 找不到’text’这个对象 部分代码: Traceback (most recent call last):File "D:\IT DateFiles\PyDate\FQ…...
量子计算测试挑战:软件测试将如何迎接新纪元?
引言 在计算机技术的飞速发展中,量子计算(Quantum Computing)正成为下一个颠覆性的科技热点。随着谷歌、IBM、微软等科技巨头纷纷投入巨资研究量子计算,其应用场景正逐步扩展,从优化计算到密码安全,再到人工智能和材料科学。然而…...
读书报告」网络安全防御实战--蓝军武器库
一眨眼,20天过去了,刷完了这本书「网络安全防御实战--蓝军武器库」,回味无穷,整理概览如下,可共同交流读书心得。在阅读本书的过程中,我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…...
《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导
尽管《机器学习数学基础》这本书,耗费了比较长的时间和精力,怎奈学识有限,错误难免。因此,除了在专门的网页( 勘误和修订 )中发布勘误和修订内容之外,对于重大错误,我还会以专题的形…...
深度学习与普通神经网络有何区别?
深度学习与普通神经网络的主要区别体现在以下几个方面: 一、结构复杂度 普通神经网络:通常指浅层结构,层数较少,一般为2-3层,包括输入层、一个或多个隐藏层、输出层。深度学习:强调通过5层以上的深度架构…...
Flutter底层实现
1. Dart 语言 Dart 是 Flutter 的主要编程语言。Dart 设计之初就是为了与 JavaScript 兼容,并且可以编译为机器代码运行。Dart 提供了一些特性,如异步支持(通过 async 和 await),这使得编写高效的网络请求和复杂动画变…...
【芯片验证】verificationguide上的36道UVM面试题
跟上一篇一样,verificationguide上的36到UVM面试题,通义回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事务的基础类,用于表示仿真…...

