<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Npm on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/npm/</link><description>Recent content in Npm on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/npm/index.xml" rel="self" type="application/rss+xml"/><item><title>npm模块安装机制</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-01/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-01/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>模块化工程理解&lt;/strong>：对Node.js生态依赖管理的整体认知&lt;/li>
&lt;li>&lt;strong>版本解析能力&lt;/strong>：语义化版本控制（SemVer）的实际应用&lt;/li>
&lt;li>&lt;strong>依赖管理机制&lt;/strong>：包管理器核心算法与安装策略&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：node_modules结构设计与安装优化&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>依赖拓扑排序与冲突解决算法&lt;/li>
&lt;li>缓存加速机制与网络请求优化&lt;/li>
&lt;li>扁平化结构带来的幽灵依赖问题&lt;/li>
&lt;li>lock文件锁定版本原理&lt;/li>
&lt;li>多层级依赖的去重策略&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>依赖解析算法 &amp;gt; 缓存机制 &amp;gt; 目录结构设计&lt;/li>
&lt;li>语义化版本规范 &amp;gt; 嵌套结构缺陷 &amp;gt; 扁平化优势&lt;/li>
&lt;li>确定性安装保障 &amp;gt; lock文件作用 &amp;gt; 校验机制&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>依赖树构建&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>递归解析package.json的dependencies/devDependencies&lt;/li>
&lt;li>使用广度优先遍历构建依赖树，采用拓扑排序解决循环依赖&lt;/li>
&lt;li>版本选择遵循SemVer规则，优先采用最高兼容版本&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>下载流程&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">graph TD
 A[检查本地缓存] --&amp;gt;|存在| B[解压缓存包]
 A --&amp;gt;|不存在| C[注册表查询]
 C --&amp;gt; D[下载tar包并验证]
 D --&amp;gt; E[缓存写入]
 E --&amp;gt; B
 B --&amp;gt; F[提取到node_modules]
&lt;/pre>
&lt;ol start="3">
&lt;li>&lt;strong>扁平化结构&lt;/strong>：
通过提升次级依赖到顶层目录，避免重复安装。冲突时采用嵌套方案：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9c7a401" class="language-bash ">
 &lt;code>node_modules
├─ A@1.0.0
├─ B@1.0.0
│ └─ node_modules
│ └─ C@2.0.0 # 版本冲突时嵌套
└─ C@1.0.0 # 顶层依赖&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为所有依赖都会被扁平化处理（实际存在版本冲突时仍会嵌套）&lt;/li>
&lt;li>忽略peerDependencies的特殊处理逻辑&lt;/li>
&lt;li>混淆package.json与package-lock.json的作用边界&lt;/li>
&lt;li>认为删除node_modules后lock文件能完全恢复环境&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>执行&lt;code>npm install&lt;/code>时的工作流程：&lt;/p></description></item><item><title>package-lock.json的作用与影响</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-02/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-02/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：工程化实践能力、依赖管理机制理解、版本控制规范认知&lt;/p>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>依赖锁定机制原理（Dependency locking）&lt;/li>
&lt;li>语义化版本控制（Semantic Versioning）的实际应用&lt;/li>
&lt;li>跨环境依赖一致性保障（开发/生产/CI环境）&lt;/li>
&lt;li>npm install工作机制差异（有lock文件 vs 无lock文件）&lt;/li>
&lt;li>依赖树（Dependency Tree）确定性维护&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>依赖锁定 &amp;gt; 语义化版本规范 &amp;gt; 依赖树确定性 &amp;gt; 安装策略差异&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;code>package-lock.json&lt;/code> 是 npm 5+ 引入的依赖树快照文件，核心价值在于：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>精准锁定依赖树&lt;/strong>：记录每个依赖包及其子依赖的&lt;strong>精确版本号&lt;/strong>（如：1.2.3）和下载地址（resolved字段）&lt;/li>
&lt;li>&lt;strong>安装确定性&lt;/strong>：确保 &lt;code>npm install&lt;/code> 在不同环境生成完全相同的 &lt;code>node_modules&lt;/code> 结构&lt;/li>
&lt;li>&lt;strong>版本控制策略&lt;/strong>：与 &lt;code>package.json&lt;/code> 的语义化版本符号（^/~）协同工作：
&lt;ul>
&lt;li>&lt;code>^1.2.3&lt;/code> 允许次版本号升级（1.X.X）&lt;/li>
&lt;li>&lt;code>~1.2.3&lt;/code> 仅允许修订号升级（1.2.X）&lt;/li>
&lt;li>无符号时锁定主版本&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为 &lt;code>package.json&lt;/code> 已经足够管理依赖版本&lt;/li>
&lt;li>将 &lt;code>package-lock.json&lt;/code> 添加到 &lt;code>.gitignore&lt;/code> 导致团队协作问题&lt;/li>
&lt;li>混淆 &lt;code>npm ci&lt;/code>（严格依赖lock文件）和 &lt;code>npm install&lt;/code>（可能更新lock文件）的区别&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;code>package-lock.json&lt;/code> 是保证依赖树确定性的关键文件，作用包含：&lt;/p>
&lt;ol>
&lt;li>锁定所有依赖及其子依赖的&lt;strong>精确版本&lt;/strong>和下载源，消除版本浮动带来的不确定性&lt;/li>
&lt;li>确保开发、测试、生产环境的依赖树完全一致，避免「在我机器上是好的」问题&lt;/li>
&lt;li>与语义化版本控制配合使用时：
&lt;ul>
&lt;li>开发阶段允许通过 &lt;code>^/~&lt;/code> 接收安全更新&lt;/li>
&lt;li>发布阶段通过 lock 文件冻结具体版本，平衡灵活性与稳定性&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>无此文件可能导致：&lt;/p></description></item><item><title>package-lock.json与yarn.lock区别</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-03/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-03/</guid><description>&lt;h2 id="回答">回答 &lt;a href="#%e5%9b%9e%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>该题目主要考察以下核心能力：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>包管理机制理解&lt;/strong>：对Node.js生态依赖管理原理的掌握程度&lt;/li>
&lt;li>&lt;strong>工程化协作认知&lt;/strong>：理解锁文件在团队协作与CI/CD中的核心作用&lt;/li>
&lt;li>&lt;strong>工具链差异分析&lt;/strong>：对比不同包管理器设计哲学及实现差异&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>锁定文件生成策略差异&lt;/li>
&lt;li>语义化版本控制实现方式&lt;/li>
&lt;li>依赖解析算法区别&lt;/li>
&lt;li>跨环境安装确定性保障&lt;/li>
&lt;li>文件格式与可读性设计&lt;/li>
&lt;/ul>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>依赖解析策略 &amp;gt; 文件格式差异 &amp;gt; 安装行为差异&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>&lt;strong>文件格式&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>package-lock.json&lt;/code>（npm）采用嵌套结构精确记录依赖树，包含：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="3990bb9" class="language-json ">
 &lt;code>&amp;#34;node_modules/axios&amp;#34;: {
 &amp;#34;version&amp;#34;: &amp;#34;1.3.4&amp;#34;,
 &amp;#34;resolved&amp;#34;: &amp;#34;https://registry.npmjs.org/axios/-/axios-1.3.4.tgz&amp;#34;,
 &amp;#34;dependencies&amp;#34;: {
 &amp;#34;follow-redirects&amp;#34;: &amp;#34;^1.15.0&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;code>yarn.lock&lt;/code>（Yarn）使用扁平化列表，通过&lt;code>||&lt;/code>运算符表达版本范围：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6b97244" class="language- ">
 &lt;code>axios@^1.3.4:
 version &amp;#34;1.3.4&amp;#34;
 resolved &amp;#34;https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz&amp;#34;
 dependencies:
 follow-redirects &amp;#34;^1.15.0&amp;#34;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>版本锁定策略&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>npm的&lt;code>package-lock.json&lt;/code>采用&lt;a href="https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json" rel="external" target="_blank">[确定性算法]&lt;svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">&lt;path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/>&lt;/svg>&lt;/a>生成依赖树，但允许通过&lt;code>npm update&lt;/code>更新锁定版本&lt;/li>
