【Video-Tutorial-Empfehlung:node js-Tutorial】
Die meisten Leute wissen, was die Funktion require() in Node.js macht, aber wie viele Leute wissen, wie sie funktioniert? Wir verwenden es täglich zum Laden von Bibliothekspaketen und Modulen, aber sein internes Verhalten ist rätselhaft.
Wir verfolgen den Kern des Node-Modulsystems: module.js. Diese Datei enthält eine überraschende magische Funktion. Sie ist für das Laden, Kompilieren und Zwischenspeichern jeder verwendeten Datei verantwortlich.
function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; // ...
Dieser Modultyp ist in module.js zu finden und spielt zwei Hauptrollen: Erstens bietet er eine Grundfunktionalität für alle Node.js-Module, um eine Instanz zu erstellen, sobald ihre Datei geladen wird, und bleibt sogar bestehen, wenn die Datei geladen wird run, Deshalb können wir module.exports einige Eigenschaften hinzufügen und sie bei Bedarf zurückgeben.
Die zweite Sache des Moduls besteht darin, den Lademechanismus des Node-Moduls zu verwalten. Die Standard-Require-Funktion ist eigentlich eine Abstraktion, die auf module.require basiert. Letztere ist nur ein einfacher Wrapper für Module._load jeder Datei. Schauen Sie sich den Code an, der ungefähr wie folgt lautet:
Module._load = function(request, parent, isMain) { // 1.在Module._cache中检查模块是否被缓存 // 2.如果缓存中为空,创建一个新的模块实例。 // 3. 保存到缓存 // 4. 使用指定的名称调用module.load() // 在读取了文件内容后将调用module.compile() // 5.如果加载和分析文件时有错误 // 从缓存中删除坏的模块 // 6. 返回 module.exports };
Module._load ist für das Laden neuer Module und die Verwaltung des Modul-Cache verantwortlich. Durch das Zwischenspeichern jedes Moduls kann die Häufigkeit des Lesens von Dateien verringert werden, wodurch die Leistung gemeinsam genutzter Modulinstanzen verbessert wird -Betrieb wie Singleton-Module. Speicherstatus anwenden.
Wenn ein Modul nicht im Cache vorhanden ist, liest Module._load die Datei und erstellt eine neue. Nach dem erfolgreichen Lesen des Dateiinhalts wird module._compile aufgerufen.
Wenn Sie den sechsten Schritt oben beachten, Sie werden sehen, dass die Rückgabe module.exports ist. Deshalb können Sie beim Definieren einer öffentlichen Schnittstelle exports und module.exports verwenden, da diese tatsächlich das sind, was Model._load und eine Rückgabe erfordern.
Werfen wir einen Blick auf module._compile:
Module.prototype._compile = function(content, filename) { // 1. 创建调用模块需要的require标准函数 // 2.将其他帮助方法加入require. // 3.包装JS代码到一个函数,这个函数提供我们的require // 模块, 比如变量本地化到模块的作用域 // 4.返回这个函数 };
Die Magie geschieht hier: Zuerst wird eine spezielle Standard-Require-Funktion erstellt. Dies ist die Funktion require(), mit der wir vertraut sind Es enthält auch einige Hilfseigenschaften und -methoden, die nur wenige Leute kennen, wie zum Beispiel:
require(): Laden eines externen Moduls
require.resolve(): Lösen Sie den Modulnamen basierend auf seinem absoluten Pfad auf
require.main: Hauptmodule
require.cache: Alle Cache-Module
require.extensions: Dateibasierte Erweiterungen für Kompilierungsmethoden verfügbar.
Sobald „require“ fertig ist, wird der gesamte Quellcode in eine neue Funktion verpackt, die das „require“-Modul und andere exponierte Variablen als Parameter übernimmt. Dadurch entsteht ein neuer Funktionsumfang des Moduls, sodass keine Verschmutzung entsteht Rest der Node.js-Umgebung.
(function (exports, require, module, __filename, __dirname) { // YOUR CODE INJECTED HERE! 你的代码在这里 });
Schließlich wird die Funktion, die das Modul umschließt, ausgeführt und die gesamte Module._compile-Methode wird synchron ausgeführt, sodass der ursprüngliche Aufruf der Module._load-Methode auf die Ausführung dieses Codes wartet, bevor er abgeschlossen wird und das Modul zurückgibt .exportiert an den Benutzer.
Jetzt wissen wir bereits, wie require('module') das von Ihnen definierte Modul über das Modulsystem lädt. Der Quellcode von module.js enthält weitere Codeprinzipien. Bei Interesse können Sie mehr darüber erfahren.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter:Programmierunterricht! !
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über das Funktionsprinzip von require() in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!