From 396d98fdaef81f158c803b779d3ccc093c0825cb Mon Sep 17 00:00:00 2001 From: FISH SOUP Date: Sun, 15 Mar 2026 18:41:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "20260306-\345\210\235\350\257\206Nodejs.md" | 60 +++++++++ ...00\345\217\221\347\216\257\345\242\203.md" | 76 +++++++++++ ...41\345\235\227\347\263\273\347\273\237.md" | 85 ++++++++++++ ...44\350\241\214\345\267\245\345\205\267.md" | 121 ++++++++++++++++++ "20260313-\344\275\234\344\270\232.md" | 79 ++++++++++++ 5 files changed, 421 insertions(+) create mode 100644 "20260306-\345\210\235\350\257\206Nodejs.md" create mode 100644 "20260309-\345\246\202\344\275\225\346\220\255\345\273\272Node.js\345\274\200\345\217\221\347\216\257\345\242\203.md" create mode 100644 "20260311-\346\250\241\345\235\227\347\263\273\347\273\237.md" create mode 100644 "20260312-\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" create mode 100644 "20260313-\344\275\234\344\270\232.md" diff --git "a/20260306-\345\210\235\350\257\206Nodejs.md" "b/20260306-\345\210\235\350\257\206Nodejs.md" new file mode 100644 index 0000000..95aa346 --- /dev/null +++ "b/20260306-\345\210\235\350\257\206Nodejs.md" @@ -0,0 +1,60 @@ +# 初识Node.js + +## 理解Node.js +Node.js是什么:Node.js是一个基于谷歌 V8引擎的JavaScript运行时,让JavaScript可以脱离浏览器在服务端运行。 +Node.js的特点:单线程、事件驱动、非阻塞I/O、高性能 +Node.js的含义:运行JavaScript的“节点”,可以连接各种服务和资源 + +## Node.js核心特性 + +### 单线程 +Node.js使用单线程执行代码 +- 优点: + - 节省内存空间 + - 编程模型简单 + - 不存在线程切换开销 +- 缺点: + - 无法利用多核cpu + - 计算密集型任务会阻塞 + +### 非阻塞I/O +当程序需要读取文件、查询数据库时,Node.js不会等待结果,而是继续执行其他代码 + +### 事件驱动 +Node.js通过事件和回调函数来处理异步操作 + +## 作业 + +### 选择题 +1.Node.js是基于哪个JavaScript引擎开发的? +B. V8 + +2.以下哪个不是Node.js的核心特性? +B. 多线程 + +3.Node.js最适合开发以下哪种应用? +C. 实时聊天系统 + +4.以下哪个是Node.js的创始人? +B. Ryan Dahl + +5.Node.js中的"I/O"主要指什么? +A. Input/Output(输入/输出) + +### 简答题 +1.什么是Node.js?请用一句话概括。 +使JavaScript能够脱离浏览器在服务器上进行运行 + +2.请解释"非阻塞I/O"是什么意思,它有什么优点? +当程序在读取和查询数据库时,Nodejs会继续执行其他的代码 + +3.为什么Node.js适合开发实时聊天应用? +前后端使用的代码类型相同、高性能 + +4.请列举Node.js的3个应用场景。 +实时聊天应用、web程序应用、淘宝 + +5.Node.js和传统后端语言(如Java、PHP)相比,有什么优势? +单线程非阻塞I/O、前后端语言一致性、高性能 + +### 操作题 \ No newline at end of file diff --git "a/20260309-\345\246\202\344\275\225\346\220\255\345\273\272Node.js\345\274\200\345\217\221\347\216\257\345\242\203.md" "b/20260309-\345\246\202\344\275\225\346\220\255\345\273\272Node.js\345\274\200\345\217\221\347\216\257\345\242\203.md" new file mode 100644 index 0000000..76564bd --- /dev/null +++ "b/20260309-\345\246\202\344\275\225\346\220\255\345\273\272Node.js\345\274\200\345\217\221\347\216\257\345\242\203.md" @@ -0,0 +1,76 @@ +# 搭建Node.js开发环境 + +## 下载Node.js + +访问: + +### 安装验证 + +```bash +# 查看node.js版本 +node -v + +# 查看npm版本 +npm -v +``` + +## npm包 + +npm是Node.js的包管理器 + +### npm基本命令 + +| 命令 | 说明 | +|------|------| +| `npm -v` | 查看npm版本 | +| `npm init` | 初始化项目,创建package.json | +| `npm install <包名>` | 安装指定包 | +| `npm install` | 安装所有依赖 | +| `npm uninstall <包名>` | 卸载指定包 | +| `npm list` | 查看已安装的包 | + +```bash +# 安装一个包 +npm install express + +# 安装全局包 +npm install -g nodemon +``` + +## 创建node.js项目 + +```bash +# 创建项目文件夹 +mkdir node_app +cd node_app + +# 初始化项目 +npm init -y +``` + +## 练习 + +1.Node.js的LTS版本是什么意思?目前最新的LTS版本是哪个? +B. Long Term Support + +2.npm是用来做什么的? +B. 管理Node.js包 + +3.初始化Node.js项目的命令是? +C. npm init + +4.运行Node.js程序的命令是? +B. node app.js + +5.package.json文件主要记录什么信息? +B. 项目依赖和配置 + +1.请解释LTS版本和Current版本有什么区别? +LTS:长期稳定版本 +Current:最新版本 + +2.npm和Node.js是什么关系? +npm是Node.js的包管理器 + +3.package.json文件中的dependencies和devDependencies有什么区别? +dependencies是生产工具,Dev是生产方法 \ No newline at end of file diff --git "a/20260311-\346\250\241\345\235\227\347\263\273\347\273\237.md" "b/20260311-\346\250\241\345\235\227\347\263\273\347\273\237.md" new file mode 100644 index 0000000..4814bd8 --- /dev/null +++ "b/20260311-\346\250\241\345\235\227\347\263\273\347\273\237.md" @@ -0,0 +1,85 @@ +# 笔记 + +## 一、为什么用模块 + +- 代码拆分到不同文件,好维护、不冲突、可复用。 +- 每个模块有独立作用域,变量不会全局污染。 + +## 二、CommonJS(Node 默认) + +- 导入:require(路径) +- 导出:module.exports / exports + +```js +// 导出 +module.exports = { add, sub } +exports.add = (a,b)=>a+b + +// 导入 +const math = require('./math') +``` + +- exports 是 module.exports 的引用,不能直接赋值。 + +## 三、ES Modules + +- 导入:import +- 导出:export / export default +启用方式: +- 文件后缀 .mjs + 或 package.json 加 "type": "module" + +```js +// 导出 +export const add = ... +export default ... + +// 导入 +import { add } from './math.js' +import math from './math.js' +``` + +## 四、核心区别 + +- CommonJS:同步、运行时加载、Node 老项目 +- ES Modules:异步、编译时、现代前后端 + +## 作业 + +### 选择题 + +1.在CommonJS模块系统中,引入模块使用哪个关键字? +A. import + +2.以下哪个是正确的CommonJS导出方式? +C. module.exports = ... + +3.ES Modules需要什么配置才能在Node.js中使用? +B. 设置 "type": "module" + +4.下面的代码有什么问题? +B. 应该是 module.exports + +5.以下哪个不是模块化的好处? +B. 变量名冲突 + +### 简答题 + +1.什么是模块?为什么要使用模块? +模块(Module)是编程中对功能逻辑的封装单元。 + +2.请解释module.exports和exports的区别。 +exports 是 module.exports 的 “快捷方式”,但如果需要暴露非对象类型(数字、函数、类),必须用 module.exports;若只是给对象加属性,两者效果一致。 + +3.CommonJS和ES Modules有什么区别? +c运行时加载 e编译时加载 + +4.Node.js加载模块的顺序是怎样的? + +1. 优先加载内置模块 +2. 加载自定义模块 +3. 加载第三方模块 + +5.什么是模块作用域?它有什么作用? +模块作用域(Module Scope)是指:每个模块(文件)都是一个独立的作用域 +避免全局污染、提高代码安全性、增强代码可读性 diff --git "a/20260312-\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" "b/20260312-\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" new file mode 100644 index 0000000..3860615 --- /dev/null +++ "b/20260312-\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" @@ -0,0 +1,121 @@ +# 命令行工具 + +## 概念 + +命令行工具(CLI):是没有图形界面,通过终端输入命令来操作的程序 + +- 优点 + - 自动化:批量处理文件、数据 + - 提高效率:常用操作一键完成 + - 部署便捷:服务器上也能轻松使用 + - 技能锻炼:综合运用Node.js基础知识 + +## 知识学习 + +### 命令行参数处理 + +Node.js通过`process.argv`获取命令行参数: + +```bash +// 运行命令:node app.js one two three + +console.log(process.argv); + +// 输出: +// [ +// 'node安装路径', +// '脚本文件路径', +// 'one', +// 'two', +// 'three' +// ] +``` + +### 解析用户输入 + +```bash +// 获取除前两项之外的参数 +const args = process.argv.slice(2); + +console.log(args); +// 运行:node app.js add 买书 +// 输出:['add', '买书'] + +// 解析命令和参数 +const command = args[0]; +const param = args[1]; + +switch (command) { + case 'add': + console.log('添加:' + param); + break; + case 'delete': + console.log('删除:' + param); + break; + default: + console.log('未知命令'); +} +``` + +### 使用commander简化参数处理 + +```bash +// 安装commander +npm install commander + +// 使用 +const { program } = require('commander'); + +program + .name('my-cli') + .description('命令行工具') + .version('1.0.0'); + +program.command('add ') + .description('添加待办') + .action((item) => { + console.log('添加:' + item); + }); + +program.parse(); +``` + +## 练习题 + +### 选择 + +1.Node.js中,获取命令行参数的属性是? +B. process.argv + +2.以下哪个命令可以读取文件内容? +B. fs.readFile + +3.__dirname 表示什么? +B. 当前文件所在目录 + +4.package.json中,哪个字段用于配置全局命令? +C.bin + +5.下面哪个不是命令行工具的优点? +B. 图形界面更美观 + +### 简答 + +1.请解释什么是CLI工具?它和GUI有什么区别? +CLI是没有图形界面,在终端输入命令来操作的工具 +GUI有图形界面 + +2.process.argv返回的数组包含哪些内容? +所输入的命令行参数 + +3.请说明fs.readFileSync和fs.readFile的区别。 +fs.readFileSync是同步读取,意思是只有完成这段代码后才会继续向下运行 +fs.readFile是异步读取,在读取文件时,代码会继续执行,出现错误会使用回调函数进行输出 + +4.为什么要使用JSON文件存储数据?有什么优缺点? +纯文本格式,传输/存储占用空间小。 +优点:易读写、跨语言/跨平台、无环境依赖、结构灵活,支持复杂嵌套 +缺点:性能差,不适合高并发/大数据、缺乏数据管理能力、数据类型有限、易出错,无法语言校验、文件大小受限 + +5.如何让开发的CLI工具可以全局使用? +让CLI可执行文件所在目录被系统PATH包含,终端就能全局找到并执行 diff --git "a/20260313-\344\275\234\344\270\232.md" "b/20260313-\344\275\234\344\270\232.md" new file mode 100644 index 0000000..d81ba7c --- /dev/null +++ "b/20260313-\344\275\234\344\270\232.md" @@ -0,0 +1,79 @@ +```js +import fs from 'fs'; + +const priorityMap = {1:'高',2:'中',3:'低','高':1,'中':2,'低':3}; + +let command = process.argv[2]; +let params = process.argv[3]; +let priority = process.argv[4]; + + +if(command == "list"){ + console.log("列表"); + let list = readFile(); + list.forEach((item,index) => { + //增加优先级功能 + console.log(`${index+1}.${item.title}[优先级:${priorityMap[item.priority]}]`); + }); +}else if(command == "add"){ + console.log("添加"); + let arr = readFile(); + // 将命令行中的内容上传到数组中 + arr.push({'title':params,'isDone':false,priority}); + writeFile(arr); + let newArr = readFile(); + console.log(newArr); +}else if(command == "del"){ + console.log("删除"); + // 将在命令行的字符串转换为整数 + let idx = parseInt(params); + let delArr = readFile(); + // 将命令行输入的数字转换为下标,可以删除指定的代办 + delArr.splice(idx-1,1); + // 保存删除后的数组 + writeFile(delArr); + console.log(delArr); +}else if(command == "done"){ + let doneArr = readFile(); + let idx = parseInt(params); + let targetItem = doneArr[idx-1]; + targetItem.isDone = true; + writeFile(doneArr); + console.log(doneArr); + +}else if(command == "clear"){ + let clearArr = []; + writeFile(clearArr); + console.log(clearArr); + +}else{ + console.log('未找到该命令'); +} + +// 读取待办文件 +function readFile(filePath){ + // 如果没有文件传递,默认为todo.json + filePath = filePath || './todo.json'; + // 判断文件是否存在 + if(fs.existsSync(filePath)){ + let data = fs.readFileSync(filePath,'utf-8'); + // 将文件中的JSON字符串转换为js数组 + return JSON.parse(data) || []; + } + return []; +} + +// 更改待办文件 +function writeFile(fileContent,filePath){ + filePath = filePath || "./todo.json"; + // 将数组转换为字符串 + let jsonString = JSON.stringify(fileContent); + // 覆盖先前内容 + fs.writeFileSync(filePath,jsonString); +} + +function getPriority(input){ + let priority = parseInt(priorityMap[input] || input); + return [1,2,3].includes(priority) ? priority : 2; +} +``` -- Gitee