<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Node.js 基础 on ClearSec Wiki</title><link>https://www.clearsec.org/wikis/skills/languages/node.js/</link><description>Recent content in Node.js 基础 on ClearSec Wiki</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://www.clearsec.org/wikis/skills/languages/node.js/index.xml" rel="self" type="application/rss+xml"/><item><title>npm 简介</title><link>https://www.clearsec.org/wikis/skills/languages/node.js/npm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.clearsec.org/wikis/skills/languages/node.js/npm/</guid><description>&lt;h2 id="nodejs-包管理"&gt;Node.js 包管理&lt;/h2&gt;
&lt;h3 id="前置知识"&gt;前置知识&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CLI 基本常识&lt;/li&gt;
&lt;li&gt;Node.js 的运行&lt;/li&gt;
&lt;li&gt;Node.js 模块化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="npm"&gt;npm&lt;/h3&gt;
&lt;p&gt;npm 即 Node.js package manager，是 Node.js 默认的包管理工具，按照上节所说的方法安装 Node.js 时，应当已经安装了 npm，可以通过 &lt;code&gt;npm -v&lt;/code&gt; 来检查 npm 是否已安装成功。&lt;/p&gt;
&lt;h3 id="nodejs-的包管理"&gt;Node.js 的包管理&lt;/h3&gt;
&lt;p&gt;新建一个文件夹并执行 &lt;code&gt;npm init&lt;/code&gt; 命令，根据提示填写字段后，我们看到文件夹中多了一个名为 &lt;code&gt;package.json&lt;/code&gt; 的文件，这个文件记录了当前项目的基本信息，如项目名称、描述、版本、证书，以及可能用到的一些操作，还有当前项目的依赖信息，这些信息的作用将在后面说明。&lt;/p&gt;
&lt;h3 id="nodejs-的模块查找"&gt;Node.js 的模块查找&lt;/h3&gt;
&lt;p&gt;上节说到了如何在 Node.js 中引用其他文件导出的模块，但是上节给出的例子都是从相对路径中引入，引入内置或第三方模块时，应当按照如下方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 内置文件系统模块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 一个 web 服务器模块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这并不是相对或绝对的路径，这就要提到 Node.js 寻找模块的逻辑。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于内置模块，在编译阶段已经确定了它们的位置，因此没有寻址的问题；&lt;/li&gt;
&lt;li&gt;对于指定路径的模块：
&lt;ol&gt;
&lt;li&gt;首先查找该文件，缺省的后缀名按照 &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.node&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt; 的顺序尝试；&lt;/li&gt;
&lt;li&gt;然后尝试作为文件夹名查找该文件夹下的 &lt;code&gt;package.json&lt;/code&gt; 并引用其中 &lt;code&gt;main&lt;/code&gt; 字段指定的文件；&lt;/li&gt;
&lt;li&gt;最后尝试作为文件夹名查找该文件夹下的 &lt;code&gt;index&lt;/code&gt; 文件，缺省后缀名逻辑与 c. 相同。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;对于其他没有指定路径的模块，也即通过包管理器安装的模块，会尝试在当前文件夹下的 &lt;code&gt;node_modules&lt;/code&gt; 文件夹下查找，如果查找失败，则依次从上级文件夹中（可能的） &lt;code&gt;node_modules&lt;/code&gt; 文件夹下查找。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="其他包管理器"&gt;其他包管理器&lt;/h3&gt;
&lt;p&gt;上一部分引出了一个重要的问题，当我们需要很多依赖的项目时，如何组织这些项目就成为一个问题，因为 &lt;code&gt;node_modules&lt;/code&gt; 当中的每一个项目都可能有自己的依赖，如果所有项目的依赖都分别安装，显然可能存在许多重复，但是又必须尽量避免不同项目的依赖互相干扰，这就涉及到包管理器的策略问题。&lt;/p&gt;</description></item></channel></rss>