suchen
HeimWeb-Frontendjs-TutorialModulare Programmierung basierend auf RequireJS und JQuery – umfassende Analyse häufiger Probleme_Javascript-Kenntnisse

Da die Codelogik von js immer schwerer wird, kann eine js-Datei Tausende von Zeilen enthalten, was für Entwicklung und Wartung sehr ungünstig ist. Kürzlich teile ich das logiklastige JS in Module auf. Als ich mich mit der Frage herumschlug, ob ich requirejs oder seajs verwenden sollte, habe ich schließlich requirejs vorgezogen. Schließlich sind offizielle Dokumente professioneller...

Selbst mit vollständiger offizieller Dokumentation stoßen wir jedoch immer noch auf viele Probleme, beispielsweise bei der Verwendung von jquery-ui.

Im Folgenden finden Sie eine Schritt-für-Schritt-Erklärung der aufgetretenen Probleme und der Lösungen.

Verständnis von AMD und CMD

Ein typisches Beispiel für AMD (asynchrone Moduldefinition) ist requirejs, während ein typisches Beispiel für CMD (gemeinsame Moduldefinition) Taobaos Seajs sind.

Was ihnen gemeinsam ist, ist, dass sie beide js asynchron laden. Der Unterschied besteht jedoch darin, dass require.js sofort nach dem Laden ausgeführt wird, während seajs erst ausgeführt wird, wenn es in die Hauptfunktion eintritt und ausgeführt werden muss.

Wenn Sie Seajs verwenden, ist die anfängliche Lade- und Ausführungseffizienz höher, aber js kann während der Verwendung abgerufen und ausgeführt werden, sodass Verzögerungen auftreten und die Benutzererfahrung beeinträchtigen können (ich habe es nicht ausprobiert. Wenn ich mich also irre, Seien Sie nicht überrascht). Und requirejs führt zu Beginn alle geladenen js aus. Wenn Ihr Modul zu diesem Zeitpunkt einige Ausführungsmethoden enthält, werden diese möglicherweise nicht in der gewünschten Reihenfolge ausgeführt.

Wenn Sie also an asynchrone Programmierung gewöhnt sind und eine vollständige Dokumentation wünschen, wird die Verwendung von requirejs empfohlen. Wenn Sie spezielle Anforderungen an die Ausführungsreihenfolge haben und die Entwicklung erleichtern möchten, können Sie auch Seajs verwenden.

So lösen Sie das Problem der zirkulären Abhängigkeit in requirejs

Wenn ein von Ihnen definiertes Modul a Modul b verwendet und Modul b Modul a verwendet, wird eine zirkuläre Abhängigkeitsausnahme ausgelöst.

Zum Beispiel habe ich hier ein Beispiel für eine zirkuläre Abhängigkeit geschrieben.

Hauptseite:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script data-main="test.js" src="lib/require.js"></script>
</body>
</html>

Hauptmethode:

requirejs.config({
  baseUrl: './'
});

requirejs(['js/a'],function (a){
  console.log("in test");
  a.testfromb();
});

Im a.js-Modul stellt die Methode test() die Methode zum Aufrufen von b bereit, und die Methode testfromb() ruft die Methode von b auf

define(function(require){
  var b = require("js/b");
  console.log("in a");
  return {
    atest:function(){
      console.log("test in a");
    },
    testfromb:function(){
      console.log("testfromb in a");
      b.btest();
    }
  }
});

In Modul b wird die Methode von a aufgerufen.

define(function(require){
  var a = require("js/a");
  console.log("in b");
  return {
    btest:function(){
      console.log("test in b");
      a.atest();
    }
  }
});

Dies entspricht dem Aufruf der Methode von b, die Methode von b hängt jedoch von der Methode von a ab, wodurch eine zirkuläre Abhängigkeit entsteht. Der Browser meldet einen Fehler:

Unabgefangener Fehler: Modulname „js/a“ wurde noch nicht für Kontext geladen: _

Laut offizieller Dokumentation handelt es sich hierbei um ein Designproblem, das so weit wie möglich vermieden werden sollte. Was sollten Sie also tun, wenn Sie es nicht vermeiden können? Modul b kann wie folgt geändert werden:

define(function(require){
  // var a = require("js/a");
  console.log("in b");
  return {
    btest:function(){
      console.log("test in b");
      require("js/a").atest();
    }
  }
});

Hier ist zu warten, bis die test()-Methode ausgeführt wird, bevor das Modul geladen wird. Zu diesem Zeitpunkt wurde offensichtlich Modul a geladen. Sie können die Ausgabeinformationen sehen:

in b
a.js:3 in a
test.js:6 in test
a.js:9 testfromb in a
b.js:6 test in b
a.js:6 test in a

Auf die gleiche Weise funktioniert es möglicherweise nicht, wenn Sie a ändern. Dies liegt daran, dass die Reihenfolge des Modulladens bei b beginnt.

Den Quellcode für zirkuläre Abhängigkeiten finden Sie auf der Cloud-Festplatte

So verwenden Sie JQuery in RequireJS

Wenn Sie jquery relativ einfach verwenden möchten, fügen Sie einfach die entsprechenden Abhängigkeiten direkt zu main.js hinzu:

