跳转至内容
让每一次思考都有价值
💡 温馨提示:因监管政策,所有文章及评论均需审核,敬请谅解。
  • 当下主流数据库简介

    记录与分享 mysql
    1
    0 赞同
    1 评论
    1 浏览
    喜羊羊
    目录关系型数据库非关系型数据库 主流数据库包括关系型数据库和非关系型数据库,以下是对当前主流数据库的介绍及水平对比: 关系型数据库 Oracle 特点:多进程架构,共享存储模式,具有RAC集群实现高可用,ASM存储管理等核心技术,支持完整ACID事务,功能全面但成本高。 适用场景:适用于大型企业核心业务系统、金融交易系统等对事务处理要求极高的场景。 性能:在DB-Engines排名中位居前列,实测QPS读为18000,写为6500。 运维成本:较高,年运维成本约为28000美元(100GB)。 MySQL 特点:采用经典的C/S架构,支持多种存储引擎,如InnoDB提供成熟的ACID事务支持,复制机制完善,优化器持续进化。 适用场景:广泛应用于Web应用后端、中小企业ERP系统等,是中小企业OLTP系统的首选。 性能:性能较为均衡,实测QPS读为12000,写为4800。 运维成本:开源免费,若使用商用服务,年运维成本约为3000美元。 PostgreSQL 特点:定位为“先进的对象 - 关系数据库”,架构设计严谨,具有强大的扩展性,支持自定义数据类型、索引方法等,原生支持JSON/JSONB、GIS空间数据等,并发控制先进。 适用场景:适用于地理信息系统、复杂报告系统、金融应用等对SQL功能完备性、复杂数据类型支持有极高要求的场景。 性能:实测QPS读为10000,写为4200,其排名呈上升趋势,得分与SQL Server的差距逐渐缩小。 运维成本:开源免费,商用服务年运维成本约为4500美元。 SQL Server 特点:与Windows集成紧密,以单机为主,Columnstore索引实现分析加速,PolyBase支持异构数据查询,内置AI能力。 适用场景:适用于微软技术栈企业应用、商业智能系统等。 性能:实测QPS读为15000,写为5200。 运维成本:年运维成本约为19000美元。 非关系型数据库 MongoDB 特点:采用分布式文档模型,无模式设计,数据结构可动态变化,横向扩展能力强,聚合框架强大,4.0版本后提供多文档事务能力。 适用场景:适用于内容管理系统、用户画像、实时分析、物联网存储等数据结构多变、读写吞吐量巨大的场景。 性能:实测QPS读为22000,写为8500,读写性能优异。 运维成本:年运维成本约为12000美元。 Redis 特点:单线程事件驱动模型的内存数据库,数据类型丰富,支持String、List、Hash等,性能极致,微秒级读写响应,扩展模型多样。 适用场景:主要用于缓存加速、排行榜、实时消息系统、分布式锁等对低延迟有极致要求的场景。 性能:实测QPS读为180000,写为95000,性能卓越。 运维成本:开源免费,企业版年运维成本约为8000美元。 Elasticsearch 特点:是一款搜索型数据库,具有全文检索、实时聚合分析能力,分布式扩展强。 适用场景:常用于日志分析、全文检索等场景,如ELK栈中的日志分析。 性能:实测QPS读为35000,写为12000。 运维成本:年运维成本约为15000美元。 Cassandra 特点:采用无中心节点的分布式架构,基于LSM - Tree存储引擎,写入性能极高,最终一致性可调,支持动态添加列。 适用场景:适用于时序数据、日志存储、消息平台等写入负载远高于读取、需要极高可用性与跨地域部署的场景。 性能:实测QPS读为28000,写为15000,写入性能突出。 运维成本:开源免费,企业版年运维成本约为10000美元。
  • 如何在不同操作系统下切换npm源

    教程与经验
    1
    1 赞同
    1 评论
    3 浏览
    风信子
    目录一、通用切换方法(所有系统适用)1. 临时切换(单次安装)2. 永久切换(全局配置)二、分系统操作指南1. Windows系统2. macOS系统3. Linux系统(Ubuntu、CentOS等)三、使用nrm工具快速切换(推荐)1. 安装nrm2. 常用nrm命令3. 不同系统下的nrm使用差异四、项目级局部换源(所有系统适用)总结 在不同操作系统(Windows、macOS、Linux)下切换npm源的核心方法是一致的,因为npm的配置本身与操作系统无关。不过,由于终端环境的差异,操作细节上会有一些细微区别。以下是详细的跨系统切换npm源指南: 一、通用切换方法(所有系统适用) 这些方法在Windows、macOS、Linux中都能直接使用,区别仅在于打开终端的方式。 1. 临时切换(单次安装) 安装包时通过--registry参数指定源,仅对当前安装有效: # 使用淘宝源安装lodash npm install lodash --registry=https://registry.npmmirror.com # 使用清华大学源安装vue npm install vue --registry=https://mirrors.tuna.tsinghua.edu.cn/npm/ 2. 永久切换(全局配置) 通过npm config命令设置全局默认源,所有项目都会生效: # 设置为淘宝源(国内常用) npm config set registry https://registry.npmmirror.com # 设置为官方源(国外) npm config set registry https://registry.npmjs.org # 查看当前使用的源 npm config get registry # 清除npm缓存(切换源后建议执行,避免冲突) npm cache clean --force 二、分系统操作指南 1. Windows系统 打开终端的方式: 按下Win + R,输入cmd打开命令提示符(Command Prompt) 或输入powershell打开PowerShell(功能更强大,推荐) 或在VS Code中使用集成终端(Ctrl + ~) 操作示例: # 在PowerShell中设置华为云源 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ # 验证设置 npm config get registry # 输出应显示:https://mirrors.huaweicloud.com/repository/npm/ 特殊说明: Windows的命令提示符和PowerShell对npm命令的支持完全一致,无需区别对待 若遇到权限问题(如EACCES错误),右键终端选择“以管理员身份运行” 2. macOS系统 打开终端的方式: Spotlight搜索(Cmd + 空格)输入terminal打开终端 或在应用程序 > 实用工具中找到终端 或在VS Code中使用集成终端(Cmd + ~) 操作示例: # 设置阿里云源 npm config set registry https://npm.aliyun.com # 查看所有npm配置(包括源) npm config list 特殊说明: macOS默认使用bash或zsh终端,命令与Linux完全一致 若安装全局包时遇到权限问题,可在命令前加sudo(需要输入系统密码):sudo npm install -g nrm # 以管理员权限安装nrm工具 3. Linux系统(Ubuntu、CentOS等) 打开终端的方式: 快捷键Ctrl + Alt + T(大部分Linux发行版通用) 或在应用菜单中找到“终端” 或在VS Code中使用集成终端(Ctrl + ~) 操作示例: # 设置腾讯云源 npm config set registry https://mirrors.cloud.tencent.com/npm/ # 恢复默认官方源 npm config set registry https://registry.npmjs.org 特殊说明: Linux终端权限严格,全局安装包时通常需要sudo:sudo npm config set registry https://mirrors.tuna.tsinghua.edu.cn/npm/ 若使用非root用户且不想频繁输入密码,可配置npm全局目录权限(推荐):# 创建npm全局目录 mkdir ~/.npm-global # 配置npm使用该目录 npm config set prefix '~/.npm-global' # 添加环境变量(需重启终端生效) echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc 三、使用nrm工具快速切换(推荐) nrm是管理npm源的专用工具,可在所有系统中使用,能大幅简化切换操作: 1. 安装nrm # 全局安装nrm(Windows可能需要管理员权限,Linux/macOS可能需要sudo) npm install -g nrm 2. 常用nrm命令 # 查看内置源列表(带*的是当前使用的源) nrm ls # 新增自定义源(例如添加字节跳动源) nrm add bytedance https://registry.bytedance.com # 切换到指定源(例如切换到清华源) nrm use tuna # 测试各源的响应速度(单位:毫秒) nrm test taobao # 单独测试淘宝源 nrm test # 测试所有源 3. 不同系统下的nrm使用差异 Windows:在PowerShell中可能需要执行Set-ExecutionPolicy RemoteSigned开启脚本执行权限 macOS/Linux:若提示command not found: nrm,需检查npm全局目录是否在环境变量中(可重新安装nrm并加sudo) 四、项目级局部换源(所有系统适用) 如果只想为某个项目指定特定源(不影响全局),可在项目根目录创建.npmrc文件: 进入项目目录(通过终端cd命令) 创建并编辑.npmrc文件: Windows:notepad .npmrc(在记事本中打开) macOS:open -e .npmrc(在文本编辑中打开) Linux:nano .npmrc(在nano编辑器中打开) 在文件中写入源地址:# .npmrc内容(示例:使用中科大源) registry=https://mirrors.ustc.edu.cn/npm/ 保存后,该项目的npm操作会优先使用此源 总结 不同操作系统下切换npm源的核心命令完全一致,主要差异在于: 终端的打开方式 权限管理(Linux/macOS的sudo,Windows的“管理员身份运行”) 文本文件编辑工具的选择 推荐使用nrm工具管理多个源,可显著提高切换效率。根据网络环境(国内/国外)选择合适的源,能大幅提升包安装速度。
  • 截至2025年9月常用的npm源大全及详细的换源方法

    教程与经验
    1
    0 赞同
    1 评论
    1 浏览
    风信子
    目录一、国内外常用npm源列表国内源(访问速度快)国外源(适合海外环境)二、换源方法1. 临时换源(单次安装使用)2. 永久换源(全局设置)3. 使用nrm工具管理多源(推荐)4. 项目级单独配置(局部源)三、注意事项 以下是截至2025年9月常用的npm源大全及详细的换源方法,涵盖了国内外多个可用源,不仅包括大厂提供的源,也包含一些特色镜像源: 一、国内外常用npm源列表 国内源(访问速度快) 淘宝 npm 镜像 https://registry.npmmirror.com (原https://registry.npm.taobao.org已更换为此域名,稳定可靠) npm 官方中国镜像 https://registry.npmjs.org.cn (npm官方针对中国地区的镜像) 华为云 npm 镜像 https://mirrors.huaweicloud.com/repository/npm/ (华为云提供的开源镜像,稳定性强) 阿里云 npm 镜像 https://npm.aliyun.com (阿里云开发者平台提供的镜像) 腾讯云 npm 镜像 https://mirrors.cloud.tencent.com/npm/ (腾讯云开源镜像站) 网易 npm 镜像 https://mirrors.163.com/npm/ (网易开源镜像,覆盖全面) 字节跳动 npm 镜像 https://registry.bytedance.com (字节内部源对外开放版本) 清华大学 npm 镜像 https://mirrors.tuna.tsinghua.edu.cn/npm/ (高校镜像,学术环境常用) 中科大 npm 镜像 https://mirrors.ustc.edu.cn/npm/ (中国科学技术大学镜像) 国外源(适合海外环境) npm 官方源 https://registry.npmjs.org Yarn 官方源 https://registry.yarnpkg.com GitHub Packages https://npm.pkg.github.com (需登录GitHub账号,适合私有包) GitLab Packages https://gitlab.com/api/v4/packages/npm/ Firebase 镜像 https://npm.pkg.dev/firebase Cloudflare 镜像 https://registry.npmjs.cf (Cloudflare加速的官方源镜像) 二、换源方法 1. 临时换源(单次安装使用) 安装包时通过--registry参数指定源: npm install 包名 --registry=https://registry.npmmirror.com 2. 永久换源(全局设置) # 设置淘宝镜像 npm config set registry https://registry.npmmirror.com # 设置华为云镜像 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ # 验证当前源 npm config get registry 3. 使用nrm工具管理多源(推荐) nrm是专门管理npm源的工具,可快速切换不同源: # 安装nrm npm install -g nrm # 查看内置源列表 nrm ls # 添加自定义源(例如添加字节跳动源) nrm add bytedance https://registry.bytedance.com # 切换到指定源 nrm use taobao # 切换到淘宝源 nrm use npm # 切换到官方源 # 测试源速度(对比各源响应时间) nrm test taobao 4. 项目级单独配置(局部源) 在项目根目录的.npmrc文件中设置(仅对当前项目生效): # .npmrc文件内容 registry=https://mirrors.tuna.tsinghua.edu.cn/npm/ 三、注意事项 部分私有源(如GitHub Packages)需要先登录才能使用: npm login --registry=https://npm.pkg.github.com 若源访问失败,可通过ping或nrm test检查网络连通性。 切换源后,建议清除缓存避免冲突: npm cache clean --force 企业内部通常有私有npm源(如Verdaccio、Nexus搭建),需咨询内部运维获取地址。 通过以上方法,可根据网络环境和需求灵活选择合适的npm源,提升包安装效率。
  • Node.js适合开发哪些类型的应用程序

    记录与分享 nodejs
    1
    0 赞同
    1 评论
    1 浏览
    首席贫困代表
    目录一、I/O 密集型网络应用(核心优势场景)1. API 服务与微服务2. BFF 层(Backend For Frontend)3. 实时通信应用二、工具类应用(生态与跨平台优势)1. 命令行工具(CLI)2. 跨平台桌面应用三、数据流处理应用(高效 I/O 特性)1. 日志/数据处理服务2. 媒体流服务四、不适合的场景(需规避的领域)总结 Node.js 凭借其“单线程+非阻塞 I/O”的特性,在特定场景中展现出显著优势。它并非“万能解决方案”,但在以下类型的应用程序开发中表现尤为突出: 一、I/O 密集型网络应用(核心优势场景) Node.js 对“频繁读写磁盘、网络通信”的场景支持极佳,这是其最核心的应用领域。 1. API 服务与微服务 适用场景:RESTful API、GraphQL 接口、微服务间通信层。 优势: 非阻塞 I/O 能高效处理高并发请求(如每秒数万次 API 调用)。 轻量级设计(启动快、资源占用低)适合部署多个微服务实例。 与前端共享 JavaScript 代码(如数据验证逻辑),减少冗余开发。 案例: PayPal 用 Node.js 重构 API 后,响应时间减少 35%,代码量减少 30%。 Netflix 的微服务架构中,大量数据聚合 API 基于 Node.js 开发。 2. BFF 层(Backend For Frontend) 适用场景:作为“前端专属后端”,聚合多个服务数据并适配前端需求。 优势: 高效转发/聚合多个后端服务(如用户服务+订单服务+商品服务),减少前端请求次数。 前端开发者可直接参与 BFF 开发(同用 JavaScript),降低团队协作成本。 案例: 阿里、腾讯等大厂的移动端应用,均通过 Node.js 构建 BFF 层,适配不同终端(App/小程序/H5)的数据需求。 3. 实时通信应用 适用场景:即时聊天(如网页版微信)、实时通知(外卖订单状态)、协作工具(多人文档编辑)。 优势: 基于 WebSocket(如 Socket.io 库)实现长连接,支持低延迟双向通信。 单线程模型可高效管理数万并发连接(传统多线程模型难以承受)。 案例: Slack(企业协作工具)用 Node.js 处理实时消息推送,支持百万级并发连接。 腾讯文档的实时协作功能,基于 Node.js 处理多用户同步编辑请求。 二、工具类应用(生态与跨平台优势) Node.js 轻量、跨平台且 npm 生态丰富,是开发工具类应用的理想选择。 1. 命令行工具(CLI) 适用场景:代码检查(ESLint)、构建工具(Webpack)、脚手架(Vue CLI)。 优势: 可直接调用系统命令和文件系统,轻松实现自动化工作流。 npm 提供便捷的 CLI 发布与安装机制(如 npm install -g)。 典型工具: ESLint(代码规范检查)、Prettier(代码格式化)、Jest(测试工具)。 2. 跨平台桌面应用 适用场景:需要在 Windows/macOS/Linux 运行的桌面软件。 实现方式:基于 Electron(Node.js + Chromium)框架,用 HTML/CSS/JS 开发界面,Node.js 处理后端逻辑。 优势: 一套代码适配多平台,无需为不同系统编写原生代码。 前端开发者可直接参与桌面应用开发,复用 Web 技术栈。 案例: VS Code(代码编辑器)、Discord(社交软件)、Figma(设计工具)均基于 Electron 开发。 三、数据流处理应用(高效 I/O 特性) Node.js 对“边读边处理”的流式数据支持出色,适合处理大文件或实时数据流。 1. 日志/数据处理服务 适用场景:实时日志分析(如监控系统)、大文件解析(如 CSV/Excel 导入导出)。 优势: 基于 Stream 模块实现“分块处理”,无需加载整个文件到内存,降低内存占用。 可管道(pipe)方式串联多个处理步骤(如压缩→加密→上传),代码简洁高效。 2. 媒体流服务 适用场景:视频/音频分片传输、实时视频转码(配合 ffmpeg)。 优势: 支持 HTTP 流式传输(如 HLS/DASH 协议),实现“边缓冲边播放”。 非阻塞 I/O 可高效处理多个并发流请求。 四、不适合的场景(需规避的领域) Node.js 并非万能,以下场景需谨慎选择: CPU 密集型应用 如大数据分析、复杂数学计算、视频编码等。单线程模型会被长时间占用,导致事件循环阻塞,影响并发能力(虽可通过多进程/线程缓解,但开发成本高于 Java/Go)。 强事务性业务 如银行转账、订单支付等需要严格事务支持的场景。Node.js 的异步模型对多步操作的事务回滚支持较弱,不如 Java(Spring)、PHP(Laravel)成熟。 总结 Node.js 最适合 I/O 密集型、高并发、实时性要求高 的应用,如 API 服务、实时通信、BFF 层、工具类应用等。其核心优势在于: 高效处理大量并发连接(非阻塞 I/O) 前后端技术栈统一(JavaScript 全栈) 轻量灵活,适合快速开发与微服务架构 选择时需结合业务特点:I/O 密集场景优先考虑,CPU 密集或强事务场景则需评估替代方案。
  • Node.js的单线程模型和非阻塞I/O是如何工作的

    记录与分享 nodejs
    1
    0 赞同
    1 评论
    0 浏览
    首席贫困代表
    目录一、单线程模型:并非“只有一个线程”1. 主线程(JavaScript 执行线程)2. 其他辅助线程(由 libuv 管理)总结:单线程模型的本质二、非阻塞 I/O:主线程从不“等待”1. 主线程发起 I/O 请求,立即“放手”2. libuv 调度 I/O 任务(交给操作系统或线程池)3. I/O 完成后,回调函数进入“事件队列”4. 事件循环(Event Loop)调度回调执行三、单线程 + 非阻塞 I/O 的协同优势四、局限性:不适合 CPU 密集型任务总结 Node.js 的“单线程模型”与“非阻塞 I/O”是其高并发能力的核心,二者相辅相成。理解它们的工作机制,能帮助我们明白为什么 Node.js 能高效处理大量 I/O 密集型任务(如网络请求、文件读写)。 一、单线程模型:并非“只有一个线程” Node.js 的“单线程”特指主线程(JavaScript 执行线程)是单线程,而非整个 Node.js 运行时只有一个线程。其核心构成包括: 1. 主线程(JavaScript 执行线程) 作用:执行 JavaScript 代码(同步代码、回调函数),管理调用栈(Call Stack)和事件队列(Callback Queue)。 特点:同一时间只能执行一段代码(单线程特性),遵循“先进后出”的调用栈规则。 例如,执行以下代码时,主线程会按顺序将函数压入栈中执行: function a() { console.log('a'); } function b() { a(); console.log('b'); } b(); // 调用栈过程:压入 b() → 压入 a() → 执行 a() 并弹出 → 执行 b() 剩余代码并弹出 2. 其他辅助线程(由 libuv 管理) Node.js 底层依赖 libuv(跨平台异步 I/O 库),它会创建一组辅助线程(默认 4 个,可通过 UV_THREADPOOL_SIZE 调整),负责处理两类任务: 阻塞 I/O 操作:如文件读写(fs.readFile)、数据库查询(如 MySQL 查询)等。 CPU 密集型任务:如数据加密(crypto 模块)、压缩(zlib 模块)等。 这些辅助线程独立于主线程,不会阻塞 JavaScript 代码的执行。 总结:单线程模型的本质 “单线程”是指JavaScript 代码的执行由一个主线程负责,但 I/O 操作和 CPU 密集型任务会被“外包”给 libuv 的线程池处理。这种设计避免了多线程切换的开销(传统后端语言的性能瓶颈之一),同时通过辅助线程弥补了单线程的能力局限。 二、非阻塞 I/O:主线程从不“等待” “非阻塞 I/O”是指:当主线程发起 I/O 操作(如读取文件、发送网络请求)时,不会暂停等待操作完成,而是继续执行后续代码;当 I/O 操作完成后,其结果会通过“回调函数”通知主线程处理。 其工作流程可分为 4 步: 1. 主线程发起 I/O 请求,立即“放手” 当代码中遇到 I/O 操作(如 fs.readFile),主线程会: 将 I/O 任务封装成“请求对象”,包含操作参数(如文件路径)和回调函数(操作完成后执行的逻辑)。 把这个请求对象交给 libuv 处理,自己则继续执行后续同步代码(不等待 I/O 完成)。 示例: console.log('开始'); // 发起 I/O 操作(读取文件) fs.readFile('./test.txt', (err, data) => { if (err) throw err; console.log('文件内容:', data.toString()); }); console.log('继续执行'); // 输出顺序:开始 → 继续执行 → 文件内容: ...(I/O 完成后) 2. libuv 调度 I/O 任务(交给操作系统或线程池) libuv 接收请求对象后,会根据 I/O 类型选择处理方式: 非阻塞 I/O 支持的操作(如网络请求、部分文件操作):直接调用操作系统的非阻塞 I/O 接口(如 Linux 的 epoll、Windows 的 IOCP),由操作系统内核处理,完成后通知 libuv。 阻塞 I/O 或 CPU 密集型操作(如某些数据库驱动、压缩):交给 libuv 的线程池处理,线程池中的线程执行任务,完成后通知 libuv。 3. I/O 完成后,回调函数进入“事件队列” 当 I/O 操作完成(无论成功/失败),libuv 会将对应的回调函数(如 fs.readFile 的匿名函数)放入事件队列(Callback Queue) 等待执行。 事件队列是一个“先进先出”的队列,存放所有待执行的回调函数(包括 I/O 回调、定时器回调、事件回调等)。 4. 事件循环(Event Loop)调度回调执行 主线程在完成所有同步代码后,会进入事件循环,不断从事件队列中取出回调函数,压入调用栈执行。 事件循环的核心逻辑是:“同步代码执行完毕 → 处理事件队列中的回调 → 重复此过程”。 其具体阶段(按顺序)如下(简化版): 处理定时器回调(setTimeout/setInterval)。 处理 I/O 回调(如 fs.readFile、网络请求的回调)。 处理 setImmediate 回调(专门设计在 I/O 回调后执行)。 处理关闭事件回调(如 socket.on('close', ...))。 形象比喻: 主线程是“餐厅服务员”,同步代码是“当前顾客的点餐”,I/O 操作是“让后厨做餐”,事件队列是“已做好的餐品队列”,事件循环是“服务员不断检查队列,把做好的餐端给顾客”。服务员(主线程)不会站在后厨等餐(不阻塞),而是继续接待其他顾客(执行同步代码),餐做好后再端上来(执行回调)。 三、单线程 + 非阻塞 I/O 的协同优势 这种模型的核心优势在于高效利用主线程,尤其适合 I/O 密集型场景: 无线程切换开销:单线程避免了多线程间的上下文切换(传统后端语言的性能杀手),主线程可专注处理回调。 高并发支持:一个主线程通过事件循环,能同时处理数万甚至数十万 I/O 请求(因为 I/O 操作主要由操作系统或线程池处理,主线程仅负责调度)。 资源利用率高:非阻塞 I/O 让主线程“不空闲”,始终在处理有意义的工作(同步代码或回调)。 四、局限性:不适合 CPU 密集型任务 单线程模型的短板在于无法高效处理 CPU 密集型任务(如大数组排序、复杂计算): 若主线程执行长时间运行的同步代码(如 for (let i = 0; i < 1e9; i++) {}),会阻塞事件循环,导致事件队列中的回调无法执行(请求超时、界面卡顿)。 虽然 libuv 线程池可分担部分 CPU 任务,但线程池大小有限(默认 4 个),大量 CPU 任务会排队等待,仍会成为瓶颈。 总结 Node.js 的“单线程模型”指 JavaScript 执行依赖一个主线程,而“非阻塞 I/O”通过 libuv 将 I/O 任务交给操作系统或线程池处理,再通过事件循环调度回调执行。二者结合,让 Node.js 能以极低的资源消耗处理海量 I/O 请求,成为 API 服务、实时应用等场景的理想选择。但需注意避开 CPU 密集型任务,或通过多进程(cluster 模块)等方式弥补短板。
  • Vue和React选哪个?

    闲聊吹水 vue 前端框架
    2
    0 赞同
    2 评论
    5 浏览
    首席贫困代表
    没得选,公司要求啥就是啥
  • Node.js 发展史与全方位解析

    记录与分享 nodejs
    1
    0 赞同
    1 评论
    2 浏览
    首席贫困代表
    目录一、Node.js 发展史(时间线梳理)1. 起源:2009 年,为解决“高并发 I/O”而生2. 早期迭代:2010-2014 年,生态萌芽与社区争议3. 整合与规范化:2015-2016 年,统一生态与 LTS 策略4. 成熟与优化:2017-至今,性能升级与特性拓展二、Node.js 全方位解析1. 本质:不是“语言”,而是“JS 运行时”2. 核心特性:为何 Node.js 能成为“高并发利器”(1)单线程 + 事件循环:避免线程切换开销(2)非阻塞 I/O:提升资源利用率(3)跨平台与轻量3. 架构组成:从底层到上层的分层设计4. 生态系统:npm 与核心工具链(1)npm:全球最大的 JS 包管理器(2)核心 Web 框架(3)其他核心工具5. 应用场景:适合与不适合的领域(1)适合的场景(2)不适合的场景6. 优缺点分析7. 当前发展现状三、总结 Node.js 并非一门编程语言,而是基于 Chrome V8 引擎的 JavaScript 运行时(Runtime),它让 JavaScript 脱离浏览器环境,具备了在服务器端执行的能力,彻底改变了“JavaScript 只能用于前端”的认知,推动了全栈 JavaScript 开发的浪潮。 一、Node.js 发展史(时间线梳理) Node.js 的发展历程围绕“解决高性能 I/O 问题”展开,经历了起源、分叉、整合、稳定优化四个关键阶段,核心节点如下: 1. 起源:2009 年,为解决“高并发 I/O”而生 背景:2000 年后,Web 应用对“高并发”需求激增(如实时聊天、电商秒杀),但传统后端语言(Java、PHP)采用“多线程模型”——每处理一个请求创建一个线程,线程切换成本高,难以应对万级并发;而 JavaScript 天生的单线程+事件驱动特性,恰好适合处理“I/O 密集型”任务(如数据库查询、文件读写、网络请求)。 创始人:Ryan Dahl(美国程序员),他在 2009 年的 JSConf.eu 大会上首次展示 Node.js,核心目标是“用 JavaScript 构建高效的服务器端应用”。 核心选择: 基于 Chrome V8 引擎:V8 是 Google 为 Chrome 开发的 JS 引擎,能将 JS 代码直接编译为机器码(而非字节码),执行效率远超当时的其他 JS 引擎(如 SpiderMonkey)。 引入 libuv 库:跨平台的异步 I/O 库(支持 Windows/Linux/macOS),负责处理非阻塞 I/O、事件循环、线程池,是 Node.js 高并发能力的核心。 2. 早期迭代:2010-2014 年,生态萌芽与社区争议 2010 年:发布 Node.js 0.2.0,首次支持 npm(Node Package Manager)——由 Isaac Zuckerman 开发的包管理工具,彻底解决了 JS 模块依赖问题,为生态爆发奠定基础。 2011 年:Node.js 0.6.0 发布,整合了 libuv 1.0,性能大幅提升;同时,首个核心 Web 框架 Express.js 诞生,简化了 HTTP 服务开发(如路由、中间件),成为早期 Node.js 开发者的“标配”。 2014 年:社区矛盾激化——Node.js 核心团队(由 Joyent 公司主导)对版本更新、特性支持(如 ES6 语法)态度保守,导致部分核心贡献者(如 Fedor Indutny)分叉(Fork)出 io.js,目标是“更快迭代、支持 ES6、开放治理”。 io.js 短期内快速迭代,支持了 let/const、箭头函数等 ES6 特性,吸引了大量开发者,形成“Node.js 与 io.js 并存”的局面。 3. 整合与规范化:2015-2016 年,统一生态与 LTS 策略 2015 年 9 月:为避免生态分裂,Joyent 宣布将 Node.js 与 io.js 合并,成立 Node.js 基金会(后于 2019 年并入 OpenJS Foundation,与 jQuery、WebPack 等项目同属一个组织),实现了社区统一。 2015 年 10 月:发布 Node.js 4.0.0,整合了 io.js 的 ES6 支持,同时保留了原 Node.js 的 API 兼容性,标志着生态正式统一。 2016 年 10 月:发布 Node.js 6.0.0,并首次引入 LTS(Long-Term Support,长期支持)策略——将版本分为“稳定版(Current)”和“LTS 版”: LTS 版:提供 18 个月的主动支持(Bug 修复、安全更新)+ 12 个月的维护支持,适合企业级应用(如 Node.js 8.x LTS、10.x LTS、14.x LTS)。 稳定版:每 6 个月更新一次,包含最新特性,但支持周期短(仅 8 个月),适合尝鲜或非核心业务。 LTS 策略的推出,解决了企业“不敢用 Node.js 做核心服务”的顾虑,推动 Node.js 大规模进入生产环境(如阿里、腾讯、Netflix、Uber 等企业开始全面采用)。 4. 成熟与优化:2017-至今,性能升级与特性拓展 2017 年:Node.js 8.0.0 发布,支持 Async/Await(ES2017 特性),彻底解决了“回调地狱”问题,简化了异步代码编写;同时,util.promisify 工具推出,将传统回调 API(如 fs.readFile)转换为 Promise API。 2018 年:Node.js 10.0.0 发布,实验性支持 ES 模块(ESM,即 import/export)(此前 Node.js 仅支持 CommonJS 模块,即 require/module.exports);同时,引入 worker_threads 模块,支持多线程,缓解了“单线程处理 CPU 密集型任务”的短板。 2020 年:Node.js 14.0.0 发布,将 ES 模块设为稳定特性(需在 package.json 中添加 "type": "module"),实现了与浏览器 JS 模块的兼容;同时,支持 Top-Level Await(顶层 await,无需包裹在 async 函数中)。 2022 年:Node.js 18.0.0 发布,内置 fetch API(与浏览器一致),无需再依赖 axios、node-fetch 等第三方库即可发起 HTTP 请求;同时,支持 Web Streams,优化了大文件处理(如视频流、日志流)的性能。 2024 年:当前最新 LTS 版本为 Node.js 20.x LTS(支持至 2026 年 4 月),稳定版为 Node.js 22.x,持续优化 V8 引擎(升级至 V8 12.4)、libuv(支持 QUIC 协议),进一步提升并发性能和跨平台兼容性。 二、Node.js 全方位解析 1. 本质:不是“语言”,而是“JS 运行时” 很多初学者会误以为 Node.js 是一门新语言,实际它的核心是“让 JS 能在服务器端运行的环境”,结构可概括为: Node.js = Chrome V8 引擎 + libuv + 核心模块(fs/http/path 等) + 第三方模块(npm 包) Chrome V8 引擎:负责解析和执行 JavaScript 代码,将 JS 编译为机器码,保证执行效率。 libuv:跨平台异步 I/O 库,是 Node.js“非阻塞 I/O”和“事件循环”的实现核心,同时管理线程池(默认 4 个线程,处理 CPU 密集型任务)。 核心模块:Node.js 内置的 API 模块,覆盖文件操作(fs)、网络请求(http)、路径处理(path)、事件监听(events)等基础能力,无需安装即可使用。 第三方模块:通过 npm 安装的开源模块(如 Express、NestJS、Mongoose),覆盖 Web 开发、数据库连接、日志处理等场景,目前 npm 仓库已拥有超过 200 万个包,是全球最大的开源包管理生态之一。 2. 核心特性:为何 Node.js 能成为“高并发利器” Node.js 的核心竞争力源于其独特的“事件驱动、非阻塞 I/O”模型,具体特性如下: (1)单线程 + 事件循环:避免线程切换开销 单线程:Node.js 主线程是“单线程”——即只有一个主线程处理请求,但并非“所有任务都在主线程执行”: 主线程:负责执行 JS 代码、处理事件循环、分发 I/O 任务。 线程池(由 libuv 管理):默认 4 个线程,负责处理“CPU 密集型任务”(如加密、压缩)和“阻塞 I/O 任务”(如数据库查询、文件读写),主线程无需等待,只需在任务完成后接收回调结果。 事件循环(Event Loop):Node.js 处理异步任务的核心机制,本质是“一个循环队列,不断从事件队列中取出回调函数执行”,分为 6 个阶段(按顺序执行): timers:执行 setTimeout/setInterval 的回调(检查是否到时间)。 pending callbacks:执行延迟到下一轮的 I/O 回调(如 TCP 错误处理)。 idle/prepare:内部使用,开发者无需关注。 poll:核心阶段——执行 I/O 回调(如 fs.readFile、数据库查询),若事件队列空则阻塞等待。 check:执行 setImmediate 的回调(在 poll 阶段后立即执行)。 close callbacks:执行关闭回调(如 socket.on('close', ...))。 比喻理解:事件循环像“餐厅服务员”——主线程是服务员,负责记录顾客需求(回调函数),后厨(线程池)负责做菜(处理 I/O/CPU 任务);服务员无需等待菜做好,只需在菜做好后(任务完成)将菜端给顾客(执行回调),因此能同时服务多个顾客(高并发)。 (2)非阻塞 I/O:提升资源利用率 “非阻塞 I/O”指:主线程发起 I/O 任务(如读取文件)后,无需等待任务完成,而是继续处理其他任务;当 I/O 任务完成后,通过“事件通知”机制,将回调函数加入事件队列,等待主线程执行。 对比传统“阻塞 I/O”: 模型 处理方式 并发能力 资源利用率 阻塞 I/O(如 PHP) 一个请求占用一个线程,线程等待 I/O 完成 低(线程切换成本高) 低 非阻塞 I/O(Node.js) 主线程分发 I/O,回调处理结果 高(单线程处理万级并发) 高 (3)跨平台与轻量 基于 libuv 实现跨平台,可在 Windows、Linux、macOS 上运行,开发者无需修改代码即可适配多系统。 运行时体积小(安装包约 20-50MB),启动速度快(毫秒级),适合开发轻量级服务或微服务。 3. 架构组成:从底层到上层的分层设计 Node.js 采用分层架构,自下而上分为 4 层,每层职责明确: 层级 核心组件 功能描述 底层驱动层 libuv、V8 引擎、http_parser 等 提供异步 I/O、JS 执行、HTTP 解析等基础能力 核心模块层 fs、http、path、events、net 等 封装底层能力,提供开发者可调用的 API 第三方模块层 Express、NestJS、Mongoose、axios 等 基于核心模块扩展,解决特定场景问题(如 Web 开发、数据库连接) 应用层 开发者编写的业务代码 基于上述层级实现具体业务逻辑(如 API 服务、实时聊天) 4. 生态系统:npm 与核心工具链 Node.js 的生态是其成功的关键,核心围绕 npm 展开,同时包含大量成熟的框架和工具: (1)npm:全球最大的 JS 包管理器 功能:管理项目依赖(安装、更新、卸载包)、发布自己的包、脚本执行(如 npm run dev)。 衍生工具: yarn:2016 年由 Facebook 开发,解决早期 npm 依赖树混乱、安装慢的问题,支持“锁定版本”(yarn.lock)。 pnpm:2017 年发布,采用“硬链接+符号链接”机制,节省磁盘空间(多个项目共享同一包的副本),安装速度比 npm/yarn 快 2-3 倍,目前已成为很多大型项目的首选。 (2)核心 Web 框架 框架 特点 适用场景 Express.js 轻量级、灵活,中间件生态丰富 快速开发小型 API、博客、CMS 等 NestJS 基于 TypeScript,模块化、依赖注入,支持微服务 企业级应用(如电商后台、金融系统) Koa.js 由 Express 团队开发,更简洁,中间件采用洋葱模型 需高度定制化的服务(如中间件开发) Fastify 高性能(比 Express 快 2-3 倍),支持 JSON schema 校验 高并发 API 服务(如秒杀、实时数据接口) (3)其他核心工具 数据库驱动:Mongoose(MongoDB ODM)、Sequelize(SQL ORM,支持 MySQL/PostgreSQL)、TypeORM(TypeScript 友好的 ORM)。 构建工具:Webpack(前端打包)、Rollup(JS 模块打包)、Gulp(任务自动化,如压缩、编译)。 CLI 工具:Vue CLI(Vue 项目脚手架)、Create React App(React 项目脚手架)、Nest CLI(NestJS 项目脚手架)。 实时通信:Socket.io(封装 WebSocket,支持跨浏览器兼容)、ws(轻量级 WebSocket 库)。 桌面应用:Electron(基于 Node.js + Chromium,开发跨平台桌面应用,如 VS Code、Slack、Figma)。 5. 应用场景:适合与不适合的领域 Node.js 并非“万能”,需根据任务类型选择,核心适合 I/O 密集型任务,不适合 CPU 密集型任务(可通过多进程/多线程缓解)。 (1)适合的场景 API 服务:如 RESTful API、GraphQL API,非阻塞 I/O 能高效处理大量并发请求(如电商商品接口、用户登录接口)。 BFF 层(Backend For Frontend):作为“前端专属后端”,聚合多个微服务数据(如用户服务、订单服务),适配前端需求,减少前端请求次数(阿里、腾讯广泛采用)。 实时应用:如实时聊天(微信网页版)、实时通知(外卖订单状态)、实时协作工具(腾讯文档),基于 WebSocket 实现低延迟通信。 工具开发:如代码检查(ESLint)、代码格式化(Prettier)、构建工具(Webpack),Node.js 轻量且跨平台的特性适合开发命令行工具。 桌面应用:基于 Electron 开发跨平台桌面软件(如 VS Code、Discord、Notion),实现“一次编写,多端运行”。 (2)不适合的场景 CPU 密集型任务:如大数据分析、视频编码、复杂加密计算——单线程会被长时间占用,导致其他请求阻塞(虽可通过 cluster 模块开启多进程或 worker_threads 开启多线程,但开发成本高于 Java、Go)。 强事务性业务:如银行转账、订单支付——Node.js 的异步模型对事务控制(如多步数据库操作回滚)支持不如 Java(Spring)、PHP(Laravel)成熟,需额外封装逻辑。 6. 优缺点分析 优点 缺点 1. 高并发能力:非阻塞 I/O 适合处理万级并发请求,资源利用率高。 1. CPU 密集型短板:单线程处理 CPU 密集任务会阻塞,需额外处理多进程/线程。 2. 全栈统一:前后端均使用 JavaScript,减少语言切换成本,共享工具链(如 TypeScript)。 2. 回调地狱(历史问题):早期异步代码依赖嵌套回调,虽可通过 Async/Await 解决,但老项目仍有遗留。 3. 生态丰富:npm 拥有 200 万+ 包,覆盖几乎所有开发场景,开发效率高。 3. 回调优先级问题:事件循环阶段的回调优先级可能导致逻辑混乱(如 setTimeout 与 setImmediate 执行顺序不确定)。 4. 轻量跨平台:启动快、体积小,可在多系统运行,适合微服务和边缘计算。 4. 内存限制:默认内存限制较低(32 位系统约 512MB,64 位约 1.4GB),处理大文件需手动调整内存参数。 7. 当前发展现状 社区活跃度:OpenJS Foundation 主导,全球有上万名贡献者,GitHub 仓库(nodejs/node)星数超过 10 万,是最受欢迎的后端项目之一。 企业 adoption:Netflix(流媒体服务)、Uber(打车平台)、PayPal(支付)、阿里(淘宝/支付宝)、腾讯(微信/QQ)等企业均将 Node.js 用于核心业务,验证了其生产环境稳定性。 未来趋势: 性能优化:持续升级 V8 引擎(提升 JS 执行速度)、优化 libuv(支持 QUIC 协议、更好的多核利用)。 标准对齐:进一步兼容浏览器 JS 特性(如 Web Streams、fetch、ESM),减少“前端与后端 JS 差异”。 生态深化:NestJS 等企业级框架持续完善,微服务、Serverless 场景支持更成熟(如 AWS Lambda、阿里云函数计算均原生支持 Node.js)。 三、总结 Node.js 的诞生,本质是“将 JavaScript 从前端推向全栈”的革命——它通过“单线程+非阻塞 I/O”模型,解决了传统后端语言在高并发 I/O 场景下的痛点,同时依托 npm 生态和跨平台特性,成为开发者快速构建服务的首选工具之一。 尽管它在 CPU 密集型任务上存在短板,但通过多进程/线程扩展、生态工具补充,已能覆盖大部分后端场景。如今,Node.js 不仅是“前端开发者的后端工具”,更是企业级应用、微服务、实时系统的重要技术选型,未来仍将在全栈开发领域发挥核心作用。
  • CentOS系统中常用的配置命令大全

    教程与经验
    1
    0 赞同
    1 评论
    1 浏览
    慢羊羊爱上美羊羊
    目录一、系统信息与管理二、网络配置三、用户与权限管理四、服务管理五、软件包管理六、防火墙配置七、SELinux配置八、定时任务九、磁盘管理 以下是CentOS系统中常用的配置命令大全,涵盖网络、用户、服务、软件管理等多个方面: 一、系统信息与管理 # 查看系统版本 cat /etc/centos-release cat /etc/redhat-release # 查看内核版本 uname -r uname -a # 查看系统信息 hostnamectl lsb_release -a # 需安装redhat-lsb # 查看系统资源使用情况 top htop # 需安装 free -h df -h du -sh * # 查看系统运行时间 uptime 二、网络配置 # 查看网络接口信息 ip addr ifconfig # 需安装net-tools # 查看路由信息 ip route route -n # 需安装net-tools # 重启网络服务 # CentOS 7 systemctl restart network # CentOS 8及以上 nmcli c reload nmcli c up 接口名称 # 查看DNS配置 cat /etc/resolv.conf # 测试网络连通性 ping 目标IP/域名 traceroute 目标IP/域名 # 需安装traceroute curl 网址 wget 网址 # 下载文件 三、用户与权限管理 # 创建用户 useradd 用户名 # 设置用户密码 passwd 用户名 # 创建用户组 groupadd 组名 # 将用户加入组 usermod -aG 组名 用户名 # 查看用户所属组 groups 用户名 # 切换用户 su - 用户名 # 删除用户 userdel -r 用户名 # -r同时删除用户家目录 # 修改文件权限 chmod 755 文件名 chmod u+x 文件名 # 修改文件所有者 chown 用户名:组名 文件名 四、服务管理 # 查看服务状态 systemctl status 服务名 # 启动服务 systemctl start 服务名 # 停止服务 systemctl stop 服务名 # 重启服务 systemctl restart 服务名 # 设置服务开机自启 systemctl enable 服务名 # 禁止服务开机自启 systemctl disable 服务名 # 查看所有服务状态 systemctl list-unit-files --type=service 五、软件包管理 # 安装软件包 yum install 软件名 dnf install 软件名 # CentOS 8及以上推荐 # 卸载软件包 yum remove 软件名 dnf remove 软件名 # 更新软件包 yum update 软件名 dnf update 软件名 # 更新系统所有软件 yum update dnf update # 搜索软件包 yum search 关键词 dnf search 关键词 # 查看已安装软件 yum list installed dnf list installed # 清理缓存 yum clean all dnf clean all 六、防火墙配置 # 查看防火墙状态 systemctl status firewalld # 启动防火墙 systemctl start firewalld # 关闭防火墙 systemctl stop firewalld # 开放端口 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-port=3000-3010/tcp --permanent # 关闭端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent # 重新加载防火墙规则 firewall-cmd --reload # 查看已开放端口 firewall-cmd --zone=public --list-ports 七、SELinux配置 # 查看SELinux状态 getenforce sestatus # 临时关闭SELinux setenforce 0 # 临时开启SELinux setenforce 1 # 永久关闭SELinux(需重启) sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 八、定时任务 # 编辑当前用户的定时任务 crontab -e # 查看当前用户的定时任务 crontab -l # 删除当前用户的定时任务 crontab -r # 查看定时任务日志 tail -f /var/log/cron 九、磁盘管理 # 查看磁盘分区 fdisk -l # 磁盘分区 fdisk /dev/sdX # X为磁盘设备名 # 格式化分区 mkfs.ext4 /dev/sdX1 mkfs.xfs /dev/sdX1 # 挂载分区 mount /dev/sdX1 /挂载点 # 卸载分区 umount /挂载点 # 设置开机自动挂载 # 编辑/etc/fstab添加如下行 /dev/sdX1 /挂载点 ext4 defaults 0 0 这些命令覆盖了CentOS日常管理和配置的大部分场景,根据具体需求选择使用。对于不同版本的CentOS,部分命令可能略有差异,建议结合官方文档使用。
  • 在CentOS系统中修改为固定IP后无法连接网络怎么办?

    教程与经验
    1
    0 赞同
    1 评论
    0 浏览
    慢羊羊爱上美羊羊
    目录1. 检查网络配置文件是否正确2. 重启网络服务3. 检查网络连通性4. 常见问题及解决方法5. 查看错误日志 当在CentOS系统中设置固定IP后无法连接网络时,可以按照以下步骤排查和解决问题: 1. 检查网络配置文件是否正确 首先确认配置文件中的参数是否准确: # 编辑配置文件 sudo vi /etc/sysconfig/network-scripts/ifcfg-你的接口名称 # 关键参数检查要点: - IPADDR是否与网关在同一网段 - NETMASK子网掩码是否正确(通常是255.255.255.0) - GATEWAY是否填写正确(可通过路由器管理页面查看) - DNS1是否有效(推荐使用公共DNS:114.114.114.114或8.8.8.8) - ONBOOT是否设置为yes - 是否有多余的冲突配置 2. 重启网络服务 修改配置后需要重启网络服务使设置生效: # CentOS 7 sudo systemctl restart network sudo systemctl status network # 检查服务状态 # CentOS 8及以上 sudo nmcli c reload sudo nmcli c up 你的接口名称 3. 检查网络连通性 # 检查是否获取到设置的IP ip addr show 你的接口名称 # 测试网关连通性 ping 你的网关地址(如:ping 192.168.1.1) # 测试DNS解析 ping www.baidu.com # 测试域名解析 ping 114.114.114.114 # 测试直连DNS服务器 4. 常见问题及解决方法 网关不可达: 确认网关地址是否正确 检查物理连接或虚拟机网络模式是否正确(桥接模式需确保和主机同网段) DNS解析失败: 检查/etc/resolv.conf文件是否包含正确的DNS配置 可以手动添加:sudo echo "nameserver 114.114.114.114" >> /etc/resolv.conf IP地址冲突: 更换一个IP地址,确保没有其他设备使用相同IP 防火墙限制: 暂时关闭防火墙测试是否是其导致的问题:sudo systemctl stop firewalld SELinux问题: 临时关闭SELinux测试:sudo setenforce 0 5. 查看错误日志 如果以上方法无效,可以查看网络相关日志定位问题: # 查看网络服务日志 journalctl -u network # 查看系统日志中的网络相关错误 grep -i network /var/log/messages 通过以上步骤,通常能解决大部分固定IP设置后的网络连接问题。如果是虚拟机环境,还需要检查虚拟机软件的网络配置是否与系统内的设置相匹配。
  • 0 赞同
    1 评论
    4 浏览
    慢羊羊爱上美羊羊
    目录1. 首先查看当前网络接口名称:2. 编辑网络配置文件:3. 在文件中修改或添加以下配置:4. 保存文件并重启网络服务:5. 验证配置是否生效: 1. 首先查看当前网络接口名称: ip addr 通常会看到类似ens33、eth0这样的接口名称 2. 编辑网络配置文件: sudo vi /etc/sysconfig/network-scripts/ifcfg-你的接口名称 (将"你的接口名称"替换为实际的接口名,如ifcfg-ens33) 3. 在文件中修改或添加以下配置: BOOTPROTO=static # 改为静态IP ONBOOT=yes # 开机启动 IPADDR=192.168.1.100 # 你想要设置的固定IP NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.1.1 # 网关地址 DNS1=8.8.8.8 # DNS服务器1 DNS2=8.8.4.4 # DNS服务器2(可选) 4. 保存文件并重启网络服务: # CentOS 7 sudo systemctl restart network # CentOS 8 / Rocky Linux / AlmaLinux sudo nmcli c reload sudo nmcli c up 你的接口名称 5. 验证配置是否生效: ip addr show 你的接口名称 注意: 确保设置的IP地址与你的网络环境相匹配 网关和DNS地址需要根据你的实际网络情况填写 如果使用的是虚拟机,还需要在虚拟机软件中设置相应的网络模式(通常为桥接模式或仅主机模式)
  • ubuntu如何通过命令修改默认dns

    系统与软件 ubuntu
    1
    0 赞同
    1 评论
    1 浏览
    一级保护废物
    目录方法 1:通过 resolvconf 工具(适用于大多数系统)方法 2:直接编辑 resolv.conf(临时生效)方法 3:使用 netplan(适用于 Ubuntu 18.04 及以上版本) 在 Ubuntu 系统中,你可以通过命令行修改默认 DNS 服务器。具体方法取决于你的 Ubuntu 版本和所使用的网络管理工具。 方法 1:通过 resolvconf 工具(适用于大多数系统) 首先安装 resolvconf(如果未安装): sudo apt update && sudo apt install resolvconf 启动并启用服务: sudo systemctl start resolvconf sudo systemctl enable resolvconf 编辑配置文件: sudo nano /etc/resolvconf/resolv.conf.d/head 添加 DNS 服务器地址: nameserver 8.8.8.8 # Google DNS nameserver 8.8.4.4 # Google DNS 备用 你也可以使用其他 DNS,如 Cloudflare 的 1.1.1.1 或 Quad9 的 9.9.9.9 保存文件并重启服务: sudo systemctl restart resolvconf 方法 2:直接编辑 resolv.conf(临时生效) 如果只是临时修改 DNS,可以直接编辑 /etc/resolv.conf: sudo nano /etc/resolv.conf 添加 DNS 服务器: nameserver 8.8.8.8 nameserver 8.8.4.4 注意:这种方法在系统重启或网络服务重启后可能会失效,因为该文件可能被网络管理工具自动覆盖。 方法 3:使用 netplan(适用于 Ubuntu 18.04 及以上版本) 找到 netplan 配置文件(通常在 /etc/netplan/ 目录下): ls /etc/netplan/ 编辑配置文件(文件名可能不同): sudo nano /etc/netplan/01-network-manager-all.yaml 在配置中添加 DNS 服务器: network: version: 2 renderer: NetworkManager ethernets: eth0: # 替换为你的网卡名称 dhcp4: yes nameservers: addresses: [8.8.8.8, 8.8.4.4] 应用配置: sudo netplan apply 修改完成后,可以通过以下命令验证 DNS 设置: cat /etc/resolv.conf
  • 如何选适合自己的域名

    闲聊吹水
    1
    0 赞同
    1 评论
    2 浏览
    一级保护废物
    目录一、先想清楚:你用域名做什么?二、好域名的3个核心:短、好记、不绕口三、后缀怎么选?优先这几个四、这些坑千万别踩五、用工具找域名,效率更高六、总结:3步搞定域名 域名就是你在网上的“门牌号”,好记、贴合需求,别人才容易找到你。不管是做个人博客、企业官网,还是开网店,选对域名都是第一步。下面用简单的话,教你怎么挑域名。 一、先想清楚:你用域名做什么? 不同用途,选域名的思路不一样,先对号入座: 个人用(博客/展示自己):优先用自己的名字(拼音/英文名),比如“lisi.com”“wangwu1990.com”,好记又能突出身份。 企业/品牌用:直接用品牌名,比如“haier.com”“xiaomi.com”,用户一看就知道是你的品牌,别搞复杂缩写(除非大家都知道,比如“JD.com”)。 做业务/网店:带点业务关键词,比如开鲜花店就用“huahuadian.com”,做北京本地装修就用“beijingzhuangxiu.com”,用户一看就知道你是干啥的。 保护品牌:如果主域名(比如“你的品牌.com”)注册了,最好把相似的也占了,比如“你的品牌.cn”“你的品牌.net”,防止别人抢注蹭流量。 二、好域名的3个核心:短、好记、不绕口 别搞复杂!记住“越简单越好”,重点看这3点: 越短越好:尽量控制在10个字符内(比如“taobao.com”才7个),太长了用户记不住,输的时候还容易错(比如“zhangsanwuxianxiaoshou.com”,谁能一次记对?)。 别用生僻字、怪组合: 不选不认识的词(比如“耄耋(maodie).com”,多数人不会读); 别加没用的数字/符号,比如“lisi123.com”“li-si.com”,数字难记,符号容易漏输; 别写错别字,比如“piza.com”(正确是“pizza”),用户输错就找不到你了。 读着顺口,没坏谐音: 比如“xiaomi.com”“jingdong.com”,读一遍就记住,适合朋友间推荐; 避开不好的谐音,比如“siqi.com”(像“死期”)、“shangwu.com”如果做食品,别让人联想到“伤物”。 三、后缀怎么选?优先这几个 域名最后面的“.com”“.cn”就是后缀,别乱选,看用途: 首选.com:全球都认识,不管个人还是企业用都合适,就是好域名基本被抢光了,能拿到最好。 备选.cn:针对国内用户(比如做本地生意、国内官网),大家也熟悉,注册还便宜。 其他常用的:.net(和.com差不多,没.com时选它)、.org(适合公益、个人博客,企业别优先用)。 特色后缀(谨慎选):比如.tech(科技类)、.shop(网店)、.blog(博客),虽然贴合业务,但很多人不熟悉,怕用户以为是“假网站”,除非你的用户都是行业里的人(比如做科技的用.tech)。 四、这些坑千万别踩 别侵权:不用知名品牌的词,比如“apple-phone.com”“tencent-game.com”,会被告;也别模仿知名域名,比如“baidou.com”(仿“baidu.com”),像山寨,还违法。 国内用要备案:如果服务器在国内(比如用阿里云、腾讯云),选.cn、.com.cn这些后缀,必须去工信部备案(免费,要身份证/营业执照),不然网站打不开;如果用.com且服务器在国外(比如香港),可以不备案,但访问速度可能慢。 别选太局限的:比如现在做“上海宠物粮”,别选“shanghaichongwuliang.com”,万一以后想做全国宠物用品,这域名就没用了,不如选“chongwuyongpin.com”,留余地。 五、用工具找域名,效率更高 手动想太费时间,用这些工具帮你: 查域名是否可用:去阿里云、腾讯云的“域名注册”页面,输入你想要的词,就能看有没有被注册,多少钱。 想不出词?要灵感:用Domainwheel(搜这个英文名),输入关键词(比如“旅行”),会自动帮你组合“lvxingblog.com”“bestlvxing.com”这类,还标是否可用。 查域名历史:如果看中的域名以前被用过,用Archive.org(叫“时光机”),能看它以前是做什么的,别接手有违规内容的域名。 六、总结:3步搞定域名 定用途:想清楚是个人用、企业用,还是做业务,确定核心词(名字/品牌名/业务词); 筛样子:按“短、好记、顺口”筛,先试“核心词+.com”,不行再试.cn或调整词; 避风险:查有没有侵权、不良历史,国内用记得备案。 选域名不用追求“完美”,但一定要“合适”——自己好记,用户也能轻松找到,就够了。
  • git推送时提示error: failed to push some refs to

    已解决 提问与解答
    5
    0 赞同
    5 评论
    4 浏览
    十二
    @小黑 感谢
  • 国庆中秋双节同贺

    闲聊吹水
    2
    0 赞同
    2 评论
    2 浏览
    十二
    同乐
  • 致敬 2025 各位还在运营个人独立博客的我们

    已移动 博客集
    1
    0 赞同
    1 评论
    3 浏览
    博客集
    凌晨一点的台灯下,刚给服务器续完费的鼠标还带着余温,后台跳出条新评论:“三年前你写的那篇建站教程,今天终于帮我搭好第一个博客了。” 窗外是短视频平台推送的 15 秒热点交替闪烁,而我盯着屏幕上那句留言,突然想给 2025 年还在敲键盘的我们,写一封迟到的情书。 还记得今年春天清理后台时的恍惚吗?翻到 2020 年的旧文,那时还在纠结 WordPress 主题要不要加夜间模式,如今已经能熟练用 AI 生成初稿,再逐字注入自己的语气 —— 就像给机器骨架贴上带温度的皮肤。有次朋友刷到我的博客,笑着说 “现在谁还看长文啊”,我没反驳,只是把后台显示的 “某篇 2023 年的技术文今日新增 5 次阅读” 截图存进了文件夹。这届读者很聪明,他们分得清哪些是 AI 拼凑的模板,哪些是熬了三个晚上啃透原理后写下的真心。 我们都曾遭遇过 “数字冷宫” 吧?花一周写的深度分析,阅读量不及短视频平台随手发的日常;调试了半天的 AR 交互插件,评论区只有两条问 “怎么打不开”。有位技术博主在社群里说,他曾盯着日均 700 的 IP 数发呆,直到某天收到字节的面试邀请,面试官说 “你博客里关于区块链共识机制的思考,比简历值钱多了”。原来那些无人问津的坚持,都在悄悄给我们的人生铺路。就像有人用博客记录育儿心得,三年后整理成电子书;有人靠分享服务器运维经验,结识了能远程调试代码的挚友,这些都是算法推荐给不了的礼物。 2025 年的博客早不是单打独斗的战场了。我见过有人在文章里嵌入可交互的代码块,读者能直接在线运行调试;也试过用 AI 插件做了个 “历史问答” 功能,老读者翻到旧文还能随时提问。上周和一位坚持 11 年的博主聊天,他说现在博客收入能覆盖生活开支了 —— 广告分成够交服务器费,知识付费的收入能支撑去实地考察写深度报道。那些曾经被嘲笑 “不赚钱” 的坚持,在商业化多元化的今天,终于长出了果实。 偶尔也会羡慕短视频博主的流量神话,但指尖划过自己博客的归档页时,又觉得这份 “慢” 格外珍贵。朋友圈的动态三天后就沉底,而我们的文字能在三年后还被搜索引擎打捞,成为陌生人的解题钥匙。有位旅行博主说,她的丝绸之路系列博文,三年积累了 50 万粉丝,有人因为她的文字真的踏上了那段旅程,这种连接比直播打赏更让人踏实。 此刻或许你正对着空白文档发愁,或许刚处理完服务器的突发故障,或许在纠结要不要尝试新的内容形式。但请记得,2025 年的数字世界里,我们这些守着一方自留地的人,正在做一件特别酷的事:用文字对抗信息碎片化,用原创坚守思考的深度,用长久的陪伴代替瞬时的狂欢。 敬我们这些 “不合时宜” 的坚持,敬每一篇被用心写下的文字,敬这个还愿意为深度思考驻足的时代。下一个深夜,当后台跳出新的互动提醒,我们依然会笑着点开 —— 因为这里不仅有我们的足迹,更有彼此的星光。
  • 0 赞同
    1 评论
    5 浏览
    小黑
    目录一、最常见情况:远程有新提交未同步到本地错误完整提示产生原因解决步骤二、本地分支与远程分支不存在关联错误完整提示产生原因解决步骤三、推送了超过限制的大文件错误完整提示产生原因解决步骤四、权限不足导致推送失败错误完整提示产生原因解决步骤五、强制推送(谨慎使用)注意事项六、总结解决流程 “error: failed to push some refs to” 是Git推送代码时最常见的错误之一,通常伴随着提示信息说明具体原因。这个错误本质上表示本地代码无法顺利推送到远程仓库,下面分情况详细介绍解决办法。 一、最常见情况:远程有新提交未同步到本地 错误完整提示 error: failed to push some refs to 'git@gitee.com:your-username/your-repo.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. 产生原因 远程仓库已经有了新的提交记录(可能是其他人推送的),而你的本地仓库没有这些记录,Git为了防止覆盖远程代码而拒绝推送。 解决步骤 拉取远程最新代码并合并到本地 # 拉取当前分支对应的远程分支代码 git pull origin 分支名 # 例如拉取main分支 git pull origin main 处理可能的合并冲突 如果拉取后出现冲突,Git会提示哪些文件有冲突 打开这些文件,寻找冲突标记:<<<<<<< HEAD 你的本地代码 ======= 远程仓库的代码 >>>>>>> commit-id 编辑文件,保留需要的代码,删除所有冲突标记(<<<<<<<、=======、>>>>>>>) 完成合并并推送 # 标记为已解决冲突 git add . # 提交合并结果 git commit -m "合并远程最新代码,解决冲突" # 再次推送 git push origin 分支名 二、本地分支与远程分支不存在关联 错误完整提示 error: failed to push some refs to 'git@gitee.com:your-username/your-repo.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 产生原因 本地分支未与远程分支建立关联关系,或者远程分支是新建的,本地对此不知情。 解决步骤 建立分支关联并拉取代码 # 将本地分支与远程分支关联并拉取 git branch --set-upstream-to=origin/远程分支名 本地分支名 git pull 如果是首次推送新分支 # 推送时同时建立关联 git push -u origin 分支名 -u 参数会将本地分支与远程分支永久关联,后续可直接使用 git push 三、推送了超过限制的大文件 错误完整提示 error: failed to push some refs to 'https://gitee.com/your-username/your-repo.git' remote: error: File large_file.zip is 150.00 MB; this exceeds Gitee's file size limit of 100.00 MB remote: error: failed to push some refs to 'https://gitee.com/your-username/your-repo.git' 产生原因 推送的文件超过了远程仓库的大小限制(不同平台限制不同,通常为100MB)。 解决步骤 从提交历史中移除大文件 # 查看提交历史,找到包含大文件的提交 git log --oneline # 回退到该提交之前(选择需要保留的最后一个正常提交) git reset --soft 提交ID # 移除大文件(不删除本地文件) git rm --cached 大文件名 # 重新提交 git commit -m "移除超大文件" 使用Git LFS管理大文件(如果必须提交) # 安装Git LFS git lfs install # 跟踪大文件类型 git lfs track "*.zip" # 提交跟踪配置 git add .gitattributes git commit -m "配置LFS跟踪大文件" # 添加并提交大文件 git add 大文件.zip git commit -m "使用LFS添加大文件" git push 将大文件添加到.gitignore # 编辑.gitignore文件,添加大文件 echo "大文件名" >> .gitignore git add .gitignore git commit -m "忽略大文件" 四、权限不足导致推送失败 错误完整提示 error: failed to push some refs to 'git@gitee.com:your-username/your-repo.git' remote: You are not allowed to push code to this project. fatal: unable to access 'https://gitee.com/your-username/your-repo.git/': The requested URL returned error: 403 产生原因 你没有该远程仓库的推送权限,可能是私有仓库且未被添加为协作者。 解决步骤 确认远程仓库地址是否正确 git remote -v 确保地址是你有权限的仓库 检查权限设置 联系仓库管理员,确认是否已将你添加为协作者 确认你是否有推送权限(而非只读权限) 切换到正确的账号或仓库 # 更换远程仓库地址 git remote set-url origin 正确的仓库地址 五、强制推送(谨慎使用) 在某些特殊情况下(如个人分支、明确需要覆盖远程代码),可以使用强制推送,但需特别谨慎: # 强制推送当前分支 git push -f origin 分支名 注意事项 永远不要对多人协作的公共分支(如main、develop)使用强制推送 强制推送会覆盖远程仓库的所有提交记录,可能导致代码丢失 强制推送前最好先备份代码或创建分支 六、总结解决流程 遇到"error: failed to push some refs to"错误时,建议按以下流程解决: 仔细阅读错误提示的详细信息,确定具体原因 大多数情况先执行git pull拉取远程最新代码 解决可能的合并冲突 重新提交并推送 若是权限或大文件问题,按对应方法处理
  • git推送可能遇到的问题及解决办法

    教程与经验
    1
    1 赞同
    1 评论
    1 浏览
    小黑
    目录一、权限相关问题1. 推送时提示"Permission denied (publickey)"错误现象产生原因解决办法2. 提示"remote: You do not have permission to push to this repository"错误现象产生原因解决办法二、分支相关问题1. 推送时提示"fatal: The current branch has no upstream branch"错误现象产生原因解决办法2. 提示"error: failed to push some refs to"(分支冲突)错误现象产生原因解决办法三、仓库关联问题1. 提示"fatal: remote origin already exists"错误现象产生原因解决办法2. 提示"fatal: ‘origin’ does not appear to be a git repository"错误现象产生原因解决办法四、文件大小与缓存问题1. 提示"error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413"错误现象产生原因解决办法2. 提示"error: failed to push some refs to"(包含超大文件)错误现象产生原因解决办法五、其他常见问题1. 推送时无限弹窗要求输入账号密码错误现象产生原因解决办法2. 提示"fatal: pack has bad object at offset xxx: inflate returned -5"错误现象产生原因解决办法六、预防措施与最佳实践 在使用Git推送代码到远程仓库(如Gitee、GitHub、GitLab等)的过程中,经常会遇到各种错误提示。本文将详细介绍常见的推送问题、产生原因及具体解决办法,帮助你快速排查并解决问题。 一、权限相关问题 1. 推送时提示"Permission denied (publickey)" 错误现象 Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 产生原因 使用SSH协议连接远程仓库,但本地未配置正确的SSH密钥 配置的SSH密钥未添加到远程仓库的账号中 远程仓库地址使用错误(如混淆了SSH和HTTPS地址) 解决办法 检查远程仓库地址类型 git remote -v 确认地址是否为SSH格式(git@xxx.com:用户名/仓库名.git) 检查SSH密钥是否存在 # 查看是否有SSH密钥文件 ls -la ~/.ssh 若存在id_rsa和id_rsa.pub(或id_ed25519和id_ed25519.pub)说明已有密钥 重新生成并配置SSH密钥 # 生成新的SSH密钥 ssh-keygen -t ed25519 -C "你的邮箱地址" # 启动ssh-agent eval "$(ssh-agent -s)" # 添加私钥到ssh-agent ssh-add ~/.ssh/id_ed25519 将公钥添加到远程仓库 复制公钥内容:cat ~/.ssh/id_ed25519.pub 登录远程仓库(如Gitee),进入"设置-SSH公钥"页面,粘贴公钥 验证SSH连接 # Gitee验证 ssh -T git@gitee.com # GitHub验证 ssh -T git@github.com 2. 提示"remote: You do not have permission to push to this repository" 错误现象 remote: You do not have permission to push to this repository fatal: unable to access 'https://gitee.com/xxx/xxx.git/': The requested URL returned error: 403 产生原因 你没有该仓库的推送权限(可能是别人的私有仓库) 使用HTTPS协议时,输入的账号密码不正确或没有权限 仓库已被删除或名称已更改 解决办法 确认是否有推送权限 联系仓库管理员,确认是否已将你添加为协作者 检查仓库是否为公开仓库,公开仓库也需要权限才能推送 检查并更换远程仓库地址 # 查看当前远程地址 git remote -v # 更换为正确的仓库地址 git remote set-url origin 新的仓库地址 使用正确的账号密码(HTTPS方式) 重新输入正确的账号密码 若之前保存了错误的凭据,需清除凭据后重新输入 Windows:在"控制面板-凭据管理器"中删除对应凭据 Mac:git credential-osxkeychain erase(按提示操作) 二、分支相关问题 1. 推送时提示"fatal: The current branch has no upstream branch" 错误现象 fatal: The current branch main has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin main 产生原因 本地分支未与远程分支建立关联关系 首次推送新分支时未指定上游分支 解决办法 推送时指定上游分支(推荐) # 对于main分支 git push -u origin main # 对于其他分支,如dev git push -u origin dev -u参数会建立本地分支与远程分支的关联,后续推送可直接使用git push 手动关联已存在的远程分支 git branch --set-upstream-to=origin/main main 2. 提示"error: failed to push some refs to"(分支冲突) 错误现象 error: failed to push some refs to 'git@gitee.com:xxx/xxx.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. 产生原因 远程仓库有你本地没有的提交(通常是其他人推送了新内容) 本地分支与远程分支版本不一致,存在冲突 解决办法 先拉取远程最新代码并合并 # 拉取远程代码并合并到当前分支 git pull origin 分支名 # 例如拉取main分支 git pull origin main 解决合并冲突 拉取后若出现冲突,打开冲突文件,文件中会标记冲突部分:<<<<<<< HEAD 本地代码 ======= 远程代码 >>>>>>> 8a7b23c... 远程提交信息 编辑文件,保留需要的代码,删除冲突标记(<<<<<<<、=======、>>>>>>>) 解决完所有冲突后,提交并推送:git add . git commit -m "解决合并冲突" git push 强制推送(谨慎使用) 警告:强制推送会覆盖远程仓库的代码,可能导致代码丢失,仅在个人分支或确定需要覆盖时使用 git push -f origin 分支名 三、仓库关联问题 1. 提示"fatal: remote origin already exists" 错误现象 fatal: remote origin already exists. 产生原因 本地仓库已经关联了一个名为origin的远程仓库 再次执行git remote add origin 地址时就会出现此错误 解决办法 查看现有远程仓库 git remote -v 删除现有关联后重新添加 # 删除现有origin关联 git remote rm origin # 重新关联远程仓库 git remote add origin 新的仓库地址 直接修改现有远程仓库地址 git remote set-url origin 新的仓库地址 2. 提示"fatal: ‘origin’ does not appear to be a git repository" 错误现象 fatal: 'origin' does not appear to be a git repository fatal: Could not read from remote repository. 产生原因 本地仓库未关联任何远程仓库 远程仓库名称不是origin(可能被自定义为其他名称) 远程仓库地址配置错误 解决办法 检查是否已关联远程仓库 git remote -v 若没有任何输出,说明未关联远程仓库 关联远程仓库 git remote add origin 仓库地址 如果使用了非origin的远程仓库名称 # 假设远程仓库名称为gitee git push gitee 分支名 四、文件大小与缓存问题 1. 提示"error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413" 错误现象 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 fatal: the remote end hung up unexpectedly fatal: the remote end hung up unexpectedly 产生原因 推送的文件过大,超过了远程服务器的大小限制 HTTP协议传输大文件时容易出现此问题 解决办法 增加Git的HTTP缓存大小 git config --global http.postBuffer 524288000 # 524288000字节 = 500MB 改用SSH协议推送 # 查看当前远程地址 git remote -v # 将HTTP地址改为SSH地址 git remote set-url origin git@xxx.com:用户名/仓库名.git 处理大文件 检查是否有不必要的大文件(如日志、视频、压缩包等) 使用.gitignore文件排除不需要提交的大文件 对于必须提交的大文件,可使用Git LFS(大文件存储)工具 2. 提示"error: failed to push some refs to"(包含超大文件) 错误现象 remote: error: File xxx is 100.50 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: Trace: 8a7b23c... remote: error: See http://git.io/iEPt8g for more information. To https://github.com/xxx/xxx.git ! [remote rejected] main -> main (pre-receive hook declined) error: failed to push some refs to 'https://github.com/xxx/xxx.git' 产生原因 提交了超过远程仓库大小限制的文件(不同平台限制不同,通常是100MB) 即使后来删除了大文件,之前的提交历史中仍包含该文件 解决办法 移除历史提交中的大文件 # 安装bfg工具(需要Java环境) # 下载地址:https://rtyley.github.io/bfg-repo-cleaner/ # 使用bfg移除大文件 bfg --strip-blobs-bigger-than 100M 你的仓库地址 # 清理并推送 git reflog expire --expire=now --all && git gc --prune=now --aggressive git push 使用Git LFS管理大文件 # 安装Git LFS git lfs install # 跟踪大文件类型 git lfs track "*.zip" git lfs track "*.tar.gz" # 提交跟踪配置 git add .gitattributes git commit -m "配置LFS跟踪大文件" # 正常添加提交大文件 git add 大文件.zip git commit -m "添加大文件" git push 五、其他常见问题 1. 推送时无限弹窗要求输入账号密码 错误现象 使用HTTPS协议推送时,反复弹出输入账号密码的窗口 即使输入正确,依然无法成功推送 产生原因 凭据存储错误或损坏 远程仓库地址中包含特殊字符 网络代理设置导致凭据验证失败 解决办法 清除已保存的凭据 Windows: 打开"控制面板"→“用户账户”→“凭据管理器” 找到"Windows凭据"中的git相关凭据 点击"删除"移除凭据 Mac:git credential-osxkeychain erase host=github.com protocol=https # 输入以上内容后按两次回车 切换到SSH协议 按照前面提到的SSH配置方法,改用SSH协议推送 检查并修改仓库地址 # 确保地址正确,不含特殊字符 git remote set-url origin https://gitee.com/用户名/仓库名.git 2. 提示"fatal: pack has bad object at offset xxx: inflate returned -5" 错误现象 fatal: pack has bad object at offset xxx: inflate returned -5 error: failed to push some refs to 'git@gitee.com:xxx/xxx.git' 产生原因 Git本地缓存损坏 推送的对象数据损坏 磁盘错误导致文件损坏 解决办法 清理Git缓存 git gc --prune=now 克隆新仓库并替换有问题的文件 # 在其他目录克隆仓库 git clone 仓库地址 temp-repo # 将有问题的文件从新克隆的仓库复制到当前仓库 cp temp-repo/有问题的文件 你的项目目录/有问题的文件 # 重新提交推送 git add . git commit -m "修复损坏文件" git push 检查磁盘错误 Windows:使用"磁盘检查"工具检查并修复磁盘错误 Mac:使用"磁盘工具"验证磁盘 Linux:使用fsck命令检查文件系统 六、预防措施与最佳实践 定期拉取远程代码 在推送前先执行git pull,保持本地代码与远程同步,减少冲突概率 使用.gitignore文件 提前配置好.gitignore,排除不需要提交的文件(如依赖包、日志、IDE配置等) 避免提交大文件 不要提交超过100MB的大文件,使用Git LFS或单独的文件存储服务管理大文件 规范分支管理 建立合理的分支策略(如main/develop分支模式),避免多人直接推送到主分支 定期备份与检查 定期检查本地仓库健康状态,执行git fsck命令可以检查仓库完整性
  • 创建Gitee仓库并推送本地项目至远程仓库

    教程与经验 git
    1
    0 赞同
    1 评论
    1 浏览
    小黑
    目录一、准备工作二、创建Gitee远程仓库步骤1:登录Gitee账号步骤2:创建新仓库步骤3:获取仓库地址三、配置Git与Gitee连接(可选但推荐)步骤1:生成SSH密钥步骤2:查看并复制公钥步骤3:添加公钥到Gitee步骤4:验证SSH连接四、推送本地项目到远程仓库情况1:本地已有项目(未初始化Git)步骤1:进入项目目录步骤2:初始化Git仓库步骤3:将文件添加到暂存区步骤4:提交文件到本地仓库步骤5:关联远程仓库步骤6:拉取远程仓库文件(如果远程仓库有初始化文件)步骤7:推送本地代码到远程仓库情况2:本地已有Git仓库(已使用Git管理)情况3:从远程仓库克隆到本地(新项目)五、常见问题及解决办法1. 推送时提示"fatal: remote origin already exists"2. 拉取或推送时出现冲突3. 忘记提交信息或提交信息写错4. 推送失败,提示权限不足六、常用Git命令总结 一、准备工作 在开始之前,请确保你的电脑上已经安装了以下工具: Git:版本控制工具,用于管理代码版本和推送代码 下载地址:https://git-scm.com/downloads 安装完成后,可在命令行输入git --version验证是否安装成功 Gitee账号:码云账号,用于创建和管理远程仓库 注册地址:https://gitee.com/signup 二、创建Gitee远程仓库 步骤1:登录Gitee账号 打开浏览器,访问Gitee官网(https://gitee.com/),输入账号密码登录。 步骤2:创建新仓库 登录后,点击右上角的「+」号按钮,在下拉菜单中选择「新建仓库」 在新建仓库页面,填写以下信息: 仓库名称:建议与本地项目名称一致(例如:my-project) 路径:会根据仓库名称自动生成,一般无需修改 仓库介绍:可选,简要描述项目功能 是否开源:根据需要选择「私有」或「公开」 初始化仓库: 建议勾选「初始化README文件」 可选择添加.gitignore(根据项目类型选择,如Node.js、Java等) 许可证根据需要选择 填写完成后,点击「创建」按钮 步骤3:获取仓库地址 仓库创建成功后,在仓库页面可以看到仓库地址,有两种形式: HTTPS地址:https://gitee.com/你的用户名/仓库名.git SSH地址:git@gitee.com:你的用户名/仓库名.git(需要配置SSH密钥,推荐使用) 三、配置Git与Gitee连接(可选但推荐) 为了避免每次推送代码都输入账号密码,建议配置SSH密钥: 步骤1:生成SSH密钥 打开命令行工具(Windows:CMD或PowerShell;Mac/Linux:终端) 输入以下命令,按提示操作(一路回车即可):ssh-keygen -t ed25519 -C "你的邮箱地址" 注意:替换"你的邮箱地址"为你注册Gitee时使用的邮箱 步骤2:查看并复制公钥 根据操作系统,找到生成的公钥文件: Windows:C:\Users\你的用户名\.ssh\id_ed25519.pub Mac/Linux:~/.ssh/id_ed25519.pub 打开文件,复制里面的全部内容 步骤3:添加公钥到Gitee 登录Gitee,点击右上角头像,选择「设置」 在左侧菜单中找到「安全设置」→「SSH公钥」 填写「标题」(可自定义,如"我的笔记本") 将复制的公钥内容粘贴到「公钥」文本框中 点击「确定」,并输入Gitee密码验证 步骤4:验证SSH连接 在命令行输入以下命令: ssh -T git@gitee.com 首次连接会提示是否继续,输入yes后回车。如果看到"Welcome to Gitee.com…"的提示,说明配置成功。 四、推送本地项目到远程仓库 情况1:本地已有项目(未初始化Git) 步骤1:进入项目目录 在命令行中,切换到你的本地项目文件夹: cd /path/to/your/project # 替换为你的项目路径 步骤2:初始化Git仓库 git init 执行后,项目文件夹中会生成一个隐藏的.git目录(用于存储版本信息) 步骤3:将文件添加到暂存区 # 添加所有文件 git add . # 或添加指定文件 git add 文件名1 文件名2 步骤4:提交文件到本地仓库 git commit -m "首次提交" # 引号中是提交说明,建议写清楚本次提交的内容 步骤5:关联远程仓库 # 使用SSH地址(已配置SSH密钥时) git remote add origin git@gitee.com:你的用户名/仓库名.git # 或使用HTTPS地址 git remote add origin https://gitee.com/你的用户名/仓库名.git 步骤6:拉取远程仓库文件(如果远程仓库有初始化文件) git pull origin master --allow-unrelated-histories 这一步是为了合并远程仓库的README等文件,避免后续推送冲突 步骤7:推送本地代码到远程仓库 git push -u origin master 首次推送使用-u参数,后续可直接使用git push 如果使用HTTPS地址,会提示输入Gitee的账号和密码 情况2:本地已有Git仓库(已使用Git管理) 如果你的项目已经是一个Git仓库,只需执行以下步骤: 关联远程仓库: git remote add origin 你的仓库地址 如果之前关联过其他远程仓库,可先执行git remote rm origin删除 拉取远程仓库文件(如果需要): git pull origin master --allow-unrelated-histories 推送代码: git push -u origin master 情况3:从远程仓库克隆到本地(新项目) 如果是全新项目,也可以先创建远程仓库,再克隆到本地: 克隆仓库: # 使用SSH地址 git clone git@gitee.com:你的用户名/仓库名.git # 或使用HTTPS地址 git clone https://gitee.com/你的用户名/仓库名.git 进入克隆的项目目录: cd 仓库名 添加项目文件后,执行提交和推送: git add . git commit -m "添加项目文件" git push 五、常见问题及解决办法 1. 推送时提示"fatal: remote origin already exists" 表示已经关联过远程仓库,解决方案: # 先删除现有关联 git remote rm origin # 再重新关联 git remote add origin 你的仓库地址 2. 拉取或推送时出现冲突 # 先拉取远程最新代码并合并 git pull origin master # 解决冲突后,重新提交推送 git add . git commit -m "解决冲突" git push 3. 忘记提交信息或提交信息写错 # 提交信息写错,还未推送 git commit --amend # 会进入编辑模式,修改后保存退出即可 4. 推送失败,提示权限不足 检查是否使用了正确的Gitee账号 若使用HTTPS地址,确认账号密码是否正确 若使用SSH地址,检查SSH密钥是否配置正确 六、常用Git命令总结 命令 作用 git init 初始化本地Git仓库 git add . 添加所有文件到暂存区 git commit -m "说明" 提交文件到本地仓库 git remote add origin 地址 关联远程仓库 git pull origin master 拉取远程仓库代码 git push origin master 推送本地代码到远程仓库 git status 查看文件状态 git log 查看提交记录 通过以上步骤,你就可以成功创建Gitee仓库并将本地项目推送到远程仓库了。后续开发中,只需在修改代码后执行git add .、git commit -m "说明"和git push这三个命令,即可将最新代码同步到远程仓库。
  • npm命令常见错误及解决办法

    教程与经验
    1
    0 赞同
    1 评论
    1 浏览
    十二
    目录一、npm简介二、安装与初始化错误(一)npm初始化失败:npm init 命令无响应或报错错误现象错误原因解决办法(二)全局安装失败:npm install -g 权限问题深化错误现象错误原因解决办法三、依赖管理错误(一)依赖安装超时:深入分析与解决方案错误现象错误原因解决办法(二)版本冲突高级解决方案错误现象错误原因解决办法四、缓存与文件系统错误(一)缓存一致性问题错误现象错误原因解决办法(二)文件系统权限深度解析错误现象错误原因解决办法五、npm脚本执行错误(一)脚本运行失败错误现象错误原因解决办法(二)npm link相关错误错误现象错误原因解决办法六、高级诊断与预防措施(一)npm错误日志分析(二)npm环境检查工具(三)预防措施与最佳实践 一、npm简介 npm(Node Package Manager)作为Node.js的包管理工具,在现代软件开发中扮演着核心角色。它不仅负责依赖包的安装与管理,还承担着项目构建、脚本执行等重要功能。然而,在使用过程中,各种错误提示常常让开发者陷入困境。本文将系统梳理npm命令的常见错误类型,深入分析错误原因,并提供详细的解决步骤,帮助开发者快速定位并解决问题。 二、安装与初始化错误 (一)npm初始化失败:npm init 命令无响应或报错 错误现象 执行 npm init 后终端长时间无响应 提示 “Error: ENOENT: no such file or directory” 生成的 package.json 不完整或格式错误 错误原因 当前目录权限不足,无法创建文件 目录中存在损坏的 .npm 缓存文件 Node.js 或 npm 版本过低,存在兼容性问题 当前目录已存在 package.json 但格式错误 解决办法 检查目录权限 # 查看目录权限(Linux/macOS) ls -ld . # 修改目录权限(Linux/macOS) chmod 755 . 清理缓存并重新初始化 # 清除npm缓存 npm cache clean --force # 强制重新初始化(会覆盖现有package.json) npm init -y 升级Node.js和npm # 升级npm npm install -g npm@latest # 使用nvm(Node版本管理器)升级Node.js(推荐) nvm install node --reinstall-packages-from=node 手动创建基础package.json 若自动生成失败,可手动创建基础配置: { "name": "my-project", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } (二)全局安装失败:npm install -g 权限问题深化 错误现象 提示 “EACCES: permission denied, mkdir ‘/usr/local/lib/node_modules’” 安装后无法在命令行直接调用工具 提示 “command not found” 但已确认全局安装 错误原因 系统级目录权限限制(尤其是Linux/macOS) 用户目录下的npm配置被损坏 全局安装路径未添加到系统环境变量 不同版本Node.js的全局目录冲突 解决办法 使用nvm管理全局安装(推荐方案) # 安装nvm(Linux/macOS) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash # 安装稳定版Node.js nvm install stable # 切换到安装的版本 nvm use stable # 此时全局安装将默认在用户目录,无需管理员权限 npm install -g <package> 修复环境变量配置 # 查看npm全局安装路径 npm config get prefix # 编辑bash配置文件(Linux/macOS) nano ~/.bashrc # 添加路径配置(替换为实际路径) export PATH="$HOME/.npm-global/bin:$PATH" # 使配置生效 source ~/.bashrc Windows系统权限修复 打开"控制面板→用户账户→用户账户→更改我的环境变量" 找到Path变量,点击"编辑→新建" 添加%USERPROFILE%\AppData\Roaming\npm 重启命令提示符 三、依赖管理错误 (一)依赖安装超时:深入分析与解决方案 错误现象 提示 “request to https://registry.npmjs.org/xxx failed, reason: connect ETIMEDOUT” 安装过程中频繁重试但最终失败 部分包安装成功,部分失败 错误原因 网络连接不稳定或速度过慢 registry镜像源响应延迟或不可用 本地网络防火墙或代理设置限制 npm默认超时时间过短(默认30000ms) 解决办法 配置多镜像源与镜像管理 # 安装nrm镜像管理工具 npm install -g nrm # 查看可用镜像源 nrm ls # 测试各镜像源速度 nrm test # 切换到最快的镜像源 nrm use taobao 配置代理(针对企业内网) # 设置HTTP代理 npm config set proxy http://username:password@proxy-server:port # 设置HTTPS代理 npm config set https-proxy https://username:password@proxy-server:port # 清除代理设置 npm config delete proxy npm config delete https-proxy 调整超时设置与重试次数 # 设置超时时间为120秒 npm config set timeout 120000 # 设置请求重试次数 npm config set fetch-retries 5 # 安装时强制使用HTTP1.1(部分服务器对HTTP2支持不佳) npm install --http1.1 <package> (二)版本冲突高级解决方案 错误现象 提示 “Could not resolve dependency: peer xxx@^1.0.0 from yyy@2.3.4” 运行 npm ls 显示大量 “extraneous” 标记 项目在不同环境下表现不一致 错误原因 依赖包的peerDependencies要求不兼容 手动修改了package-lock.json导致依赖树不一致 不同版本的npm处理依赖解析的方式不同 存在循环依赖或深层依赖冲突 解决办法 详细分析依赖树 # 查看特定包的依赖链 npm ls <package-name> # 生成依赖树可视化文件(需安装依赖树可视化工具) npm install -g dependency-cruiser depcruise --exclude "node_modules" --output-type dot src | dot -T svg > dependency-graph.svg 使用override解决冲突(npm 8.3+) 在package.json中添加: { "overrides": { "problem-package": { "conflicting-dependency": "3.0.0" } } } 选择性安装与版本锁定 # 安装特定版本 npm install <package>@3.2.1 # 锁定主要版本(^) npm install <package>@^3.0.0 # 锁定次要版本(~) npm install <package>@~3.2.0 清理并重新构建依赖 # 清除node_modules和缓存 rm -rf node_modules package-lock.json npm cache clean --force # 重新安装并生成新的package-lock.json npm install 四、缓存与文件系统错误 (一)缓存一致性问题 错误现象 提示 “integrity check failed for … (computed integrity doesn’t match our records)” 安装相同版本包但内容不同 离线安装(npm install --offline)失败 错误原因 缓存文件损坏或校验和不匹配 本地缓存与远程仓库内容不一致 多版本npm混用导致缓存格式不兼容 磁盘错误导致缓存文件读写异常 解决办法 高级缓存清理 # 清除所有缓存 npm cache clean --force # 手动删除缓存目录(Linux/macOS) rm -rf ~/.npm # 手动删除缓存目录(Windows) rd /s /q %AppData%\npm-cache 验证与修复缓存 # 验证缓存完整性 npm cache verify # 强制重新获取包(忽略缓存) npm install <package> --no-cache 使用缓存备份与恢复 # 备份缓存(Linux/macOS) cp -r ~/.npm ~/.npm-backup # 恢复缓存(Linux/macOS) rm -rf ~/.npm && cp -r ~/.npm-backup ~/.npm (二)文件系统权限深度解析 错误现象 提示 “EPERM: operation not permitted, unlink ‘…\node_modules.…’” 提示 “EBUSY: resource busy or locked, rmdir ‘…’” 安装成功但运行时提示模块缺失 错误原因 进程锁定:Node.js进程或其他程序正在使用相关文件 权限继承问题:父目录权限设置不当影响子目录 文件系统格式问题:NTFS与FAT32权限机制差异 安全软件拦截:杀毒软件或防火墙阻止文件操作 解决办法 识别并终止锁定进程 # Windows系统查找占用文件的进程 tasklist | findstr "node" taskkill /F /PID <进程ID> # Linux/macOS系统 lsof | grep <file-path> kill -9 <进程ID> 修复目录权限结构 # Linux/macOS递归修复权限 sudo chown -R $USER:$GROUP ~/.npm sudo chmod -R 755 ~/.npm # Windows PowerShell修复权限 Takeown /f "%AppData%\npm" /r /d y Icacls "%AppData%\npm" /grant "%USERNAME%":(F) /t 处理顽固锁定文件 Windows: 重启计算机后立即删除(避开自动启动程序) 使用第三方工具解锁:如Unlocker(Windows)或lsof(Linux/macOS) 暂时禁用实时杀毒监控(谨慎操作) 五、npm脚本执行错误 (一)脚本运行失败 错误现象 执行 npm run <script> 提示 “missing script: <script>” 脚本执行一半中断,提示 “exit code 1” Windows与Linux下脚本表现不一致 错误原因 package.json中scripts字段配置错误 脚本依赖的工具未安装或不在PATH中 跨平台脚本语法差异(如shell命令) 脚本执行超时或内存不足 解决办法 检查脚本配置与执行路径 # 查看所有可用脚本 npm run # 以调试模式运行脚本 npm run <script> --verbose # 检查npm运行环境 npm run env 处理跨平台脚本兼容性 # 安装跨平台脚本工具 npm install -g cross-env 在package.json中使用: "scripts": { "build": "cross-env NODE_ENV=production webpack" } 解决脚本内存问题 # 临时增加Node.js内存限制 export NODE_OPTIONS=--max_old_space_size=4096 npm run build # 永久设置(Linux/macOS) echo 'export NODE_OPTIONS=--max_old_space_size=4096' >> ~/.bashrc (二)npm link相关错误 错误现象 执行 npm link 后模块无法找到 提示 “ELOOP: too many symbolic links encountered” 链接的本地模块修改后不生效 错误原因 符号链接循环引用 全局链接与本地依赖冲突 package.json中main字段指向错误 npm版本差异导致的链接行为不一致 解决办法 正确的npm link工作流程 # 在被链接的模块目录 cd ~/projects/my-module npm link # 在使用模块的项目目录 cd ~/projects/my-project npm link my-module 解除错误链接并重新链接 # 解除项目中的链接 npm unlink my-module # 解除全局链接 cd ~/projects/my-module npm unlink # 清理残留链接文件 rm -rf node_modules/my-module # 重新链接 npm link 验证链接有效性 # 检查链接路径 ls -la node_modules/my-module # 确认模块入口文件存在 cat node_modules/my-module/package.json | grep main 六、高级诊断与预防措施 (一)npm错误日志分析 npm会将详细错误信息记录到日志文件中,位置可通过以下命令查看: npm config get logs-dir 分析日志的技巧: 查找 “error” 或 “warn” 标记的行 关注时间戳附近的操作序列 对比成功与失败的日志差异 搜索特定包名或文件路径 (二)npm环境检查工具 使用npm doctor命令进行环境健康检查: npm doctor 该命令会检查: Node.js和npm版本兼容性 全局安装路径权限 缓存完整性 网络连接状态 注册表响应性 (三)预防措施与最佳实践 版本管理 使用.nvmrc或.node-version文件锁定Node.js版本 定期执行npm update更新依赖到安全版本 使用npm audit检查并修复安全漏洞 依赖管理 提交package-lock.json或yarn.lock到版本控制 避免全局安装非CLI工具 使用npm ci替代npm install进行CI环境构建 环境一致性 使用Docker容器化开发环境 编写环境检查脚本作为项目初始化步骤 定期清理node_modules并重新安装依赖 遇到复杂问题时,建议结合官方文档、错误日志和社区资源(如Stack Overflow)进行排查。定期更新知识储备,了解npm的新特性和最佳实践,也是减少错误发生的重要途径。
  • Node.js 与 npm 命令大全及使用方案、场景

    教程与经验
    1
    0 赞同
    1 评论
    2 浏览
    十二
    目录一、Node.js 核心命令1. 基础运行命令2. 调试与性能命令3. 其他实用命令二、npm 核心命令1. 初始化与配置2. 依赖管理3. 脚本与运行4. 依赖分析与修复5. 其他实用命令三、典型使用场景与方案1. 项目初始化与环境搭建2. 依赖问题排查与修复3. 生产环境部署4. 开发与发布 npm 包四、常见问题与解决方案 一、Node.js 核心命令 1. 基础运行命令 node [文件名] 功能:运行指定的 Node.js 脚本(默认执行 index.js) 场景:本地调试单个 JS 文件,如 node app.js 启动服务 示例:node server.js 运行后端服务脚本 node -v / node --version 功能:查看当前 Node.js 版本 场景:确认环境版本是否符合项目要求(如检查是否安装成功) node -h / node --help 功能:查看 Node.js 命令帮助文档 场景:快速查询命令参数(如调试、内存限制等参数) 2. 调试与性能命令 node --inspect [文件名] 功能:开启调试模式,支持 Chrome DevTools 调试 场景:复杂逻辑调试,通过 chrome://inspect 链接调试 Node 程序 示例:node --inspect app.js 启动带调试功能的服务 node --max-old-space-size=4096 [文件名] 功能:设置 Node.js 最大堆内存(单位 MB) 场景:解决大文件处理或复杂计算导致的内存溢出,如 node --max-old-space-size=8192 data-process.js node --trace-warnings 功能:显示警告的详细调用栈 场景:排查代码中潜在的问题(如弃用 API 警告) 3. 其他实用命令 node -e "代码" 功能:直接执行单行 JS 代码 场景:快速测试简单逻辑,如 node -e "console.log(1+1)" 输出 2 node --experimental-modules 功能:启用 ES 模块支持(无需在 package.json 中设置 "type": "module") 场景:测试 ES6 模块语法,如 node --experimental-modules module-test.mjs 二、npm 核心命令 1. 初始化与配置 npm init 功能:交互式创建 package.json(项目描述文件) 场景:新建项目时初始化配置,生成依赖管理文件 快捷方式:npm init -y 直接生成默认配置 npm config set [key] [value] 功能:设置 npm 配置(如镜像源、缓存路径) 场景:切换国内镜像加速下载,如 npm config set registry https://registry.npmmirror.com npm config get [key] 功能:查看 npm 配置,如 npm config get registry 查看当前镜像源 2. 依赖管理 npm install [包名] / npm i [包名] 功能:安装指定依赖(默认安装到 dependencies,生产环境可用) 场景:安装项目核心依赖(如 npm i express 安装 Web 框架) npm install [包名] --save-dev / npm i [包名] -D 功能:安装开发依赖(仅开发环境使用,如打包工具、测试库) 场景:安装 webpack、eslint 等开发工具,如 npm i webpack -D npm install [包名] -g 功能:全局安装依赖(可在命令行直接调用) 场景:安装全局工具(如 npm i nodemon -g 用于自动重启服务) npm uninstall [包名] / npm un [包名] 功能:卸载依赖(加 -g 卸载全局包,加 -D 卸载开发依赖) 场景:移除不再使用的包,如 npm un lodash npm update [包名] 功能:更新依赖到 package.json 允许的最新版本 场景:升级非核心依赖以修复漏洞,如 npm update react npm install [包名]@[版本号] 功能:安装指定版本的依赖 场景:解决版本兼容问题,如 npm i vue@2.6.14 3. 脚本与运行 npm run [脚本名] 功能:执行 package.json 中 scripts 定义的脚本 场景:启动服务、打包、测试等,如 npm run dev 启动开发环境 简化命令:部分脚本可省略 run,如 npm start(等价于 npm run start) npm test / npm t 功能:执行 scripts 中的 test 脚本(如单元测试) 场景:运行 Jest、Mocha 等测试框架,如 npm t 执行测试用例 4. 依赖分析与修复 npm list / npm ls 功能:查看项目依赖树 场景:排查依赖版本冲突,如 npm ls react 查看 React 及其子依赖版本 npm outdated 功能:检查哪些依赖有新版本可用 场景:批量更新依赖前确认可升级的包 npm audit 功能:检查依赖中的安全漏洞 场景:修复潜在风险,如 npm audit fix 自动修复可修复的漏洞 5. 其他实用命令 npm cache clean --force 功能:清理 npm 缓存 场景:解决依赖安装失败(如缓存损坏导致的安装异常) npm publish 功能:发布包到 npm 仓库 场景:开发并分享自己的 npm 包(需先 npm login 登录账号) npm link 功能:本地链接包(开发时调试本地依赖) 场景:开发 npm 包时,在项目中实时测试修改,无需反复发布 三、典型使用场景与方案 1. 项目初始化与环境搭建 # 初始化项目 npm init -y # 设置国内镜像(加速下载) npm config set registry https://registry.npmmirror.com # 安装核心依赖(如 Express 后端框架) npm i express # 安装开发依赖(如 nodemon 自动重启服务) npm i nodemon -D # 在 package.json 中添加启动脚本 # "scripts": { "dev": "nodemon app.js" } # 启动开发服务 npm run dev 2. 依赖问题排查与修复 # 查看依赖树,排查版本冲突 npm ls axios # 检查安全漏洞并修复 npm audit npm audit fix # 强制清理缓存,解决安装失败 npm cache clean --force npm i # 重新安装依赖 3. 生产环境部署 # 安装生产依赖(忽略开发依赖) npm i --production # 运行生产环境脚本(如启动服务) npm run start # 检查 Node.js 版本是否符合要求 node -v 4. 开发与发布 npm 包 # 初始化包项目 npm init -y # 本地链接到测试项目(实时调试) npm link cd ../test-project npm link my-package # 链接本地包 # 登录 npm 账号(需先注册) npm login # 发布包(每次发布需更新版本号) npm version patch # 升级补丁版本(如 1.0.0 → 1.0.1) npm publish 四、常见问题与解决方案 依赖安装速度慢:切换国内镜像(npm config set registry https://registry.npmmirror.com) 版本冲突:使用 npm ls [包名] 查看依赖树,指定版本安装(npm i [包名]@x.y.z) 全局包无法调用:检查 Node.js 安装路径是否加入系统环境变量(Windows 需手动添加 C:\Users\用户名\AppData\Roaming\npm) 内存溢出:运行时增加内存限制(node --max-old-space-size=4096 app.js)

热门标签