《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)读取文件

异步读取
javascript 复制代码
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('读取文件失败:', err);
    return;
  }
  console.log('文件内容:', data);
});
同步读取
javascript 复制代码
try {
  const data = fs.readFileSync('file.txt', 'utf8');
  console.log('文件内容:', data);
} catch (err) {
  console.error('读取文件失败:', err);
}

(2)写入文件

异步写入
javascript 复制代码
fs.writeFile('file.txt', 'Hello, Node.js!', 'utf8', (err) => {
  if (err) {
    console.error('写入文件失败:', err);
    return;
  }
  console.log('文件写入成功');
});
同步写入
javascript 复制代码
try {
  fs.writeFileSync('file.txt', 'Hello, Node.js!', 'utf8');
  console.log('文件写入成功');
} catch (err) {
  console.error('写入文件失败:', err);
}

(3)追加内容

异步追加
javascript 复制代码
fs.appendFile('file.txt', '\n追加内容', 'utf8', (err) => {
  if (err) {
    console.error('追加内容失败:', err);
    return;
  }
  console.log('内容追加成功');
});
同步追加
javascript 复制代码
try {
  fs.appendFileSync('file.txt', '\n追加内容', 'utf8');
  console.log('内容追加成功');
} catch (err) {
  console.error('追加内容失败:', err);
}

(4)删除文件

异步删除
javascript 复制代码
fs.unlink('file.txt', (err) => {
  if (err) {
    console.error('删除文件失败:', err);
    return;
  }
  console.log('文件删除成功');
});
同步删除
复制代码
javascript 复制代码
try {
  fs.unlinkSync('file.txt');
  console.log('文件删除成功');
} catch (err) {
  console.error('删除文件失败:', err);
}

path模块-路径处理

Node.js 代码中,相对路径是根据终端所在路径来查找的,可能无法找到你想要的文件。

path 模块是 Node.js 中用于处理文件路径的核心模块。它提供了一系列工具函数,用于解析、拼接、规范化文件路径,以及提取路径中的信息(如文件名、扩展名等)。

所以,在 Node.js 代码中,使用绝对路径更好。

路径拼接:path.join()

将多个路径片段拼接成一个完整的路径,自动处理路径分隔符。

__dirname 内置变量(获取当前模块目录-绝对路径)

javascript 复制代码
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 模块:

javascript 复制代码
const http = require('http');

2. 创建 HTTP 服务器

使用 http.createServer() 方法创建一个 HTTP 服务器。

示例:创建一个简单的 HTTP 服务器

javascript 复制代码
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)获取请求方法

javascript 复制代码
const method = req.method; // 获取请求方法(GET、POST 等)

(2)获取请求 URL

javascript 复制代码
const url = req.url; // 获取请求的 URL

(3)获取请求头

javascript 复制代码
const headers = req.headers; // 获取请求头

(4)获取请求体(POST 请求)

javascript 复制代码
let body = '';
req.on('data', (chunk) => {
  body += chunk; // 接收数据块
});
req.on('end', () => {
  console.log('请求体:', body); // 请求体接收完成
});

4. 发送响应

(1)设置状态码

javascript 复制代码
res.statusCode = 200; // 设置状态码为 200

(2)设置响应头

javascript 复制代码
res.setHeader('Content-Type', 'text/plain'); // 设置响应头

(3)发送响应内容

javascript 复制代码
res.end('Hello, World!\n'); // 发送响应内容并结束响应

5. 处理路由

根据请求的 URL 和方法处理不同的路由。

示例:处理 GET 和 POST 请求

javascript 复制代码
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 请求

javascript 复制代码
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 请求

javascript 复制代码
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 服务器

javascript 复制代码
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 对象来访问全局变量。

示例:

javascript 复制代码
// file: math.js
function add(a, b) {
    return a + b;
}

function subtract(a, b) {
    return a - b;
}

module.exports = { add, subtract };
javascript 复制代码
// 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 '模块名或路径'

javascript 复制代码
// 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 安装包:

javascript 复制代码
# 使用 npm 安装包
npm install package-name

# 使用 yarn 安装包
yarn add package-name
(2)全局安装包

如果想要在整个系统中可用,可以使用 -g(全局安装):

javascript 复制代码
npm install -g package-name

(3)卸载包

javascript 复制代码
npm uninstall package-name

(4)更新包

javascript 复制代码
npm update package-name

4. 如何创建自己的包

如果你想发布自己的 npm 包,可以按照以下步骤:

(1)初始化包

在项目目录下运行:

javascript 复制代码
npm init

然后按照提示填写 包名、版本号、入口文件、作者信息 等。

(2)编写代码

创建 index.js,例如:

javascript 复制代码
module.exports = function() {
    console.log("Hello from my package!");
};
(3)发布到 npm

首先,登录 npm

javascript 复制代码
npm login

然后发布包:

javascript 复制代码
npm publish

5. 包的作用

  • 代码复用:将通用功能封装成包,提高开发效率。
  • 模块化管理:减少代码耦合,使项目结构更清晰。
  • 社区共享:可以使用开源社区提供的高质量库,而不需要自己从零开始写代码。
相关推荐
Python私教1 小时前
把开源 Agent 打包成"解压双击即用"的 Windows 便携包:一条命令的完整实现
node.js
没事别瞎琢磨4 小时前
十一、审计与 Run Session——每一步操作都被记录
人工智能·node.js
没事别瞎琢磨4 小时前
十六、AgentSandbox——把所有模块串起来的编排类
人工智能·node.js
没事别瞎琢磨4 小时前
十二、网络代理与白名单规则引擎
人工智能·node.js
没事别瞎琢磨4 小时前
十四、Git Worktree 隔离执行
人工智能·node.js
没事别瞎琢磨5 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨5 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨6 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨6 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨6 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js