&lt;li>Yarn的&lt;code>yarn.lock&lt;/code>严格锁定所有依赖的精确版本，需显式执行&lt;code>yarn upgrade&lt;/code>才能更新&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>安装行为&lt;/strong>：&lt;/p></description></item><item><title>npm缓存管理与配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-04/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-04/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察候选人以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化工具理解&lt;/strong>：对npm底层机制的理解深度&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：缓存策略对开发流程的影响分析能力&lt;/li>
&lt;li>&lt;strong>CLI操作能力&lt;/strong>：包管理器的高级配置与问题排查技能&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>npm缓存目录结构与存储逻辑&lt;/li>
&lt;li>缓存清理命令的版本差异与风险控制&lt;/li>
&lt;li>缓存路径配置的多种实现方式&lt;/li>
&lt;li>缓存有效性验证机制（SHA校验/过期策略）&lt;/li>
&lt;li>缓存对CI/CD流水线的影响&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>缓存存储机制 &amp;gt; 缓存清理操作 &amp;gt; 路径配置方法&lt;/li>
&lt;li>完整性校验 &amp;gt; 网络性能优化 &amp;gt; 磁盘空间管理&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm采用内容寻址存储（CAS）机制：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>下载包时计算SHA-1校验和作为存储目录名（例：/npm/registry.npmjs.org/lodash/-/lodash-4.17.21.tgz -&amp;gt; /lodash/4.17.21）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>缓存目录结构：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="cde7495" class="language- ">
 &lt;code>~/.npm