requirejs.config({
  baseUrl: './',
  paths:{
    'jquery':'lib/jquery'
  }
});

requirejs(['jquery'],
function ($){
  $('#test').html('test');
});
如何在requirejs中使用jquery插件

对于jquery的插件,比较常见的做法都是传入一个jquery的对象,在这个jquery对象的基础上添加插件对应的方法。

首先需要添加jquery插件的依赖,这里用两个插件举例子——jquery-ui和jquery-datatables
requirejs.config({
  baseUrl: './',
  paths:{
    'jquery':'lib/jquery',
    'jquery-ui':'lib/jquery-ui',
    'jquery-dataTables':'lib/jquery.dataTables'
  },
  shim:{
    'jquery-ui':['jquery'],
    'jquery-dataTables':['jquery']
  }
});

requirejs(['jquery','jquery-ui','jquery-dataTables'],
function ($){
  ....
});
由于jquery插件都需要依赖于jquery,因此可以在shim中指定依赖关系。
除了上面这种使用方法,也可以使用commonJS风格的调用:

define(function(require){
  var $ = require('jquery');
  require('jquery-ui');
  require('jquery-dataTables');
  
    //下面都是测试,可以忽略
  var _test = $('#test');
  _test.selectmenu({
    width : 180,
    change : function(event, ui) {
      console.log('change');
    }
  });
  return {
    test:function(){
      //测试jquery-ui
      _test.append($('<option>test1</option><option>test1</option>'));
      _test.selectmenu("refresh");
      //测试jquery-datatables
      var _table = $('table');
      _table.dataTable();
    }
  }
});

Bei der Ausführung des obigen Codes wird jedoch eine Ausnahme gemeldet:

Unabgefangener TypeError: _table.dataTable ist keine Funktion

Dies liegt daran, dass dataTables kein Modul im Require-Stil ist. Wenn es also direkt auf diese Weise eingeführt wird, werden seine internen anonymen Funktionen nicht ausgeführt. Sie können seine anonyme Funktion ändern, indem Sie das $-Objekt in der letzten Zeile übergeben:

*/

  return $.fn.dataTable;
//}));原来是这样
}($)));//这里增加执行这个匿名函数,并且传入$对象。

}(window, document));

Dies ist auch eine Methode zur Suche im Internet, das Prinzip beruht jedoch auf mangelnder Erfahrung....

Sie können den Beispielcode auf der Cloud-Festplatte nachlesen. Da die importierten Ressourcen nicht vollständig sind, wird ein Fehler gemeldet und kann ignoriert werden. Denn die Ausführung des UI-Plug-Ins bedeutet, dass es erfolgreich war.

Probleme bei der Verwendung von jquery-ui mit requirejs

Da requirejs unmittelbar nach dem Laden der js-Datei ausgeführt wird, kann es dazu führen, dass die Ereignisse der Seite fehlschlagen, wenn Ihr JQuery-UI-Plug-in die DOM-Seite aktualisieren muss.

Nachdem Ihr Modul beispielsweise geladen wurde, ist ein Klickereignis an ein bestimmtes Element $('#test') auf der Seite gebunden. Wenn jedoch ein bestimmtes UI-Plug-In verwendet wird, rendert das Plug-In das DOM-Element erneut und das dem Test entsprechende Klickereignis wird ungültig.

Lösung:

•Verzögern Sie die Ereignisbindung, bis das DOM-Element gerendert ist, und lösen Sie dann die Bindung manuell aus •Ereigniserfassung kann auch anstelle der Ereignisbindung von DOM-Elementen verwendet werden (zu mühsam...nicht empfohlen).

Im DOM-rekonstruierten JS-Modul lautet der Code, der das Rendern ausführt, beispielsweise wie folgt:

require("xxx").initEvents(); Häufige Szenarien:

Zum Beispiel verwende ich das jquery-steps-UI-Plug-in auf der Seite, das die Seite neu rendert. Dies führte dazu, dass die Ereignisse, die ich ursprünglich gebunden hatte, ungültig wurden. Ich konnte die Bindung nur verschieben, bis die js-Seite wiederhergestellt war, und dann erneut binden.

Der obige Artikel - Modulare Programmierung basierend auf RequireJS und JQuery - Umfassende Analyse häufig gestellter Fragen - ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie Script Home unterstützen.

Stellungnahme
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
JavaScript und das Web: Kernfunktionalität und AnwendungsfälleJavaScript und das Web: Kernfunktionalität und AnwendungsfälleApr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Verständnis der JavaScript -Engine: ImplementierungsdetailsVerständnis der JavaScript -Engine: ImplementierungsdetailsApr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitPython vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitApr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Python gegen JavaScript: Community, Bibliotheken und RessourcenPython gegen JavaScript: Community, Bibliotheken und RessourcenApr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Von C/C nach JavaScript: Wie alles funktioniertVon C/C nach JavaScript: Wie alles funktioniertApr 14, 2025 am 12:05 AM

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

JavaScript -Engines: Implementierungen vergleichenJavaScript -Engines: Implementierungen vergleichenApr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

See all articles

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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools