<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F</id>
	<title>Node.js：模块系统 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;action=history"/>
	<updated>2026-05-15T15:09:34Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=6453&amp;oldid=prev</id>
		<title>2023年3月31日 (五) 13:21 Eijux</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=6453&amp;oldid=prev"/>
		<updated>2023-03-31T13:21:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023年3月31日 (五) 21:21的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;第1行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Node.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;js&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Node.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;js教程&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 关于 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 关于 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4100&amp;oldid=prev</id>
		<title>Eijux：​/* exports 和 module.exports 的使用 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4100&amp;oldid=prev"/>
		<updated>2021-05-30T13:55:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;exports 和 module.exports 的使用&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2021年5月30日 (日) 21:55的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l69&quot;&gt;第69行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第69行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;不建议同时使用 exports 和 module.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;exports：&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;不建议同时使用 exports 和 module.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;exports'''：&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: 如果先使用 exports 对外暴露属性或方法，再使用 module.exports 暴露对象，会使得 exports 上暴露的属性或者方法失效。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: 如果先使用 exports 对外暴露属性或方法，再使用 module.exports 暴露对象，会使得 exports 上暴露的属性或者方法失效。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 原因在于：'''exports 仅仅是 module.exports 的一个引用'''：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 原因在于：'''exports 仅仅是 module.exports 的一个引用'''：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;bash&lt;/del&gt;&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;JavaScript&lt;/ins&gt;&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function require(...){&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function require(...){&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   var module = {exports: {}};&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   var module = {exports: {}};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4099&amp;oldid=prev</id>
		<title>Eijux：​/* 引入模块 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4099&amp;oldid=prev"/>
		<updated>2021-05-30T13:54:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;引入模块&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2021年5月30日 (日) 21:54的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l9&quot;&gt;第9行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第9行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: 换言之，'''一个 Node.js 文件就是一个模块'''，这个文件可能是 JavaScript 代码、JSON 或者编译过的C/C++ 扩展。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: 换言之，'''一个 Node.js 文件就是一个模块'''，这个文件可能是 JavaScript 代码、JSON 或者编译过的C/C++ 扩展。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;引入模块 &lt;/del&gt;===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;引入模块：exports  require &lt;/ins&gt;===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Node.js 提供了两个对象：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Node.js 提供了两个对象：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# '''exports''' 是模块公开的接口，（一个模块可不可以有多个接口？）&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# '''exports''' 是模块公开的接口，（一个模块可不可以有多个接口？）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4098&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:Node.js  == 关于 == &lt;pre&gt; 为了让 Node.js 的文件可以相互调用，Node.js 提供了一个简单的模块系统。 &lt;/pre&gt;  '''模块'''（mo…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&amp;diff=4098&amp;oldid=prev"/>
		<updated>2021-05-30T13:54:01Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:Node.js&quot; title=&quot;分类:Node.js&quot;&gt;category:Node.js&lt;/a&gt;  == 关于 == &amp;lt;pre&amp;gt; 为了让 Node.js 的文件可以相互调用，Node.js 提供了一个简单的模块系统。 &amp;lt;/pre&amp;gt;  &amp;#039;&amp;#039;&amp;#039;模块&amp;#039;&amp;#039;&amp;#039;（mo…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Node.js]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
为了让 Node.js 的文件可以相互调用，Node.js 提供了一个简单的模块系统。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''模块'''（module）是 Node.js 应用程序的基本组成部分，'''文件和模块是一一对应的'''。&lt;br /&gt;
: 换言之，'''一个 Node.js 文件就是一个模块'''，这个文件可能是 JavaScript 代码、JSON 或者编译过的C/C++ 扩展。&lt;br /&gt;
&lt;br /&gt;
=== 引入模块 ===&lt;br /&gt;
Node.js 提供了两个对象：&lt;br /&gt;
# '''exports''' 是模块公开的接口，（一个模块可不可以有多个接口？）&lt;br /&gt;
# '''require''' 用于从外部获取一个模块的接口，即所获取模块的 exports 对象。&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
# 创建 hello.js 文件：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
exports.world = function() {&lt;br /&gt;
  console.log('Hello World');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 创建一个 main.js 文件并引入 hello 模块：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var hello = require('./hello');&lt;br /&gt;
hello.world();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在以上示例中，hello.js 通过 exports 对象把 world 作为模块的访问接口，在 main.js 中通过 require('./hello') 加载这个模块，然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。&lt;br /&gt;
* '''node.js 默认后缀为 js'''；&lt;br /&gt;
&lt;br /&gt;
=== module.exports ===&lt;br /&gt;
有时候我们只是想把一个对象封装到模块中，格式如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
module.exports = function() {&lt;br /&gt;
  // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
# 创建 hello.js 文件：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
// hello.js &lt;br /&gt;
function Hello() { &lt;br /&gt;
    var name; &lt;br /&gt;
    this.setName = function(thyName) { &lt;br /&gt;
        name = thyName; &lt;br /&gt;
    }; &lt;br /&gt;
    this.sayHello = function() { &lt;br /&gt;
        console.log('Hello ' + name); &lt;br /&gt;
    }; &lt;br /&gt;
}; &lt;br /&gt;
module.exports = Hello;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 获得这个对象：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
//main.js &lt;br /&gt;
var Hello = require('./hello'); &lt;br /&gt;
hello = new Hello(); &lt;br /&gt;
hello.setName('BYVoid'); &lt;br /&gt;
hello.sayHello(); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
模块接口的唯一变化是使用 module.exports = Hello 代替了 exports.world = function(){}：在外部引用该模块时，其接口对象就是要输出的 Hello 对象本身，而不是原先的 exports。&lt;br /&gt;
&lt;br /&gt;
=== exports 和 module.exports 的使用 ===&lt;br /&gt;
如果要对外：&lt;br /&gt;
# '''暴露属性或方法'''，使用 exports；&lt;br /&gt;
# '''暴露对象'''（类似class，包含了很多属性和方法），使用 module.exports。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
不建议同时使用 exports 和 module.exports：&lt;br /&gt;
: 如果先使用 exports 对外暴露属性或方法，再使用 module.exports 暴露对象，会使得 exports 上暴露的属性或者方法失效。&lt;br /&gt;
* 原因在于：'''exports 仅仅是 module.exports 的一个引用'''：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
function require(...){&lt;br /&gt;
  var module = {exports: {}};&lt;br /&gt;
&lt;br /&gt;
  ((module, exports) =&amp;gt; {&lt;br /&gt;
    function myfn () {}&lt;br /&gt;
    // 这个myfn就是我们自己的代码&lt;br /&gt;
    exports.myfn = myfn; // 这里是在原本的对象上添加了一个myfn方法。&lt;br /&gt;
    module.exports = myfn;// 这个直接把当初的对象进行覆盖。&lt;br /&gt;
  })(module,module.exports)&lt;br /&gt;
  return module.exports;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 服务端的模块放在哪里 ==&lt;br /&gt;
Node.js 中自带了一个叫做 '''http''' 的模块，我们在代码中请求它并把返回值赋给一个本地变量：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var http = require(&amp;quot;http&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
http.createServer(...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这把我们的本地变量变成了一个拥有所有 http 模块所提供的公共方法的对象。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Node.js 的 require 方法中的'''文件查找策略'''如下：&lt;br /&gt;
: [[File:Node.js：文件查找策略.png|400px]]&lt;br /&gt;
* 尽管 require 方法极其简单，但由于 Node.js 中存在 4 类模块（'''原生模块''' 和 '''3 种文件模块'''），所以内部的加载却是十分复杂的，其加载优先级也各自不同。&lt;br /&gt;
&lt;br /&gt;
=== 从“文件模块缓存”中加载 ===&lt;br /&gt;
尽管原生模块与文件模块的优先级不同，但是都会'''优先从文件模块的缓存中加载已经存在的模块'''。&lt;br /&gt;
&lt;br /&gt;
=== 从“原生模块”加载 ===&lt;br /&gt;
原生模块的优先级仅次于文件模块缓存的优先级。&lt;br /&gt;
: require 方法在解析文件名之后，优先检查模块是否在原生模块列表中。&lt;br /&gt;
&lt;br /&gt;
以 http 模块为例，尽管在目录下存在一个 http/http.js/http.node/http.json 文件，require(&amp;quot;http&amp;quot;) 都不会从这些文件中加载，而是从原生模块中加载。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 原生模块也有一个缓存区，同样也是优先从缓存区加载。如果缓存区没有被加载过，则调用原生模块的加载方式进行加载和执行。&lt;br /&gt;
&lt;br /&gt;
=== 从“文件”加载 ===&lt;br /&gt;
当文件模块缓存中不存在，而且不是原生模块的时候，Node.js 会解析 require 方法传入的参数，并从文件系统中加载实际的文件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require 方法接受以下几种参数的传递：&lt;br /&gt;
* http、fs、path 等，原生模块。&lt;br /&gt;
* ./mod 或 ../mod，相对路径的文件模块。&lt;br /&gt;
* /pathtomodule/mod，绝对路径的文件模块。&lt;br /&gt;
* mod，非原生模块的文件模块。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在路径 Y 下执行 require(X) 语句执行顺序：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
1. 如果 X 是内置模块&lt;br /&gt;
   a. 返回内置模块&lt;br /&gt;
   b. 停止执行&lt;br /&gt;
2. 如果 X 以 '/' 开头&lt;br /&gt;
   a. 设置 Y 为文件根路径&lt;br /&gt;
3. 如果 X 以 './' 或 '/' or '../' 开头&lt;br /&gt;
   a. LOAD_AS_FILE(Y + X)&lt;br /&gt;
   b. LOAD_AS_DIRECTORY(Y + X)&lt;br /&gt;
4. LOAD_NODE_MODULES(X, dirname(Y))&lt;br /&gt;
5. 抛出异常 &amp;quot;not found&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LOAD_AS_FILE(X)&lt;br /&gt;
1. 如果 X 是一个文件, 将 X 作为 JavaScript 【文本】载入并停止执行。&lt;br /&gt;
2. 如果 X.js 是一个文件, 将 X.js 作为 JavaScript 【文本】载入并停止执行。&lt;br /&gt;
3. 如果 X.json 是一个文件, 解析 X.json 为 JavaScript 【对象】并停止执行。&lt;br /&gt;
4. 如果 X.node 是一个文件, 将 X.node 作为【二进制插件】载入并停止执行。&lt;br /&gt;
&lt;br /&gt;
LOAD_AS_DIRECTORY(X)&lt;br /&gt;
1. 如果 X/package.json 是一个文件,&lt;br /&gt;
   a. 解析 X/package.json, 并查找 &amp;quot;main&amp;quot; 字段。&lt;br /&gt;
   b. let M = X + (json main 字段)&lt;br /&gt;
   c. LOAD_AS_FILE(M)&lt;br /&gt;
   d. LOAD_INDEX(M)&lt;br /&gt;
2. LOAD_INDEX(X)&lt;br /&gt;
&lt;br /&gt;
LOAD_INDEX(X)&lt;br /&gt;
1. 如果 X/index.js 是一个文件,  将 X/index.js 作为 JavaScript 文本载入并停止执行。&lt;br /&gt;
2. 如果 X/index.json 是一个文件, 解析 X/index.json 为 JavaScript 对象并停止执行。&lt;br /&gt;
3. 如果 X/index.node 是一个文件,  将 X/index.node 作为二进制插件载入并停止执行。&lt;br /&gt;
&lt;br /&gt;
LOAD_NODE_MODULES(X, START)&lt;br /&gt;
1. let DIRS=NODE_MODULES_PATHS(START)&lt;br /&gt;
2. for each DIR in DIRS:&lt;br /&gt;
   a. LOAD_AS_FILE(DIR/X)&lt;br /&gt;
   b. LOAD_AS_DIRECTORY(DIR/X)&lt;br /&gt;
&lt;br /&gt;
NODE_MODULES_PATHS(START)&lt;br /&gt;
1. let PARTS = path split(START)&lt;br /&gt;
2. let I = count of PARTS - 1&lt;br /&gt;
3. let DIRS = []&lt;br /&gt;
4. while I &amp;gt;= 0,&lt;br /&gt;
   a. if PARTS[I] = &amp;quot;node_modules&amp;quot; CONTINUE&lt;br /&gt;
   b. DIR = path join(PARTS[0 .. I] + &amp;quot;node_modules&amp;quot;)&lt;br /&gt;
   c. DIRS = DIRS + DIR&lt;br /&gt;
   d. let I = I - 1&lt;br /&gt;
5. return DIRS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>