├── _cacache
│ ├── content-v2 # 二进制包存储
│ └── index-v5 # 元数据索引
└── _logs # 安装日志&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;code>npm install&lt;/code>时优先检查本地缓存，存在有效副本则直接解压到node_modules（离线模式可通过&lt;code>--prefer-offline&lt;/code>强制优先使用缓存）&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为&lt;code>npm cache clean&lt;/code>可修复所有安装问题（实际可能需配合&lt;code>rm -rf node_modules package-lock.json&lt;/code>）&lt;/li>
&lt;li>忽视npm v5+版本后缓存自动修复机制（&lt;code>npm install&lt;/code>会自动清理无效缓存）&lt;/li>
&lt;li>混淆&lt;code>--cache&lt;/code>与&lt;code>--cache-min&lt;/code>参数用途&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>npm缓存通过内容寻址存储加速模块安装，执行&lt;code>npm cache clean --force&lt;/code>可清除缓存，建议通过&lt;code>npm config set cache /path/to/cache&lt;/code>修改缓存路径。缓存机制通过减少网络请求显著提升安装速度，但需平衡磁盘空间占用与网络开销。&lt;/p></description></item><item><title>依赖类型区别与使用场景</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-05/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-05/</guid><description>&lt;h2 id="依赖类型区别与使用场景">依赖类型区别与使用场景 &lt;a href="#%e4%be%9d%e8%b5%96%e7%b1%bb%e5%9e%8b%e5%8c%ba%e5%88%ab%e4%b8%8e%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>本题主要考察候选人：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化能力&lt;/strong>：对Node.js生态模块管理的理解深度&lt;/li>
&lt;li>&lt;strong>架构思维&lt;/strong>：不同依赖类型的适用场景判断&lt;/li>
&lt;li>&lt;strong>协作认知&lt;/strong>：对三方库开发规范的掌握程度&lt;/li>
&lt;/ol>
&lt;p>具体评估点：&lt;/p>
&lt;ul>
&lt;li>生产/开发环境依赖的划分逻辑&lt;/li>
&lt;li>插件型库的依赖声明方式&lt;/li>
&lt;li>版本控制策略的实现机制&lt;/li>
&lt;li>包管理器（npm/yarn）工作原理解析&lt;/li>
&lt;li>依赖层级对构建产物的影响&lt;/li>
&lt;/ul>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>&lt;code>dependencies&lt;/code> &amp;gt; &lt;code>devDependencies&lt;/code> &amp;gt; &lt;code>peerDependencies&lt;/code>&lt;/p>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>
&lt;p>&lt;strong>dependencies&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>定义项目运行时必需的核心依赖&lt;/li>
&lt;li>安装时通过&lt;code>npm install --save&lt;/code>添加&lt;/li>
&lt;li>示例：React应用中的react-dom、axios&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>devDependencies&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>仅开发阶段需要的构建/测试工具链&lt;/li>
&lt;li>通过&lt;code>npm install --save-dev&lt;/code>添加&lt;/li>
&lt;li>示例：Webpack、ESLint、Jest&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>peerDependencies&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>声明宿主环境必须提供的共享依赖&lt;/li>
&lt;li>防止多版本冲突的核心机制&lt;/li>
&lt;li>示例：React组件库声明react作为peer依赖&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ul>
&lt;li>误将babel-core放入dependencies导致生产包体积膨胀&lt;/li>
&lt;li>未正确声明peerDependencies导致插件运行时环境不兼容&lt;/li>
&lt;li>混淆npm install的默认安装模式（默认安装到dependencies）&lt;/li>
&lt;/ul>
&lt;h3 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>三者的核心差异在于依赖的作用域与安装策略：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>dependencies&lt;/strong>包含生产环境必需的包，通过常规依赖树安装。例如Express框架需要放在这里，确保服务器运行时能加载中间件&lt;/li>
&lt;li>&lt;strong>devDependencies&lt;/strong>限定在开发环节使用，不会进入生产构建。如TypeScript编译器只在本地开发时进行类型检查&lt;/li>
&lt;li>&lt;strong>peerDependencies&lt;/strong>要求宿主环境预先安装指定版本依赖，避免重复安装。典型场景是开发Chrome插件时声明Chrome API版本要求&lt;/li>
&lt;/ol>
&lt;h3 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="配置示例packagejson">配置示例（package.json） &lt;a href="#%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8bpackagejson" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2f63b19" class="language-javascript ">
 &lt;code>{
 &amp;#34;name&amp;#34;: &amp;#34;react-plugin&amp;#34;,
 &amp;#34;dependencies&amp;#34;: {
 &amp;#34;lodash&amp;#34;: &amp;#34;^4.17.21&amp;#34; // 工具库需要打包进最终产物
 },
 &amp;#34;devDependencies&amp;#34;: {
 &amp;#34;jest&amp;#34;: &amp;#34;^29.0.0&amp;#34; // 仅测试使用
 },
 &amp;#34;peerDependencies&amp;#34;: {
 &amp;#34;react&amp;#34;: &amp;#34;&amp;gt;=16.8.0&amp;#34; // 由使用方提供React环境
 },
 &amp;#34;peerDependenciesMeta&amp;#34;: {
 &amp;#34;react&amp;#34;: {
 &amp;#34;optional&amp;#34;: true // 声明peer依赖非必需
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h4 id="优化建议">优化建议 &lt;a href="#%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>&lt;strong>生产包优化&lt;/strong>：使用&lt;code>npm prune --production&lt;/code>剔除开发依赖&lt;/li>
&lt;li>&lt;strong>版本控制&lt;/strong>：对peerDependencies使用宽松版本号（如^1.0.0）&lt;/li>
&lt;li>&lt;strong>Monorepo管理&lt;/strong>：通过workspaces提升本地依赖解析效率&lt;/li>
&lt;/ol>
&lt;h3 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何防止devDependencies意外进入生产环境？&lt;/strong>
构建时使用&lt;code>NODE_ENV=production&lt;/code>环境变量，配合webpack.DefinePlugin剔除&lt;/p></description></item><item><title>optionalDependencies的应用场景</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-06/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-06/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：npm依赖管理机制、异常处理能力、跨平台开发经验&lt;br>
&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>对npm依赖类型（dependencies/devDependencies/optionalDependencies）的区分理解&lt;/li>
&lt;li>可选依赖的典型应用场景识别能力&lt;/li>
&lt;li>安装失败时的错误处理机制设计&lt;/li>
&lt;li>跨平台兼容性方案的实现思路&lt;/li>
&lt;li>包开发时的防御性编程意识&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>关键知识点&lt;/strong>：&lt;br>
可选依赖机制 &amp;gt; 平台差异化处理 &amp;gt; 防御性编程&lt;/p>
&lt;p>&lt;strong>原理剖析&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>optionalDependencies&lt;/code>是package.json中的特殊字段，其依赖项安装失败不会中断npm install过程（返回警告而非错误）&lt;/li>
&lt;li>安装时通过进程退出码检测（0-成功，非0-失败），但optional依赖失败时仍返回0&lt;/li>
&lt;li>依赖检测需在运行时通过try/catch实现，例如：&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="5a8842c" class="language-javascript ">
 &lt;code>try {
 const optionalLib = require(&amp;#39;optional-pkg&amp;#39;)
} catch (err) {
 // 降级处理
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>将核心依赖误设为可选导致功能缺失&lt;/li>
&lt;li>未处理模块加载异常引发运行时崩溃&lt;/li>
&lt;li>混淆optionalDependencies与peerDependencies（后者要求宿主环境提供依赖）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;code>optionalDependencies&lt;/code>适用于非关键依赖场景，典型如：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>跨平台特定依赖&lt;/strong>：如Windows的&lt;code>node-pty&lt;/code>模块在Linux环境安装时可标记为optional&lt;/li>
&lt;li>&lt;strong>增强型功能&lt;/strong>：如可视化监控需要&lt;code>canvas&lt;/code>库，缺失时可回退到CLI模式&lt;/li>
&lt;li>&lt;strong>实验性功能&lt;/strong>：如预览功能的SDK，安装失败不应影响核心流程&lt;/li>
&lt;/ol>
&lt;p>安装失败时处理机制：&lt;/p>
&lt;ul>
&lt;li>npm跳过失败继续安装并警告（&lt;code>npm WARN optional&lt;/code>）&lt;/li>
&lt;li>运行时通过try/catch检测依赖可用性&lt;/li>
&lt;li>实现功能降级或提示用户缺失功能&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>编码示例&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4831b52" class="language-javascript ">
 &lt;code>// 跨平台日志收集器示例
class CrossPlatformLogger {
 constructor() {
 try {
 // 尝试加载Windows专用性能监控库
 this.winPerf = require(&amp;#39;windows-performance-hooks&amp;#39;)
 } catch (e) {
 this.winPerf = null
 }
 }

 log(message) {
 if (this.winPerf?.enabled) {
 this.winPerf.track(message) // Windows增强日志
 } else {
 console.log(`[BASIC] ${message}`) // 通用日志
 }
 }
}
// 使用示例
const logger = new CrossPlatformLogger()
logger.log(&amp;#39;System initialized&amp;#39;)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>可扩展性建议&lt;/strong>：&lt;/p></description></item><item><title>检测项目依赖的方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-07/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-07/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>npm工具链掌握程度&lt;/strong>：是否熟悉npm命令行工具的高级用法&lt;/li>
&lt;li>&lt;strong>依赖管理机制理解&lt;/strong>：对node_modules目录结构及依赖解析规则的认知&lt;/li>
&lt;li>&lt;strong>问题排查能力&lt;/strong>：在复杂依赖关系中快速定位特定包的能力&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>npm ls命令的参数使用及输出解析&lt;/li>
&lt;li>区分生产依赖与开发依赖的检索方式&lt;/li>
&lt;li>node_modules目录组织结构的理解&lt;/li>
&lt;li>多版本依赖共存时的识别技巧&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm依赖查询 &amp;gt; node_modules结构解析 &amp;gt; 包管理机制&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;code>npm ls &amp;lt;package&amp;gt;&lt;/code>通过解析package-lock.json构建依赖树，输出采用树形结构展示：&lt;/p>
&lt;ol>
&lt;li>显示指定包的所有安装版本&lt;/li>
&lt;li>标注依赖路径（直接依赖标注为deduped）&lt;/li>
&lt;li>使用颜色区分正常/缺失/重复的包&lt;/li>
&lt;/ol>
&lt;p>node_modules目录采用扁平化结构（npm v3+）：&lt;/p>
&lt;ul>
&lt;li>顶层目录包含所有直接依赖&lt;/li>
&lt;li>嵌套依赖存在于父级包的node_modules中&lt;/li>
&lt;li>符号链接处理版本冲突（常见于pnpm）&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆npm list与npm ls（二者等价）&lt;/li>
&lt;li>忽略&amp;ndash;depth参数导致输出冗长&lt;/li>
&lt;li>未考虑peerDependencies的特殊性&lt;/li>
&lt;li>手动检查时漏查嵌套依赖&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>推荐方案&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="fe4005c" class="language-bash ">
 &lt;code># 精确查询生产依赖（避免查询devDependencies）
npm ls &amp;lt;package&amp;gt; --depth=0 --prod

# 完整依赖树查询（显示所有引用路径）
npm ls &amp;lt;package&amp;gt; -a&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>手动检查步骤&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>查看package.json的dependencies/devDependencies&lt;/li>
&lt;li>在node_modules顶层目录查找目标包&lt;/li>
&lt;li>使用find命令深度搜索：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6d678f4" class="language-bash ">
 &lt;code>find ./node_modules -wholename &amp;#34;*/&amp;lt;package&amp;gt;/package.json&amp;#34;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="5241939" class="language-javascript ">
 &lt;code>// 通过require.resolve检测包是否存在
function checkPackageExists(packageName) {
 try {
 require.resolve(packageName);
 return true;
 } catch (e) {
 if (e.code === &amp;#39;MODULE_NOT_FOUND&amp;#39;) {
 return false;
 }
 throw e;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化建议">优化建议 &lt;a href="#%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>添加缓存机制避免重复检测&lt;/li>
&lt;li>并行处理多个包检测请求&lt;/li>
&lt;li>支持多包管理器（Yarn/pnpm）的检测逻辑&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何检测全局安装的包？&lt;/strong>
使用&lt;code>npm ls -g --depth=0&lt;/code>查看全局安装包&lt;/p></description></item><item><title>npm script生命周期钩子</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-08/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-08/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>npm生态理解&lt;/strong>：对Node.js包管理工具核心机制的理解深度&lt;/li>
&lt;li>&lt;strong>工程化实践&lt;/strong>：对前端工程化中构建/发布流程的掌控能力&lt;/li>
&lt;li>&lt;strong>脚本控制能力&lt;/strong>：对自动化工具链中关键节点的精准控制意识&lt;/li>
&lt;/ol>
&lt;p>具体评估点：&lt;/p>
&lt;ul>
&lt;li>生命周期钩子的完整认知体系&lt;/li>
&lt;li>发布/安装流程中脚本执行顺序的掌握&lt;/li>
&lt;li>新版npm（v7+）与传统版本的区别理解&lt;/li>
&lt;li>安全风险防范意识（如postinstall潜在危险）&lt;/li>
&lt;li>预处理/后处理脚本的典型应用场景&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>生命周期阶段 &amp;gt; 版本差异 &amp;gt; 安全规范 &amp;gt; 典型应用&lt;/p>
&lt;h3 id="核心机制">核心机制 &lt;a href="#%e6%a0%b8%e5%bf%83%e6%9c%ba%e5%88%b6" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm脚本通过约定前缀实现自动触发：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>pre&lt;/strong> 前缀：主脚本执行前触发（如 &lt;code>prebuild&lt;/code>）&lt;/li>
&lt;li>&lt;strong>post&lt;/strong> 前缀：主脚本执行后触发（如 &lt;code>postbuild&lt;/code>）&lt;/li>
&lt;/ol>
&lt;p>特殊生命周期钩子触发逻辑：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>钩子名称&lt;/th>
 &lt;th>触发场景&lt;/th>
 &lt;th>版本变化影响&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>prepublish&lt;/td>
 &lt;td>1. &lt;code>npm publish&lt;/code> 前&lt;br>2. &lt;code>npm install&lt;/code>（无&lt;code>node_modules&lt;/code>时）&lt;/td>
 &lt;td>npm@7后仅在publish时触发&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>prepublishOnly&lt;/td>
 &lt;td>仅&lt;code>npm publish&lt;/code>前执行&lt;/td>
 &lt;td>替代旧版prepublish&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>prepare&lt;/td>
 &lt;td>1. &lt;code>npm publish&lt;/code>前&lt;br>2. 本地&lt;code>npm install&lt;/code>（Git依赖）&lt;/td>
 &lt;td>推荐构建入口&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>postinstall&lt;/td>
 &lt;td>包安装完成后&lt;/td>
 &lt;td>CI/CD环境常用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>prepack&lt;/td>
 &lt;td>&lt;code>npm pack&lt;/code>/&lt;code>publish&lt;/code>前&lt;/td>
 &lt;td>影响包内容验证&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="典型误区">典型误区 &lt;a href="#%e5%85%b8%e5%9e%8b%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>认为&lt;code>prepublish&lt;/code>只与发布相关（实际旧版npm在安装时可能触发）&lt;/li>
&lt;li>混淆&lt;code>prepare&lt;/code>与&lt;code>prepublishOnly&lt;/code>的使用场景&lt;/li>
&lt;li>在&lt;code>postinstall&lt;/code>中执行高危操作（如网络请求）&lt;/li>
&lt;li>未考虑脚本执行失败对主流程的影响&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>npm脚本生命周期分为&lt;strong>默认阶段&lt;/strong>和&lt;strong>扩展阶段&lt;/strong>，核心钩子触发逻辑如下：&lt;/p></description></item><item><title>npm run命令执行流程</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-09/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-09/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考查以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Node.js工具链理解&lt;/strong>：对npm脚本执行机制的整体认知&lt;/li>
&lt;li>&lt;strong>模块解析机制&lt;/strong>：PATH环境变量处理与二进制文件查找逻辑&lt;/li>
&lt;li>&lt;strong>工程化配置能力&lt;/strong>：package.json scripts配置与项目依赖管理的关系&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>npm脚本执行时的PATH环境变量优先级&lt;/li>
&lt;li>node_modules/.bin目录的生成机制与作用&lt;/li>
&lt;li>npm生命周期环境变量的注入过程&lt;/li>
&lt;li>本地模块与全局模块的解析差异&lt;/li>
&lt;li>Shell执行环境的创建与配置&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>PATH环境变量扩展 &amp;gt; node_modules/.bin机制 &amp;gt; npm生命周期钩子&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>路径解析&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>执行&lt;code>npm run xxx&lt;/code>时，npm会创建子Shell环境&lt;/li>
&lt;li>临时将&lt;code>node_modules/.bin&lt;/code>添加到PATH变量最前端&lt;/li>
&lt;li>通过which命令在PATH中查找可执行文件&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>环境变量注入&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>自动注入项目级环境变量（如&lt;code>npm_package_version&lt;/code>）&lt;/li>
&lt;li>继承当前Shell环境变量&lt;/li>
&lt;li>添加npm特有变量（如&lt;code>npm_node_execpath&lt;/code>）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>.bin目录作用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>存储项目依赖包的二进制软链接&lt;/li>
&lt;li>通过npm install自动生成&lt;/li>
&lt;li>解决本地安装包的命令行工具调用问题&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为npm直接执行全局安装的命令&lt;/li>
&lt;li>混淆package.json中bin字段与.bin目录的关系&lt;/li>
&lt;li>不了解跨平台兼容性的实现原理（如cmd-shim机制）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>当执行&lt;code>npm run xxx&lt;/code>时：&lt;/p>
&lt;ol>
&lt;li>读取项目package.json的scripts字段，定位对应脚本命令&lt;/li>
&lt;li>创建子Shell环境，将node_modules/.bin路径插入PATH最前端&lt;/li>
&lt;li>合并当前环境变量与npm特定环境变量（如npm_package_前缀变量）&lt;/li>
&lt;li>解析脚本命令时，优先使用node_modules/.bin下的可执行文件&lt;/li>
&lt;li>最终通过系统Shell执行解析后的完整命令&lt;/li>
&lt;/ol>
&lt;p>其中node_modules/.bin目录通过npm install自动创建，通过软链接映射依赖包的bin字段定义，使得本地安装的CLI工具可直接调用。&lt;/p>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="典型场景示例">典型场景示例 &lt;a href="#%e5%85%b8%e5%9e%8b%e5%9c%ba%e6%99%af%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4885af6" class="language-javascript ">
 &lt;code>// package.json
{
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;lint&amp;#34;: &amp;#34;eslint src&amp;#34;
 },
 &amp;#34;dependencies&amp;#34;: {
 &amp;#34;eslint&amp;#34;: &amp;#34;^8.0.0&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>执行流程解析&lt;/strong>：&lt;/p></description></item><item><title>加速npm install的策略</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-10/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-10/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考查候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化实践能力&lt;/strong>：对前端工具链优化方案的理解与实施经验&lt;/li>
&lt;li>&lt;strong>网络层优化意识&lt;/strong>：对依赖下载过程瓶颈的识别与解决方案&lt;/li>
&lt;li>&lt;strong>包管理器机制理解&lt;/strong>：对npm内部工作原理的掌握程度&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>镜像源加速原理与配置方法&lt;/li>
&lt;li>npm缓存机制及磁盘利用优化&lt;/li>
&lt;li>lockfile在确定性安装中的应用&lt;/li>
&lt;li>依赖解析算法的时间复杂度差异&lt;/li>
&lt;li>现代包管理器替代方案的优劣对比&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>CDN镜像 &amp;gt; 缓存策略 &amp;gt; 确定性安装（npm ci）&amp;gt; 依赖分析优化 &amp;gt; 现代包管理器&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>镜像源加速&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>通过替换registry配置将请求路由到国内CDN节点（如淘宝镜像）&lt;/li>
&lt;li>缩短网络传输的物理路径（RTT减少50-200ms）&lt;/li>
&lt;li>避免跨国网络拥塞和DNS污染问题&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>缓存优化&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>npm使用&lt;code>~/.npm&lt;/code>目录缓存已下载的tar包&lt;/li>
&lt;li>通过&lt;code>--prefer-offline&lt;/code>参数优先使用缓存&lt;/li>
&lt;li>硬链接技术（如pnpm）通过引用计数复用文件块&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>npm ci&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>跳过package.json解析，直接读取package-lock.json&lt;/li>
&lt;li>删除现有node_modules保证环境纯净&lt;/li>
&lt;li>适用于CI/CD环境，安装速度提升30%-50%&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误以为所有registry都支持相同的API接口&lt;/li>
&lt;li>混淆npm cache clean与缓存验证机制&lt;/li>
&lt;li>在未提交lockfile的项目中使用npm ci&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>三种加速方案及原理：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>使用国内镜像源&lt;/strong>&lt;br>
配置registry指向阿里云镜像（registry.npmmirror.com），通过CDN加速下载过程，减少跨国网络延迟。可搭配nrm工具管理多源配置。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>利用缓存机制&lt;/strong>&lt;br>
通过&lt;code>npm install --prefer-offline&lt;/code>优先使用本地缓存，避免重复下载未变更的依赖包。对于Monorepo项目，可使用pnpm的硬链接技术共享依赖存储。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用npm ci命令&lt;/strong>&lt;br>
在持续集成环境中，通过读取lockfile进行确定性安装，跳过依赖版本解析阶段。相比常规install命令减少40%的依赖分析时间，且保证环境一致性。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="镜像配置示例">镜像配置示例 &lt;a href="#%e9%95%9c%e5%83%8f%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="d3c121c" class="language-bash ">
 &lt;code># 永久配置
npm config set registry https://registry.npmmirror.com

# 单次安装使用
npm install --registry=https://registry.npmmirror.com&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="缓存优化方案">缓存优化方案 &lt;a href="#%e7%bc%93%e5%ad%98%e4%bc%98%e5%8c%96%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="03d28c1" class="language-javascript ">
 &lt;code>// package.json
{
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;install:ci&amp;#34;: &amp;#34;npm ci --prefer-offline --audit=false&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>&lt;code>--audit=false&lt;/code> 禁用安全审计提升速度&lt;/li>
&lt;li>&lt;code>--prefer-offline&lt;/code> 优先使用缓存副本&lt;/li>
&lt;/ul>
&lt;h3 id="现代包管理器迁移">现代包管理器迁移 &lt;a href="#%e7%8e%b0%e4%bb%a3%e5%8c%85%e7%ae%a1%e7%90%86%e5%99%a8%e8%bf%81%e7%a7%bb" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8489857" class="language-bash ">
 &lt;code># 使用pnpm安装（利用内容寻址存储）
npm install -g pnpm
pnpm install --store-dir ./node_modules/.pnpm-store&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>硬链接技术减少磁盘空间占用70%+&lt;/li>
&lt;li>并行下载提速30%&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何验证npm缓存的有效性？&lt;/strong>&lt;br>
使用&lt;code>npm cache verify&lt;/code>检查完整性，对比哈希值与registry元数据&lt;/p></description></item><item><title>npm install与npm ci的区别</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-11/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-11/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化实践能力&lt;/strong>：对现代前端工程依赖管理的理解深度&lt;/li>
&lt;li>&lt;strong>构建流程优化意识&lt;/strong>：持续集成场景下的最佳实践掌握程度&lt;/li>
&lt;li>&lt;strong>版本控制认知&lt;/strong>：对lock文件机制及其在团队协作中的作用理解&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>lock文件（package-lock.json）的作用机制&lt;/li>
&lt;li>确定性依赖安装的实现原理&lt;/li>
&lt;li>CI/CD环境下的依赖管理策略&lt;/li>
&lt;li>缓存机制对构建速度的影响&lt;/li>
&lt;li>安全性与一致性保障方案&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>依赖确定性保证&lt;/strong>：package-lock.json &amp;gt; node_modules处理策略 &amp;gt; 缓存机制&lt;/li>
&lt;li>&lt;strong>环境适配&lt;/strong>：开发环境 vs 生产环境 vs CI/CD环境&lt;/li>
&lt;li>&lt;strong>安装策略差异&lt;/strong>：增量安装 vs 全新安装&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;code>npm install&lt;/code>采用柔性安装策略：&lt;/p>
&lt;ol>
&lt;li>检查是否存在lock文件&lt;/li>
&lt;li>若存在则按lock文件安装（除非依赖范围不符）&lt;/li>
&lt;li>更新版本时自动修改lock文件&lt;/li>
&lt;li>支持增量安装（保留现有node_modules）&lt;/li>
&lt;/ol>
&lt;p>&lt;code>npm ci&lt;/code>采用严格安装模式：&lt;/p>
&lt;ol>
&lt;li>强制要求存在lock文件&lt;/li>
&lt;li>删除现有node_modules重新安装&lt;/li>
&lt;li>严格匹配lock文件版本（偏差则报错）&lt;/li>
&lt;li>跳过package.json版本范围检查&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>认为&amp;quot;npm install总会更新lock文件&amp;quot;（仅在依赖范围允许时更新）&lt;/li>
&lt;li>混淆npm ci与npm install &amp;ndash;production的行为差异&lt;/li>
&lt;li>误判删除node_modules的必要性（可能导致模块残留问题）&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;code>npm install&lt;/code>是弹性依赖安装命令，根据package.json语义版本安装最新兼容版本，可能更新lock文件。而&lt;code>npm ci&lt;/code>是Clean Install的缩写，专为自动化环境设计，强制要求lock文件存在且完全匹配版本，通过删除node_modules确保环境纯净。&lt;/p>
&lt;p>在CI/CD环境中推荐使用&lt;code>npm ci&lt;/code>的主要原因：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>安装确定性&lt;/strong>：锁定精确版本避免&amp;quot;works on my machine&amp;quot;问题&lt;/li>
&lt;li>&lt;strong>构建速度优化&lt;/strong>：跳过版本解析直接读取lock文件&lt;/li>
&lt;li>&lt;strong>环境纯净性&lt;/strong>：每次全新安装避免残留文件干扰&lt;/li>
&lt;li>&lt;strong>失败早现&lt;/strong>：版本冲突在构建阶段立即暴露&lt;/li>
&lt;li>&lt;strong>安全防护&lt;/strong>：防止恶意依赖注入攻击(SECURITY.md)&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="典型ci配置示例">典型CI配置示例 &lt;a href="#%e5%85%b8%e5%9e%8bci%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="0dc5c7c" class="language-javascript ">
 &lt;code>// .gitlab-ci.yml
build_job:
 stage: build
 cache:
 key: ${CI_COMMIT_REF_SLUG}
 paths:
 - node_modules/
 script:
 - npm ci --prefer-offline --audit=false
 - npm run build&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化说明&lt;/strong>：&lt;/p></description></item><item><title>npm包平滑升级策略</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-12/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-12/</guid><description>&lt;h2 id="回答">回答 &lt;a href="#%e5%9b%9e%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;hr>
&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>本题主要考察以下核心能力：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>依赖管理能力&lt;/strong>：通过&lt;code>npm outdated&lt;/code>识别过时依赖，使用&lt;code>npm update&lt;/code>控制升级范围&lt;/li>
&lt;li>&lt;strong>SemVer规范理解&lt;/strong>：准确解析版本号语义（major/minor/patch），理解版本符号（^/~）的行为差异&lt;/li>
&lt;li>&lt;strong>风险控制意识&lt;/strong>：避免自动升级导致Breaking Change的防护策略&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：制定可持续维护的版本控制方案，平衡稳定性和新特性&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Semantic Versioning规范的实际应用&lt;/li>
&lt;li>npm依赖版本符号的精确含义&lt;/li>
&lt;li>锁定文件（package-lock.json）的作用机制&lt;/li>
&lt;li>破坏性变更的识别与处理方法&lt;/li>
&lt;li>渐进式升级的CI/CD集成方案&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>Semantic Versioning &amp;gt; 2. npm版本符号 &amp;gt; 3. 锁定文件机制 &amp;gt; 4. 依赖范围控制&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>&lt;strong>SemVer规范&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>版本号格式为&lt;code>MAJOR.MINOR.PATCH&lt;/code>&lt;/li>
&lt;li>MAJOR：不兼容的API修改&lt;/li>
&lt;li>MINOR：向下兼容的功能新增&lt;/li>
&lt;li>PATCH：向下兼容的问题修复&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>npm版本符号&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>^1.2.3&lt;/code>：允许MINOR和PATCH升级（自动更新到1.x.x）&lt;/li>
&lt;li>&lt;code>~1.2.3&lt;/code>：仅允许PATCH升级（自动更新到1.2.x）&lt;/li>
&lt;li>无符号：固定精确版本&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>npm outdated输出解析&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="191b671" class="language-bash ">
 &lt;code>Package Current Wanted Latest
lodash 4.17.1 4.17.20 5.0.0&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>Current：当前安装版本&lt;/li>
&lt;li>Wanted：符合package.json约束的最高版本&lt;/li>
&lt;li>Latest：注册表最新版本&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>更新策略&lt;/strong>：&lt;/p>
&lt;pre class="mermaid">graph TD
 A[npm outdated] --&amp;gt; B{Latest = Wanted?}
 B -- 是 --&amp;gt; C[安全执行npm update]
 B -- 否 --&amp;gt; D[手动审查Breaking Change]
&lt;/pre>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>误认&lt;code>npm update&lt;/code>会升级到Latest版本（实际遵守package.json的版本范围）&lt;/li>
&lt;li>混淆&lt;code>^&lt;/code>与&lt;code>~&lt;/code>的行为差异导致意外升级&lt;/li>
&lt;li>未提交锁定文件引发环境差异&lt;/li>
&lt;li>未识别传递依赖（Transitive Dependencies）的版本冲突&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>建议采用渐进式升级四步法：&lt;/p></description></item><item><title>npm包紧急Bug修复方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-13/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-13/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>npm依赖管理机制理解&lt;/strong>：对package.json配置、依赖解析规则的掌握程度&lt;/li>
&lt;li>&lt;strong>应急问题解决能力&lt;/strong>：在线上事故场景下快速实施临时修复的技术判断力&lt;/li>
&lt;li>&lt;strong>工程化协作意识&lt;/strong>：补丁方案的可持续维护性及团队协作考量&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Git依赖引用与Semver规范的实际应用&lt;/li>
&lt;li>文件系统依赖的本地调试技巧&lt;/li>
&lt;li>补丁包工具链(patch-package)的工作原理&lt;/li>
&lt;li>不同方案的版本控制策略差异&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>patch-package &amp;gt; Git仓库引用 &amp;gt; 本地路径引用&lt;/li>
&lt;li>方案选择标准：修复持久性 &amp;gt; 团队协作成本 &amp;gt; 部署便捷性&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Git仓库引用&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="feb8a04" class="language-json ">
 &lt;code>{
 &amp;#34;dependencies&amp;#34;: {
 &amp;#34;buggy-package&amp;#34;: &amp;#34;github:user/buggy-package#hotfix-branch&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>通过#符号指定分支/commit hash，优先级高于语义化版本&lt;/li>
&lt;li>依赖解析时会执行&lt;code>git clone&lt;/code>操作，要求仓库具备访问权限&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>本地路径引用&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="a9b17dc" class="language-json ">
 &lt;code>{
 &amp;#34;dependencies&amp;#34;: {
 &amp;#34;buggy-package&amp;#34;: &amp;#34;file:../patched-package&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>适用于本地开发调试，依赖目录必须包含package.json&lt;/li>
&lt;li>需要手动执行&lt;code>npm install&lt;/code>同步变更&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>patch-package&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="926476c" class="language-bash ">
 &lt;code>npm install patch-package --save-dev
# 修改node_modules代码后
npx patch-package buggy-package&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>通过diff算法生成补丁文件（.patch）&lt;/li>
&lt;li>在postinstall钩子中自动应用补丁&lt;/li>
&lt;li>补丁文件需提交到版本控制系统&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误将node_modules修改直接提交到仓库&lt;/li>
&lt;li>未锁定Git依赖的commit hash导致后续安装版本漂移&lt;/li>
&lt;li>忽略peerDependencies导致的二次问题&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>当第三方npm包存在紧急Bug时，可通过以下步骤临时修复：&lt;/p></description></item><item><title>npm workspaces的用途与配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-14/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-14/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察候选人以下能力：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Monorepo工程化理解&lt;/strong>：能否准确识别多仓库管理的核心痛点（依赖冗余、协作成本、版本碎片）&lt;/li>
&lt;li>&lt;strong>npm生态掌握程度&lt;/strong>：是否熟悉现代npm特性，特别是v7+的workspaces机制&lt;/li>
&lt;li>&lt;strong>工具链演进判断&lt;/strong>：能否对比Lerna等传统方案，说明官方解决方案优势&lt;/li>
&lt;li>&lt;strong>配置实践能力&lt;/strong>：workspaces字段配置、依赖声明规范、脚本批量执行技巧&lt;/li>
&lt;/ol>
&lt;p>核心评估点：&lt;/p>
&lt;ul>
&lt;li>Monorepo模式下依赖拓扑管理&lt;/li>
&lt;li>Hoisting机制与符号链接原理&lt;/li>
&lt;li>跨包脚本执行与生命周期管理&lt;/li>
&lt;li>工作区协议（workspace: protocol）的使用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>依赖提升（Hoisting）&lt;/strong>：将重复依赖提升到根node_modules，避免多副本&lt;/li>
&lt;li>&lt;strong>符号链接（Symlink）&lt;/strong>：子包通过软链访问根模块&lt;/li>
&lt;li>&lt;strong>工作区协议&lt;/strong>：&lt;code>&amp;quot;dependencies&amp;quot;: { &amp;quot;shared-lib&amp;quot;: &amp;quot;workspace:*&amp;quot; }&lt;/code>&lt;/li>
&lt;li>&lt;strong>批量脚本执行&lt;/strong>：&lt;code>npm run &amp;lt;command&amp;gt; --workspaces&lt;/code>&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm workspaces通过顶层&lt;code>package.json&lt;/code>的&lt;code>workspaces&lt;/code>字段声明子包路径（如&lt;code>[&amp;quot;packages/*&amp;quot;]&lt;/code>）。执行&lt;code>npm install&lt;/code>时：&lt;/p>
&lt;ol>
&lt;li>收集所有子包依赖，构建统一依赖树&lt;/li>
&lt;li>将公共依赖提升至根node_modules&lt;/li>
&lt;li>为子包创建符号链接，实现跨包引用&lt;/li>
&lt;li>自动解析&lt;code>workspace:&lt;/code>协议版本，保持本地开发链路&lt;/li>
&lt;/ol>
&lt;p>相比Lerna，原生支持避免了：&lt;/p>
&lt;ul>
&lt;li>需要单独安装工具链&lt;/li>
&lt;li>复杂的&lt;code>lerna bootstrap&lt;/code>流程&lt;/li>
&lt;li>手动配置cross-dependencies&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误以为所有依赖必须提升（实际允许子包独立依赖）&lt;/li>
&lt;li>混淆&lt;code>workspace:*&lt;/code>与语义化版本&lt;/li>
&lt;li>未使用&lt;code>--workspaces&lt;/code>参数导致单包运行&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>npm workspaces解决Monorepo中：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>依赖冗余&lt;/strong>：通过hoisting减少重复安装&lt;/li>
&lt;li>&lt;strong>跨包调试困难&lt;/strong>：符号链接实现实时代码联动&lt;/li>
&lt;li>&lt;strong>脚本重复&lt;/strong>：支持批量执行测试/构建命令&lt;/li>
&lt;/ol>
&lt;p>配置示例（根package.json）：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="11fd64a" class="language-json ">
 &lt;code>{
 &amp;#34;workspaces&amp;#34;: [&amp;#34;packages/*&amp;#34;],
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;build&amp;#34;: &amp;#34;npm run build --workspaces&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>依赖共享实现：&lt;/p></description></item><item><title>npm/Yarn/pnpm对比分析</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-15/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-15/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考查候选人对前端工程化工具的深度理解，重点评估：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>包管理机制原理&lt;/strong>：对node_modules组织结构（扁平化/opy-link/硬链接）的理解深度&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：识别不同包管理工具在安装速度、磁盘利用率方面的核心差异&lt;/li>
&lt;li>&lt;strong>生态适配能力&lt;/strong>：分析工具链与现有前端生态（Monorepo、CI/CD、第三方包）的兼容性问题&lt;/li>
&lt;li>&lt;strong>工程决策能力&lt;/strong>：根据项目特点（如SSD敏感、微前端架构）选择合适的工具链&lt;/li>
&lt;/ol>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>依赖存储策略 &amp;gt; 2. 安装算法优化 &amp;gt; 3. 生态兼容机制&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>npm@3+&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>采用扁平化（flat）结构，通过hoisting提升依赖层级&lt;/li>
&lt;li>存在幽灵依赖（Phantom dependencies）和依赖重复问题&lt;/li>
&lt;li>安装过程存在大量I/O操作，速度较慢&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Yarn&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>引入确定性算法（lockfile）和并行下载&lt;/li>
&lt;li>Plug&amp;rsquo;n&amp;rsquo;Play模式（PnP）彻底取消node_modules，但生态适配成本高&lt;/li>
&lt;li>全局缓存机制显著提升二次安装速度；&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>pnpm&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>基于内容寻址存储（CAS）+硬链接（hard link）的存储策略&lt;/li>
&lt;li>目录结构保持嵌套关系，通过符号链接组织依赖树&lt;/li>
&lt;li>依赖隔离性最佳，彻底杜绝幽灵依赖；&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误以为Yarn比npm快是因其算法突破（实际核心优势在于缓存）&lt;/li>
&lt;li>混淆硬链接与符号链接的存储差异&lt;/li>
&lt;li>忽视PnP模式对旧项目的适配成本&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>npm采用扁平化结构导致依赖提升不可控，Yarn通过确定性锁文件和缓存优化安装速度，pnpm创新性使用硬链接实现跨项目依赖共享。安装速度：pnpm &amp;gt; Yarn &amp;gt; npm（冷启动场景）；磁盘效率：pnpm依赖复用率高达90%（实测node_modules体积减少50%+）；生态方面npm/Yarn更成熟，pnpm需处理符号链接引发的兼容问题（约5%包需调整）。&lt;/p>
&lt;p>适用场景：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>磁盘敏感&lt;/strong>：pnpm（Docker容器/低配设备）&lt;/li>
&lt;li>&lt;strong>稳定优先&lt;/strong>：Yarn（企业级应用）&lt;/li>
&lt;li>&lt;strong>兼容至上&lt;/strong>：npm（遗留系统维护）&lt;/li>
&lt;/ul>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例pnpm硬链接验证">编码示例（pnpm硬链接验证） &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8bpnpm%e7%a1%ac%e9%93%be%e6%8e%a5%e9%aa%8c%e8%af%81" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="bbc3bd3" class="language-bash ">
 &lt;code># 查看全局存储目录
$ pnpm store path

# 创建硬链接演示
$ pnpm add lodash@1.2.3
$ ls -l node_modules/.pnpm/lodash@1.2.3/node_modules
# 输出显示硬链接计数增加（不同项目共享同一磁盘区块）&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Monorepo场景&lt;/strong>：pnpm workspace + changeset 实现高效多包管理&lt;/li>
&lt;li>&lt;strong>CI优化&lt;/strong>：Yarn global cache与CI缓存目录联动&lt;/li>
&lt;li>&lt;strong>混合架构&lt;/strong>：关键子模块使用pnpm，整体用Yarn维持生态兼容&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何检测幽灵依赖？&lt;/strong>&lt;br>
使用depcheck工具扫描package.json未声明依赖&lt;/p></description></item><item><title>npm脚本参数传递规则</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-16/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-16/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>npm工具链理解&lt;/strong>：对npm命令行参数解析机制的理解深度&lt;/li>
&lt;li>&lt;strong>CLI设计规范&lt;/strong>：POSIX系统参数传递规范的实际应用&lt;/li>
&lt;li>&lt;strong>问题诊断能力&lt;/strong>：识别参数截断场景及解决方案&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>双横线在POSIX系统中的特殊含义&lt;/li>
&lt;li>npm参数解析优先级规则&lt;/li>
&lt;li>CLI工具的参数分隔策略&lt;/li>
&lt;li>常见参数传递错误场景&lt;/li>
&lt;li>跨平台参数传递兼容性处理&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>POSIX参数规范&lt;/strong>：双横线&lt;code>--&lt;/code>作为参数分隔符的通用约定&lt;/li>
&lt;li>&lt;strong>npm解析层级&lt;/strong>：npm自身参数与脚本参数的隔离机制&lt;/li>
&lt;li>&lt;strong>Shell扩展特性&lt;/strong>：命令行参数的特殊字符处理&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm使用类似UNIX的&lt;a href="https://man7.org/linux/man-pages/man3/getopt.3.html" rel="external" target="_blank">getopt&lt;svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">&lt;path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/>&lt;/svg>&lt;/a>库处理命令行参数：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="c2d1d0c" class="language-bash ">
 &lt;code>npm run &amp;lt;script&amp;gt; [-- &amp;lt;args&amp;gt;...]&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol>
&lt;li>双横线前：参数由npm进程处理&lt;/li>
&lt;li>双横线后：参数直接传递给脚本&lt;/li>
&lt;/ol>
&lt;p>执行流程示例：&lt;/p></description></item><item><title>npm publish生命周期钩子</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-17/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-17/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：包管理工具原理、自动化工程流程设计、npm脚本机制理解&lt;/p>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>对npm生命周期钩子的执行顺序及触发时机的掌握&lt;/li>
&lt;li>区分易混淆钩子（prepublish/prepublishOnly/prepack）&lt;/li>
&lt;li>利用脚本自动化构建、测试、通知的工程化能力&lt;/li>
&lt;li>对npm现代版本（v7+）最佳实践的认知&lt;/li>
&lt;li>发布流程的安全把控（如前置校验）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;code>prepublishOnly&lt;/code> &amp;gt; &lt;code>postpublish&lt;/code> &amp;gt; &lt;code>prepare&lt;/code> &amp;gt; 版本兼容性&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>执行&lt;code>npm publish&lt;/code>时完整生命周期流程：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>prepublish（已弃用）&lt;/strong>：在打包和安装时均触发（不推荐）&lt;/li>
&lt;li>&lt;strong>prepublishOnly&lt;/strong>：仅&lt;code>npm publish&lt;/code>时触发，在打包&lt;strong>之前&lt;/strong>执行（最佳实践：运行测试/构建）&lt;/li>
&lt;li>&lt;strong>prepack&lt;/strong>：&lt;code>npm pack&lt;/code>前触发（打包.tgz前）&lt;/li>
&lt;li>&lt;strong>postpack&lt;/strong>：生成.tgz后触发&lt;/li>
&lt;li>&lt;strong>postpublish&lt;/strong>：包发布到registry&lt;strong>后&lt;/strong>触发（适合通知/清理）&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8cae151" class="language-bash ">
 &lt;code># 典型执行流
npm publish
→ prepublishOnly
→ prepack → 生成包 → postpack
→ 上传到npm registry
→ postpublish&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆&lt;code>prepublish&lt;/code>与&lt;code>prepublishOnly&lt;/code>（后者仅发布时触发）&lt;/li>
&lt;li>误将构建逻辑放在&lt;code>postpublish&lt;/code>（此时已发布旧版代码）&lt;/li>
&lt;li>未处理脚本执行失败导致错误发布&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>执行&lt;code>npm publish&lt;/code>时主要触发的生命周期钩子：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>prepublishOnly&lt;/strong>：在打包前执行，用于构建和测试，确保发布内容可靠&lt;/li>
&lt;li>&lt;strong>postpublish&lt;/strong>：在包成功上传后执行，适用于通知或清理&lt;/li>
&lt;/ol>
&lt;p>自动化实践示例：&lt;/p>
&lt;ul>
&lt;li>在&lt;code>prepublishOnly&lt;/code>执行测试和构建，避免发布未编译代码&lt;/li>
&lt;li>通过&lt;code>postpublish&lt;/code>发送Slack/邮件通知，或自动生成版本日志&lt;/li>
&lt;li>配合&lt;code>version&lt;/code>钩子实现版本号更新时的文档自动化&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="304d450" class="language-javascript ">
 &lt;code>// package.json
{
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;build&amp;#34;: &amp;#34;babel src -d lib&amp;#34;,
 &amp;#34;test&amp;#34;: &amp;#34;jest&amp;#34;,
 &amp;#34;prepublishOnly&amp;#34;: &amp;#34;npm run build &amp;amp;&amp;amp; npm test&amp;#34;, // 前置校验
 &amp;#34;postpublish&amp;#34;: &amp;#34;node scripts/notify.js&amp;#34; // 发布后通知
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化策略">优化策略 &lt;a href="#%e4%bc%98%e5%8c%96%e7%ad%96%e7%95%a5" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>前置校验&lt;/strong>：在prepublishOnly中加入安全检查（如漏洞扫描）&lt;/li>
&lt;li>&lt;strong>错误处理&lt;/strong>：添加&lt;code>|| exit 1&lt;/code>确保脚本失败时终止发布&lt;/li>
&lt;li>&lt;strong>性能优化&lt;/strong>：缓存构建结果，避免重复编译&lt;/li>
&lt;/ol>
&lt;h3 id="扩展建议">扩展建议 &lt;a href="#%e6%89%a9%e5%b1%95%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>大流量场景&lt;/strong>：在postpublish中触发CDN预热&lt;/li>
&lt;li>&lt;strong>多环境适配&lt;/strong>：通过环境变量区分测试/正式发布流程&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="如何阻止不符合条件的发布">如何阻止不符合条件的发布？ &lt;a href="#%e5%a6%82%e4%bd%95%e9%98%bb%e6%ad%a2%e4%b8%8d%e7%ac%a6%e5%90%88%e6%9d%a1%e4%bb%b6%e7%9a%84%e5%8f%91%e5%b8%83" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>答：在prepublishOnly中添加版本/分支校验&lt;/p></description></item><item><title>package.json创建方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-18/</link><pubDate>Wed, 05 Mar 2025 12:29:59 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/npm/npm-18/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化配置能力&lt;/strong>：考察对Node.js项目标准化配置的理解&lt;/li>
&lt;li>&lt;strong>npm工具链掌握&lt;/strong>：验证对包管理器基础指令的熟练程度&lt;/li>
&lt;li>&lt;strong>模块化开发规范&lt;/strong>：检查对package.json核心字段作用的理解&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>npm init命令的交互流程与参数配置&lt;/li>
&lt;li>合法package.json的必要字段要求&lt;/li>
&lt;li>语义化版本控制规范（SemVer）&lt;/li>
&lt;li>项目元数据字段的配置标准&lt;/li>
&lt;li>scripts配置项的实际应用场景&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>npm命令行工具 &amp;gt; 语义化版本控制 &amp;gt; 包描述文件规范&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>npm init流程&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>启动交互式命令行问卷&lt;/li>
&lt;li>按序收集包名称(name)、版本(version)、描述(description)等元数据&lt;/li>
&lt;li>自动检测环境变量设置默认值（如git配置的用户信息）&lt;/li>
&lt;li>生成符合CommonJS规范的package.json文件&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心字段约束&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>name&lt;/code>：全小写的URL-safe字符串，遵循&lt;code>[a-z0-9_-]&lt;/code>规则&lt;/li>
&lt;li>&lt;code>version&lt;/code>：必须符合语义化版本&lt;code>x.y.z&lt;/code>格式&lt;/li>
&lt;li>私有项目必须包含&lt;code>&amp;quot;private&amp;quot;: true&lt;/code>防止误发布&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>误认为&lt;code>description&lt;/code>和&lt;code>author&lt;/code>是必填字段&lt;/li>
&lt;li>混淆&lt;code>dependencies&lt;/code>与&lt;code>devDependencies&lt;/code>的使用场景&lt;/li>
&lt;li>手动创建时未遵循JSON严格语法导致解析失败&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>通过以下两种方式创建package.json：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>命令行创建&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="586ca17" class="language-bash ">
 &lt;code>npm init&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>交互流程依次包含：&lt;/p>
&lt;ul>
&lt;li>包名称（默认当前目录名）&lt;/li>
&lt;li>版本号（默认1.0.0）&lt;/li>
&lt;li>项目描述&lt;/li>
&lt;li>入口文件（默认index.js）&lt;/li>
&lt;li>测试命令&lt;/li>
&lt;li>Git仓库地址&lt;/li>
&lt;li>关键词&lt;/li>
&lt;li>许可证（默认ISC）&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>手动创建&lt;/strong>：
必须包含的最小配置：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="97eb595" class="language-json ">
 &lt;code>{
 &amp;#34;name&amp;#34;: &amp;#34;my-package&amp;#34;,
 &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>推荐补充字段：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ca53273" class="language-json ">
 &lt;code>{
 &amp;#34;main&amp;#34;: &amp;#34;index.js&amp;#34;,
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;start&amp;#34;: &amp;#34;node index.js&amp;#34;
 },
 &amp;#34;dependencies&amp;#34;: {}
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1a82155" class="language-javascript ">
 &lt;code>// 使用默认值快速生成（跳过交互问答）
npm init -y

// 自定义初始化模板（适用于企业级项目）
{
 &amp;#34;name&amp;#34;: &amp;#34;company-fe-project&amp;#34;,
 &amp;#34;version&amp;#34;: &amp;#34;0.1.0&amp;#34;,
 &amp;#34;private&amp;#34;: true, // 防止意外发布
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;dev&amp;#34;: &amp;#34;webpack serve --mode development&amp;#34;,
 &amp;#34;build&amp;#34;: &amp;#34;webpack --mode production&amp;#34;
 },
 &amp;#34;browserslist&amp;#34;: [&amp;#34;&amp;gt;1%&amp;#34;, &amp;#34;not dead&amp;#34;]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>多环境配置&lt;/strong>：通过&lt;code>config&lt;/code>字段区分开发/生产环境参数&lt;/li>
&lt;li>&lt;strong>性能优化&lt;/strong>：使用&lt;code>files&lt;/code>字段控制发布体积&lt;/li>
&lt;li>&lt;strong>跨团队协作&lt;/strong>：通过&lt;code>engines&lt;/code>字段约束Node/npm版本&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何跳过所有问答直接生成默认package.json？&lt;/strong>
&lt;code>npm init -y&lt;/code> 或 &lt;code>npm init --yes&lt;/code>&lt;/p></description></item></channel></rss>