”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “
什么是 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. 包的作用
- 代码复用:将通用功能封装成包,提高开发效率。
- 模块化管理:减少代码耦合,使项目结构更清晰。
- 社区共享:可以使用开源社区提供的高质量库,而不需要自己从零开始写代码。