0%

Node.js 模块系统:创建、加载与依赖管理

Node.js 的模块系统是其核心特性之一,通过exportsrequire实现代码的模块化拆分与复用,配合package.json可高效管理项目依赖。本文详细讲解模块的创建、加载逻辑及依赖配置,帮助理解 Node.js 的模块化开发模式。

模块的基本概念

在 Node.js 中,一个文件就是一个模块,每个模块拥有独立的作用域(变量、函数仅在模块内可见),通过exports暴露接口,通过require引入其他模块。这种设计避免了全局变量污染,同时实现了代码的解耦与复用。

创建与加载模块:exportsrequire的使用

1. 导出模块:exportsmodule.exports

模块通过exports对象暴露可供外部调用的属性或方法,也可通过module.exports导出完整对象(二者指向同一内存地址)。

示例:创建greet.js模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 方式1:通过exports暴露单个方法
exports.sayHello = function(name) {
console.log(`Hello, ${name}!`);
};

// 方式2:通过module.exports暴露多个方法(更灵活)
module.exports = {
sayHi: function(name) {
console.log(`Hi, ${name}!`);
},
sayBye: function(name) {
console.log(`Bye, ${name}!`);
}
};
阅读全文 »

npm 详解:Node.js 生态的包管理利器

npm(Node Package Manager)作为 Node.js 的官方包管理器,是构建 Node.js 生态的核心工具。它不仅提供了海量可重用的代码模块(package),还简化了模块的安装、更新、卸载及项目依赖管理流程。无论是前端开发(如 React、Vue 项目)还是后端 Node.js 服务,npm 都是不可或缺的工具。本文将系统介绍 npm 的核心功能与使用方法。

npm 的核心作用

npm 的本质是一个包管理系统,其核心价值体现在:

  1. 模块共享:开发者可将自己编写的工具库发布到 npm 仓库,供全球开发者使用(如 axios、lodash 等热门模块);
  2. 依赖管理:自动处理项目所需的模块及其版本依赖,避免 “版本冲突” 问题;
  3. 脚本执行:支持在package.json中定义自定义脚本(如启动服务、打包构建),简化项目流程。

npm 的安装与初始化

npm 随 Node.js 一同安装,无需单独部署:

  • 安装 Node.js 后,通过npm -v查看 npm 版本,验证是否安装成功;

  • 新建项目时,需初始化 npm 配置文件(package.json):

    1
    2
    3
    4
    # 在项目根目录执行,生成package.json(包含项目信息、依赖等)
    npm init
    # 快速生成(使用默认配置)
    npm init -y

npm 核心命令详解

1. 模块安装:本地与全局的区别

npm 安装模块分为本地安装全局安装,适用场景不同:

阅读全文 »

CSS 语法详解:选择符、属性与样式规则全指南

CSS(层叠样式表)的核心是通过 “选择符定位元素 + 属性 - 值控制样式” 实现网页美化与布局。理解 CSS 语法结构(选择符、属性、值)及各类选择符的使用场景,是精准控制元素样式、提升代码可维护性的基础。从 “基础语法结构→核心选择符分类→组合使用技巧→优先级规则” 四个维度,系统讲解 CSS 语法的使用方法与实战细节。

CSS 基础语法结构

CSS 样式规则由 选择符(Selector)属性(Property)值(Value) 三部分组成,基本格式如下:

1
2
3
4
选择符 {
属性1: 值1; /* 控制元素的某一样式(如颜色、尺寸) */
属性2: 值2; /* 多个属性用分号分隔,最后一个分号可省略 */
}

