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

发布于:2025-03-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

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

什么是 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. 包的作用

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