Heim Web-Frontend js-Tutorial Erfahren Sie mehr über den Modulmechanismus von Node und sprechen Sie über den Modulimplementierungsprozess

Erfahren Sie mehr über den Modulmechanismus von Node und sprechen Sie über den Modulimplementierungsprozess

May 25, 2022 pm 09:12 PM
nodejs​ node.js node

Dieser Artikel führt Sie zum Verständnis der CommonJs-Spezifikation und des Modulmechanismus von Node und stellt den grundlegenden Prozess der Node-Implementierung der CommonJs-Spezifikation vor. Ich hoffe, dass er für alle hilfreich ist!

Erfahren Sie mehr über den Modulmechanismus von Node und sprechen Sie über den Modulimplementierungsprozess

Bevor die CommonJs-Spezifikation vorgeschlagen wurde, verfügte Javascript über kein Modulsystem, was bedeutete, dass es für uns schwierig war, umfangreiche Anwendungen zu entwickeln, da die Organisation des Codes schwieriger sein würde.

Was ist die CommonJS-Spezifikation? Zunächst einmal ist CommonJS keine Modulspezifikation, die definiert, wie Module referenziert und exportiert werden. Nodejs

implementiert diese Spezifikation hauptsächlich Es besteht aus drei Teilen: Modulreferenz, Moduldefinition und Modulidentifikation.


Modulreferenz

Modulreferenz bedeutet, dass wir andere Module über require einführen können.

const { add } = require('./add');
const result = add(1 ,2);
Nach dem Login kopieren

Moduldefinitionrequire引入其它的模块。

// add.js
exports.add = (a, b) => {
    return a + b;
}
Nach dem Login kopieren
Nach dem Login kopieren

模块定义

一个文件就是一个模块,模块里会提供两个变量,分别为module和exports。module为当前模块本身,exports为要导出的内容,同时exports为module的一个属性,即exports为module.exports。其他模块通过require导入的内容即为module.exports的内容。

// 缓存的模块示意:
const cachedModule = {
    '/Usr/file/src/add.js': 'add.js编译后的内容',
    'http': 'Node自带的http模块编译后的内容',
    'express': '非路径形式自定义文件模块express编译后的内容'
    // ...
}
Nach dem Login kopieren

模块标识

模块标识即为require里面的内容,比如require('./add'),则模块标识为./add

Eine Datei ist ein Modul, und das Modul stellt zwei Variablen bereit, nämlich Modul und Exporte. module ist das aktuelle Modul selbst, exports ist der zu exportierende Inhalt und exports ist ein Attribut des Moduls, d. h. exports ist module.exports. Der von anderen Modulen über require importierte Inhalt ist der Inhalt von module.exports.

/** 
* /Usr/file/index.js;
*/

const { add } = require('add');
const result = add(1, 2);
Nach dem Login kopieren
Modul-ID