关键说明:

  1. 选择符:定位需要应用样式的 HTML 元素(如标签名、class、id);
  2. 属性:CSS 预定义的样式维度(如 color 控制颜色,font-size 控制字体大小);
  3. :属性的具体取值(需符合属性的语法规则,如 color: redcolor: #ff0000);
  4. 代码规范:
    • 花括号 {} 包裹属性 - 值对,建议独占一行;
    • 每个属性 - 值对以分号 ; 结尾,增强代码可读性;
    • 缩进(如 2 个或 4 个空格)可提升代码层级感,便于维护。

核心选择符分类与用法

选择符是 CSS 语法的 “定位工具”,不同选择符对应不同的元素匹配规则。以下按 “基础选择符→关系选择符→属性选择符” 的顺序,详解常用选择符的用法。

1. 基础选择符:直接定位元素

基础选择符是最常用的选择符,直接通过元素的标签名、class、id 等属性定位元素。

(1)标签选择符(元素选择符)

通过 HTML 标签名匹配元素,作用于页面中所有该类型的标签,适合 “统一设置某类元素的基础样式”。

阅读全文 »

HTML 列表样式详解:有序列表、无序列表与自定义样式全指南

HTML 列表是网页中组织结构化内容的核心元素,主要分为 有序列表(<ol>无序列表(<ul>,二者均通过 <li> 标签定义列表项。结合 CSS 的 list-style-type 等属性,可实现从 “默认符号” 到 “自定义图标” 的丰富样式。从 “核心标签→样式属性→自定义方案→实战场景” 四个维度,全面讲解 HTML 列表的使用与美化技巧。

HTML 列表核心标签

HTML 列表的基础结构由 “容器标签” 和 “列表项标签” 组成,两种列表的核心标签与默认行为差异如下:

1. 有序列表(<ol>:Ordered List)

  • 作用:用于展示有明确顺序的内容(如步骤、排名、优先级),默认以数字(1, 2, 3…)作为标记;
  • 核心标签:
    • <ol>:有序列表容器,定义列表的整体范围;
    • <li>:列表项(List Item),封装每一条具体内容,必须嵌套在 <ol> 内;
  • 默认样式:数字标记(decimal),列表项左侧缩进,上下有默认间距。
基础示例:
1
2
3
4
5
6
<!-- 有序列表基础用法 -->
<ol>
<li>第一步:打开浏览器</li>
<li>第二步:输入目标 URL</li>
<li>第三步:按下回车键访问</li>
</ol>
默认效果:
  1. 第一步:打开浏览器
  2. 第二步:输入目标 URL
  3. 第三步:按下回车键访问

2. 无序列表(<ul>:Unordered List)

  • 作用:用于展示无顺序关系的内容(如商品列表、标签、导航菜单),默认以实心圆(●)作为标记;
  • 核心标签:
    • <ul>:无序列表容器,定义列表的整体范围;
    • <li>:列表项,必须嵌套在 <ul> 内;
  • 默认样式:实心圆标记(disc),列表项左侧缩进,上下有默认间距。
基础示例:
阅读全文 »

Redis quicklist 实现详解(基于 6.0.10 版本)

Redis 的 List 类型在 3.2 版本后引入了 quicklist 作为底层实现,替代了此前的 “ziplist + linkedlist” 混合策略。quicklist 结合了 ziplist 的内存紧凑性和 linkedlist 的灵活扩展性,是 Redis 对列表结构的一次重要优化。本文结合源码结构和设计思路,详解 quicklist 的实现机制。

quicklist 的设计背景:为何替代旧方案?

在 3.2 版本前,Redis List 采用自适应编码:

  • 元素少时用 ziplist(压缩列表):连续内存存储,节省空间,但插入 / 删除大元素时需移动大量数据(O (N) 时间复杂度)。
  • 元素多时用 linkedlist(双向链表):节点独立分配内存,插入 / 删除高效(O (1)),但指针开销大(每个节点的 prev/next 指针占 16 字节),且内存碎片化严重。

旧方案的核心问题

  • ziplist 过大时(如存储 10 万个元素),一次插入 / 删除操作可能阻塞主线程(需移动大量内存)。
  • linkedlist 节点分散存储,内存利用率低,且缓存命中率差(CPU 缓存难以命中连续数据)。

quicklist 的改进思路
将 List 拆分为多个小段,每段用 ziplist 存储(保持紧凑性),段之间用双向指针连接(保持灵活性)。既避免了单个 ziplist 过大的性能问题,又减少了 linkedlist 的指针开销和碎片化。

quicklist 核心结构解析

quicklist 的实现依赖两个核心结构体:quicklist(列表本身)和 quicklistNode(列表节点)。

1. quicklist 结构体(列表整体)

阅读全文 »