From 5ad2496c7d35b9da1a838d3da6f5563767a95b9e Mon Sep 17 00:00:00 2001 From: Tkyoo <2951237202@qq.com> Date: Sun, 15 Mar 2026 13:49:56 +0000 Subject: [PATCH] zy Signed-off-by: Tkyoo <2951237202@qq.com> --- .../20260309.md" | 21 ++++ .../20260311.md" | 17 ++++ .../20260312.md" | 95 +++++++++++++++++++ .../20260313.md" | 95 +++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 "\344\273\235\345\207\257\345\205\203/20260309.md" create mode 100644 "\344\273\235\345\207\257\345\205\203/20260311.md" create mode 100644 "\344\273\235\345\207\257\345\205\203/20260312.md" create mode 100644 "\344\273\235\345\207\257\345\205\203/20260313.md" diff --git "a/\344\273\235\345\207\257\345\205\203/20260309.md" "b/\344\273\235\345\207\257\345\205\203/20260309.md" new file mode 100644 index 00000000..6de7e9f3 --- /dev/null +++ "b/\344\273\235\345\207\257\345\205\203/20260309.md" @@ -0,0 +1,21 @@ +## 简答题 +# 请解释dependencies和devDependencies的区别 +dependencies 是项目运行时依赖,生产环境必须有,核心是 “项目能跑起来” devDependencies 是项目开发时依赖,仅用于开发 / 构建 / 测试,生产环境可剔除,核心是 “开发更高效” + +# 什么是语义化版本号?请举例说明 "^1.2.3" 的含义 +语义化版本号核心是 主版本.次版本.补丁,分别对应 “不兼容变更、功能新增、问题修复” ^1.2.3 表示锁定主版本号 1,允许安装 1.2.3 及以上、2.0.0 以下的所有版本,既享受功能更新和 bug 修复,又避免主版本变更导致的兼容性问题 + +# 为什么国内使用npm需要配置镜像源? +npm默认的从国外下载包,在国内访问速度很慢 + +# 请描述npm install命令的执行过程。 +初始化检查-解析依赖树-检查缓存(避免重复下载)-下载与解压-执行生命周期脚本 + +# 全局安装和本地安装有什么区别? +本地安装:给当前项目装 “依赖包”,记录在 package.json,供项目代码调用,是项目开发的核心方式 全局安装:给系统装 “命令行工具”,不绑定具体项目,终端全局可用,但易引发版本冲突 + +# yarn和npm相比有什么优势? +Yarn 核心优势是安装速度更快(并行 + 离线)、依赖确定性更强(锁文件更严谨)、功能更丰富(简写命令 / Monorepo / 预览等) 即便 npm 后续迭代了很多特性,Yarn 在细节体验和大型项目适配性上仍有优势 + +# pnpm的node_modules结构有什么特点?为什么能节省空间? +pnpm 的 node_modules 核心是符号链接(逻辑引用)+ 硬链接(物理复用)+ 全局存储,结构上隔离直接 / 间接依赖,无扁平化冗余 同一个版本的包在全局存储仅存一份,所有项目通过硬链接复用,无重复存储 \ No newline at end of file diff --git "a/\344\273\235\345\207\257\345\205\203/20260311.md" "b/\344\273\235\345\207\257\345\205\203/20260311.md" new file mode 100644 index 00000000..e224af43 --- /dev/null +++ "b/\344\273\235\345\207\257\345\205\203/20260311.md" @@ -0,0 +1,17 @@ +## 简答题 +# 第一题:什么是模块?为什么要使用模块? +便于维护,便于理解代码结构,变量名不会冲突,增加代码的使用率 + +# 第二题:请解释module.exports和exports的区别 +直接给 exports 赋值(如 exports = 123)会断开引用,无法改变最终导出结果;而 module.exports 直接赋值会覆盖导出的 “真身”,是有效操作 + +# 第三题:CommonJS和ES Modules有什么区别? +引入方式 require() import 导出方式 module.exports export 加载方式 同步加载 异步加载 解析时机 运行时解析 编译时确定 使用场景 Node.js服务端 前端/现代Node.js 扩展名 .js .mjs 或配置 + +module.exports 是真正的导出对象 exports 只是 module.exports 的别名 不要直接给 exports 赋值,否则会切断引用关系 + +# 第四题:Node.js加载模块的顺序是怎样的? +优先级:核心模块 > 路径模块 > 第三方模块; 查找逻辑:路径模块按 “精确文件→后缀→目录(package.json/main→index)” 查找,第三方模块逐级向上找 node_modules; 加载后缓存,避免重复加载,提升性能。 + +# 第五题:什么是模块作用域?它有什么作用? +模块作用域是每个模块拥有的独立隔离作用域,模块内的变量默认仅内部可用,底层通过函数包裹(Node.js)或块级作用域(ESM)实现; 核心作用:避免全局变量污染、解决命名冲突、封装内部逻辑、提高代码可维护性 \ No newline at end of file diff --git "a/\344\273\235\345\207\257\345\205\203/20260312.md" "b/\344\273\235\345\207\257\345\205\203/20260312.md" new file mode 100644 index 00000000..9fc06cc8 --- /dev/null +++ "b/\344\273\235\345\207\257\345\205\203/20260312.md" @@ -0,0 +1,95 @@ +console.log(process.argv); +import qq from 'fs' + +let command = process.argv[2]; +let params = process.argv[3]; + +function readJson(filePath) { + filePath = filePath || './index.json'; + if (qq.existsSync(filePath)) { + let jsonString = qq.readFileSync(filePath, 'utf-8'); + let res = JSON.parse(jsonString) || []; + return res; + } else { + return []; + } +} + +function writeJson(contnet, filePath) { + filePath = filePath || './index.json'; + qq.writeFileSync(filePath, JSON.stringify(contnet, null, 2)); +} + +// 增 +function add() { + console.log('添加'); + let arr = readJson(); + arr.push({ "title": params, "isFinished": false }); + writeJson(arr); +} + +// 查 +function list() { + console.log('列出'); + let listArr = readJson(); + console.log(listArr); +} + +// 改(标记完成) +function done(num) { + console.log('完成'); + let doneList = readJson(); + num = parseInt(num); + if (num > doneList.length) { + console.log('要标注的待办事项不存在'); + } else { + let idx = num - 1; + doneList[idx].isFinished = true; + writeJson(doneList); + } +} + +// 删 +function del(num) { + console.log('删除'); + num = parseInt(num); + let delArr = readJson(); + if (num > delArr.length) { + console.log('你要删除的待办事项不存在'); + } else { + delArr.splice(num - 1, 1); + writeJson(delArr); + } +} + +// 清空 +function clear(){ + console.log('清除'); + writeJson([]); +} + +function showHelp() { + let str = ` +== 欢迎使用天才版待办事项管理系统 == +node app.js add XXX 添加待办事项 +node app.js list 列出所有待办事项 +node app.js done 1 将序号1设为已完成 +node app.js del 1 删除序号1 +node app.js clear 清除所有待办事项 +`; + console.info(str); +} + +if (command == 'add') { + add(); +} else if (command == 'list') { + list(); +} else if (command == 'done') { + done(params); +} else if (command == 'del') { + del(params); +} else if (command == 'clear') { + clear(); +} else { + showHelp() +} \ No newline at end of file diff --git "a/\344\273\235\345\207\257\345\205\203/20260313.md" "b/\344\273\235\345\207\257\345\205\203/20260313.md" new file mode 100644 index 00000000..9fc06cc8 --- /dev/null +++ "b/\344\273\235\345\207\257\345\205\203/20260313.md" @@ -0,0 +1,95 @@ +console.log(process.argv); +import qq from 'fs' + +let command = process.argv[2]; +let params = process.argv[3]; + +function readJson(filePath) { + filePath = filePath || './index.json'; + if (qq.existsSync(filePath)) { + let jsonString = qq.readFileSync(filePath, 'utf-8'); + let res = JSON.parse(jsonString) || []; + return res; + } else { + return []; + } +} + +function writeJson(contnet, filePath) { + filePath = filePath || './index.json'; + qq.writeFileSync(filePath, JSON.stringify(contnet, null, 2)); +} + +// 增 +function add() { + console.log('添加'); + let arr = readJson(); + arr.push({ "title": params, "isFinished": false }); + writeJson(arr); +} + +// 查 +function list() { + console.log('列出'); + let listArr = readJson(); + console.log(listArr); +} + +// 改(标记完成) +function done(num) { + console.log('完成'); + let doneList = readJson(); + num = parseInt(num); + if (num > doneList.length) { + console.log('要标注的待办事项不存在'); + } else { + let idx = num - 1; + doneList[idx].isFinished = true; + writeJson(doneList); + } +} + +// 删 +function del(num) { + console.log('删除'); + num = parseInt(num); + let delArr = readJson(); + if (num > delArr.length) { + console.log('你要删除的待办事项不存在'); + } else { + delArr.splice(num - 1, 1); + writeJson(delArr); + } +} + +// 清空 +function clear(){ + console.log('清除'); + writeJson([]); +} + +function showHelp() { + let str = ` +== 欢迎使用天才版待办事项管理系统 == +node app.js add XXX 添加待办事项 +node app.js list 列出所有待办事项 +node app.js done 1 将序号1设为已完成 +node app.js del 1 删除序号1 +node app.js clear 清除所有待办事项 +`; + console.info(str); +} + +if (command == 'add') { + add(); +} else if (command == 'list') { + list(); +} else if (command == 'done') { + done(params); +} else if (command == 'del') { + del(params); +} else if (command == 'clear') { + clear(); +} else { + showHelp() +} \ No newline at end of file -- Gitee