《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》

news2025/3/10 23:21:42

”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “

什么是 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.exportsexports 来导出模块。

  • 使用 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. 包的作用

  • 代码复用:将通用功能封装成包,提高开发效率。
  • 模块化管理:减少代码耦合,使项目结构更清晰。
  • 社区共享:可以使用开源社区提供的高质量库,而不需要自己从零开始写代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java代码审计 | 第八篇】文件操作漏洞成因及防范

未经许可,不得转载。 文章目录 文件操作漏洞文件读取漏洞基于 InputStream 的读取基于 FileReader 的读取 文件下载漏洞文件删除漏洞防范 文件操作漏洞 分为文件读取漏洞、文件下载漏洞与文件删除漏洞。 文件读取漏洞 在Java中,文件读取通常有两种常见…

在Linux开发板中使用.NET实现音频开发

本文将以Linux开发板为基础,使用ALSA音频框架和C#语言,演示如何实现基础的音频录制与播放功能。 1. 背景 音频处理是嵌入式开发中常见的需求,无论是语音交互、环境监测还是多媒体应用都离不开音频模块的支持。在Linux系统中,ALSA…

基于RNN+微信小程序+Flask的古诗词生成应用

项目介绍 平台采用B/S结构,后端采用主流的Flask框架进行开发,古诗词生成采用RNN模型进行生成,客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能(RNN)等多个领域的综合性应用,是课…

基于单片机的智慧农业大棚系统(论文+源码)

1系统整体设计 经过上述的方案分析,采用STM32单片机为核心,结合串口通信模块,温湿度传感器,光照传感器,土壤湿度传感器,LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测,土壤…

2025-03-08 学习记录--C/C++-PTA 习题8-9 分类统计各类字符个数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h> #define MAXS 15void StringCount( …

OTP单片机调试工具

大部分的OTP单片机开发流程是先用仿真器进行仿真&#xff0c;f仿真完成之后再烧录OTP单片机芯片进行验证&#xff0c;但是很多少时候会发现有一个问题&#xff0c;仿真器仿真都是OK的&#xff0c;但是一旦焊接在板上了&#xff0c;就往往发现有问题&#xff0c;因为硬件条件变化…

二次SQL注入

原理 用户向数据库存入恶意数据&#xff0c;当数据被送进数据库的时候&#xff0c;会对存入的信息进行转义然后再储存&#xff0c;但是存进去的数据会再次被转义回来&#xff08;也就是原样不变的存进数据库里&#xff0c;只是害怕攻击者在存入数据的时候捣蛋而已&#xff09;…

【贪心算法】将数组和减半的最小操作数

1.题目解析 2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 使用当前数组中最大的数将它减半&#xff0c;&#xff0c;直到数组和减小到一半为止&#xff0c;从而快速达到目的 重点是找到最大数&#xff0c;可以采用大根堆快速达到…

Dify部署踩坑指南(Windows+Mac)

组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本&#xff0c;nginx端口不要直接修改docker-compose.yaml &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、更换镜像版本 这个文件是由.env自动生成的&#xff0c;在.env配置 …

你为什么要写博客?

契机&#xff1a;最近CSDN系统给我发了一条私信&#xff0c;说我成为博主已经四年了&#xff0c;写一篇博客纪念可以得一枚纪念勋章&#xff0c;遂有此文。 机缘 最开始的这篇博客&#xff0c;是为了公司内部的一次分享会准备的&#xff0c;完全是YY出来的&#xff0c;现在看…

【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] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列&#xff1f;省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单&#xff0c;我们可以看见测试用例的时间顺序是不同的&#x…

VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置

VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我&#xff0c;实在受不了Keil的上古编辑页面&#xff0c;周树人说过&#xff1a;由奢入俭难&#xff0c;下面我们一起折腾一下开源软件Vscode&#xff0c; 用以开发51和STM32&#xff0c;有错误之处&…

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器&#xff0c;主要用于运行 Servlet 和 JSP&#xff08;JavaServer Pages&#xff09;程序。它属于轻量级应用服务器&#xff0c;适用于中小型系统及开发调试场景&#xff0c;尤其在处理动态内容&#xff08;如 Jav…

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

【芯片验证】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中所有事务的基础类,用于表示仿真…

基于深度文档理解的开源 RAG 引擎RAGFlow的介绍和安装

目录 前言1. RAGFlow 简介1.1 什么是 RAGFlow&#xff1f;1.2 RAGFlow 的核心特点 2. RAGFlow 的安装与配置2.1 硬件与软件要求2.2 下载 RAGFlow 源码2.3 源码编译 Docker 镜像2.4 设置完整版&#xff08;包含 embedding 模型&#xff09;2.5 运行 RAGFlow 3. RAGFlow 的应用场…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…

MWC 2025 | 紫光展锐与中国联通联合发布5G eSIM 平板

2025 年 3 月 3 日至 6 日&#xff0c;在全球移动通信行业的年度盛会 —— 世界移动通信大会&#xff08;MWC 2025&#xff09;上&#xff0c;紫光展锐联合中国联通重磅发布了支持eSIM的5G平板VN300E。 该产品采用紫光展锐T9100高性能5G SoC芯片平台&#xff0c;内置8 TOPS算力…