Die Modul-ID ist der Inhalt in require. Beispiel: require('./add'), dann ist die Modul-ID ./add </code >. <br/></p>Der über CommonJS erstellte Mechanismus zum Importieren und Exportieren von Modulen ermöglicht es Benutzern, auf einfache Weise umfangreiche Anwendungen zu erstellen, ohne variable Verschmutzungen berücksichtigen zu müssen. <ul style="list-style-type: disc;"><li><p></p>Modulimplementierung von Node</li><li><p></p></li>Node implementiert die CommonJs-Spezifikation und fügt einige Funktionen hinzu, die Sie benötigen. Node führt hauptsächlich die folgenden drei Dinge aus, um die CommonJs-Spezifikation zu implementieren: <li><p></p></li></ul>Pfadanalyse<p><strong><span style="font-size: 18px;"></span>Dateipositionierung</strong></p><p></p>Kompilierung und Ausführung<p><img class="medium-zoom-image lazy" src="/static/imghw/default1.png" data-src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/eda1520ceae44071a364b95601db4fb5~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?" alt="Erfahren Sie mehr über den Modulmechanismus von Node und sprechen Sie über den Modulimplementierungsprozess" loading="lazy"/></p><p></p><p>Pfadanalyse</p><p></p><p> Beim Ausführen von require( ) Zu diesem Zeitpunkt ist der von require empfangene Parameter die Modulkennung, und der Knoten verwendet die Modulkennung, um eine Pfadanalyse durchzuführen. Der Zweck der Pfadanalyse besteht darin, anhand der Modulkennung den Pfad zu ermitteln, in dem sich dieses Modul befindet. Zunächst werden Knotenmodule in zwei Kategorien unterteilt, nämlich Kernmodule und Dateimodule. Das Kernmodul ist das Modul, das mit dem Knoten geliefert wird, und das Dateimodul ist das vom Benutzer geschriebene Modul. Gleichzeitig werden Dateimodule in Dateimodule in Form relativer Pfade, Dateimodule in Form absoluter Pfade und Dateimodule in Form von Nicht-Pfaden (z. B. Express) unterteilt. </p><p></p><p></p>Wenn der Knoten ein Dateimodul findet, wird das Modul kompiliert, ausgeführt und zwischengespeichert. Das allgemeine Prinzip besteht darin, den vollständigen Pfad des Moduls als Schlüssel und den kompilierten Inhalt als Wert zu verwenden und dann das Modul einzuführen Zum zweiten Mal ist keine Pfadanalyse, Dateispeicherung, Kompilierung und Ausführung dieser Schritte erforderlich. Der kompilierte Inhalt kann direkt aus dem Cache gelesen werden. <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>/** * /Usr/file/index.js; */ console.log(module.paths);</pre><div class="contentsignin">Nach dem Login kopieren</div></div></p>Wenn Sie das von require importierte Modul finden möchten, besteht die Reihenfolge beim Auffinden des Moduls darin, zunächst zu prüfen, ob sich das Modul bereits im Cache befindet. Wenn es sich nicht im Cache befindet, überprüfen Sie dann das Kernmodul und suchen Sie dann nach für das Dateimodul. Unter diesen sind Dateimodule in Form von Pfaden leichter zu finden. Der vollständige Dateipfad kann anhand des relativen oder absoluten Pfads ermittelt werden. Es ist relativ mühsam, benutzerdefinierte Dateimodule in Nicht-Pfad-Form zu finden. Node sucht im Ordner „node_modules“ nach der Datei. <p><strong>Wo ist das Verzeichnis node_modules? Die Datei, die wir gerade ausführen, ist /Usr/file/index.js;<span style="font-size: 18px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>[ &amp;#39;/Usr/file/node_modules&amp;#39;, &amp;#39;/Usr/node_modules&amp;#39;, &amp;#39;/node_modules&amp;#39;, ]</pre><div class="contentsignin">Nach dem Login kopieren</div></div></span>In diesem Modul haben wir ein Add-Modul eingeführt. Dieses Add ist weder ein Kernmodul noch ein Pfad . Dateimodul im Formular, wie man dieses Modul zu diesem Zeitpunkt findet. </strong></p>Module haben ein Pfadattribut, um das Add-Modul zu finden. Wir können dieses Attribut eingeben, um Folgendes anzuzeigen: <p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>const { add } = require(&amp;#39;./add&amp;#39;);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div></p>Wir können den Wert von Pfaden ausdrucken, indem wir node index.js im Dateiverzeichnis ausführen . Der Wert in Pfaden ist ein Array wie folgt: <p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// index.js const { add } = require(&amp;#39;./add&amp;#39;);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><strong>Das heißt, Node sucht nacheinander im obigen Verzeichnis, um zu sehen, ob es das Add-Modul enthält. Das Prinzip ähnelt der Prototypenkette. Beginnen Sie mit der Suche im Ordner „node_modules“ auf derselben Verzeichnisebene wie die aktuell ausgeführte Datei. Wenn das Verzeichnis „node_modules“ nicht gefunden wird oder nicht vorhanden ist, fahren Sie mit der Suche auf der höheren Ebene fort. </strong></p>🎜🎜Dateipositionierung🎜🎜🎜🎜Pfadanalyse und Dateipositionierung können zusammen verwendet werden, oder es kann sich um ein Verzeichnis oder ein Paket handeln, das durch die Pfadanalyse gefunden wird Bestimmte Dateien erfordern eine zusätzliche Verarbeitung. 🎜🎜🎜Dateierweiterungsanalyse🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>const { add } = require(&amp;#39;./add&amp;#39;);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>比如上面这段代码,文件标识符是不带扩展名的,这个时候node会依次查找是否存在.js、.json、.node文件。</p><p><strong>目录和包分析</strong></p><p>同样是上面这段代码,通过<code>./add查找到的可能不是一个文件,可能是一个目录或者包(通过判断add文件夹下是否有package.json文件来判断是目录还是包)。这个时候文件定位的步骤是这样的:

  • 查看是否有package.json文件
      • 读取package.json里的main字段的值作为文件
    • 没有
      • 寻找目录下的index作为文件(依次查找index.js、index.json、index.node)

如果package.json里没有main字段,那么也会将index作为文件,然后进行扩展名分析找到对应后缀的文件。

模块编译

我们开发中主要遇到的模块为json模块和js模块。

json模块编译

当我们require一个json模块的时候,实际上Node会帮我们使用fs.readFilcSync去读取对应的json文件,得到json字符串,然后调用JSON.parse解析得到json对象,再赋值给module.exports,然后给到require。

js模块编译

当我们require一个js模块的时候,比如

// index.js
const { add } = require(&#39;./add&#39;);
Nach dem Login kopieren
Nach dem Login kopieren
// add.js
exports.add = (a, b) => {
    return a + b;
}
Nach dem Login kopieren
Nach dem Login kopieren

这个时候发生了什么呢,为什么我们可以直接在模块里使用module、exports、require这些变量。这是因为Node在编译js模块的时候对模块的内容进行了首尾的包装。

比如add.js这个模块,实际编译的时候是会被包装成类似这样的结构:

(function(require, exports, module) {
  exports.add = (a, b) => {
    return a + b;
  }
  return module.exports;
})(require, module.exports, module)
Nach dem Login kopieren

即我们编写的js文件是会被包装成一个函数,我们编写的只是这个函数里的内容,Node后续的包装的过程对我们隐藏了。这个函数支持传入一些参数,其中就包括require、exports和module。

当编译完js文件后,就会执行这个文件,node会将对应的参数传给这个函数然后执行,并且返回module.exports值给到require函数。

以上就是Node实现CommonJs规范的基本流程。

更多node相关知识,请访问:nodejs 教程

Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über den Modulmechanismus von Node und sprechen Sie über den Modulimplementierungsprozess. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Mar 29, 2023 pm 06:02 PM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Speichers und Garbage Collectors (GC) der NodeJS V8-Engine. Ich hoffe, er wird Ihnen hilfreich sein!

Ein Artikel über Speichersteuerung in Node Ein Artikel über Speichersteuerung in Node Apr 26, 2023 pm 05:37 PM

Der nicht blockierende und ereignisgesteuerte Knotendienst hat den Vorteil eines geringen Speicherverbrauchs und eignet sich sehr gut für die Verarbeitung massiver Netzwerkanforderungen. Unter der Voraussetzung massiver Anfragen müssen Probleme im Zusammenhang mit der „Speicherkontrolle“ berücksichtigt werden. 1. Der Garbage-Collection-Mechanismus und die Speicherbeschränkungen von V8 Js wird von der Garbage-Collection-Maschine gesteuert

So verwenden Sie Express für den Datei-Upload im Knotenprojekt So verwenden Sie Express für den Datei-Upload im Knotenprojekt Mar 28, 2023 pm 07:28 PM

Wie gehe ich mit dem Datei-Upload um? Der folgende Artikel stellt Ihnen vor, wie Sie Express zum Hochladen von Dateien im Knotenprojekt verwenden. Ich hoffe, er ist hilfreich für Sie!

Lassen Sie uns ausführlich über das File-Modul in Node sprechen Lassen Sie uns ausführlich über das File-Modul in Node sprechen Apr 24, 2023 pm 05:49 PM

Das Dateimodul ist eine Kapselung der zugrunde liegenden Dateioperationen, wie z. B. Lesen/Schreiben/Öffnen/Schließen/Löschen von Dateien, Hinzufügen usw. Das größte Merkmal des Dateimoduls besteht darin, dass alle Methoden zwei Versionen von **synchronem** und **bereitstellen. asynchron**, mit Methoden mit dem Suffix sync sind alle Synchronisationsmethoden, und diejenigen ohne sind alle heterogene Methoden.

Eine ausführliche Analyse des Prozessmanagement-Tools „pm2' von Node Eine ausführliche Analyse des Prozessmanagement-Tools „pm2' von Node Apr 03, 2023 pm 06:02 PM

In diesem Artikel stellen wir Ihnen das Prozessmanagement-Tool „pm2“ von Node vor und sprechen darüber, warum PM2 benötigt wird und wie Sie PM2 installieren und verwenden. Ich hoffe, dass es für alle hilfreich ist!

PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? Mar 05, 2025 pm 05:57 PM

Detaillierte Erläuterungs- und Installationshandbuch für Pinetwork -Knoten In diesem Artikel wird das Pinetwork -Ökosystem im Detail vorgestellt - PI -Knoten, eine Schlüsselrolle im Pinetwork -Ökosystem und vollständige Schritte für die Installation und Konfiguration. Nach dem Start des Pinetwork -Blockchain -Testnetzes sind PI -Knoten zu einem wichtigen Bestandteil vieler Pioniere geworden, die aktiv an den Tests teilnehmen und sich auf die bevorstehende Hauptnetzwerkveröffentlichung vorbereiten. Wenn Sie Pinetwork noch nicht kennen, wenden Sie sich bitte an was Picoin ist? Was ist der Preis für die Auflistung? PI -Nutzung, Bergbau und Sicherheitsanalyse. Was ist Pinetwork? Das Pinetwork -Projekt begann 2019 und besitzt seine exklusive Kryptowährung PI -Münze. Das Projekt zielt darauf ab, eine zu erstellen, an der jeder teilnehmen kann

Lassen Sie uns über die Ereignisschleife in Node sprechen Lassen Sie uns über die Ereignisschleife in Node sprechen Apr 11, 2023 pm 07:08 PM

Die Ereignisschleife ist ein grundlegender Bestandteil von Node.js und ermöglicht die asynchrone Programmierung, indem sie sicherstellt, dass der Hauptthread nicht blockiert wird. Das Verständnis der Ereignisschleife ist für die Erstellung effizienter Anwendungen von entscheidender Bedeutung. Der folgende Artikel wird Ihnen ein detailliertes Verständnis der Ereignisschleife in Node vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!

Erfahren Sie mehr über Puffer in Node Erfahren Sie mehr über Puffer in Node Apr 25, 2023 pm 07:49 PM

Zu Beginn lief JS nur auf der Browserseite. Es war einfach, Unicode-codierte Zeichenfolgen zu verarbeiten, aber es war schwierig, binäre und nicht Unicode-codierte Zeichenfolgen zu verarbeiten. Und Binär ist das Datenformat der niedrigsten Ebene des Computer-, Video-/Audio-/Programm-/Netzwerkpakets

See all articles