2015-09-17 23 views
202

Problem: Bei der Entwicklung mit Electron, wenn Sie versuchen, ein JS-Plugin zu verwenden, das jQuery benötigt, findet das Plugin jQuery nicht, auch wenn Sie den richtigen Pfad mit Skript-Tags laden.Elektron: jQuery ist nicht definiert

+0

Versuchen Sie, die jQuery aus einem der Online-Repositories (Google, Amazon) zu laden und geben Sie den Code hier ein. Ohne den Code kann dir kaum jemand helfen. – YePhIcK

+0

Hey, ich habe diese Frage gepostet, damit ich sie selbst beantworten kann, aber sobald ich kann, füge ich etwas Code hinzu, um die Frage zu vervollständigen. –

Antwort

515

Eine bessere eine allgemeinere Lösung IMO:

<!-- Insert this line above script imports --> 
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script> 

<!-- normal script imports etc --> 
<script src="scripts/jquery.min.js"></script>  
<script src="scripts/vendor.js"></script>  

<!-- Insert this line after script imports --> 
<script>if (window.module) module = window.module;</script> 

Vorteile

  • funktioniert sowohl für Browser und Elektron mit dem gleichen Code
  • Fixes Probleme für alle 3rd-Party Bibliotheken (nicht nur jQuery), ohne dass jeder einzeln angegeben werden muss
  • Script Build/Pack Friendly (d. H. Grunt/Gulp alle Skripte in den Anbieter.js)
  • Benötigt KEINE node-integration zu

Quelle here

+0

eigentlich nicht Elektron Problem ist es, da eine Menge von Client-Seite Bibliotheken jetzt der neue Standard ist versuchen, sowohl require() als auch html load zu unterstützen, sowieso können Sie jquery auch in Ihrer App laden, indem Sie –

+2

window verwenden. $ = window.jQuery = window.jquery = require ("./ jquery.min"); –

+1

@fareednamrouti Ja, aber der Zweck dieser Lösung war, dass Sie die Bibliotheken von Drittanbietern nicht auflisten müssen (es funktioniert einfach!). Praktisch, wenn Sie viele Bibliotheken (oder selbst gebündelte Skripte) importieren –

94

Wie in https://github.com/atom/electron/issues/254 gesehen das Problem, weil dieser Code verursacht:

if (typeof module === "object" && typeof module.exports === "object") { 
    // set jQuery in `module` 
} else { 
    // set jQuery in `window` 
} 

Der jQuery-Code "sieht", dass sein Lauf in einer Commonjs Umgebung und ignoriert window.

Die Lösung ist einfach, statt Laden jQuery durch <script src="...">, sollten Sie wie folgt laden:

<script>window.$ = window.jQuery = require('./path/to/jquery');</script> 

Hinweis:der Punkt vor dem Pfad erforderlich ist, da es das anzeigt, Es ist das aktuelle Verzeichnis. Auch, erinnern Sie sich, jQuery vor dem Laden eines anderen Plugins zu laden, das davon abhängt.

+1

Danke, aber ich habe ein System von Yeoman mit eckigen erstellt. Grunt übernimmt alle meine Abhängigkeiten und baut sie in eine vendor.js-Datei auf. Wie kann ich jquery laden, mit Ihrer Leitung reparieren und mit den anderen bower-Abhängigkeiten fortfahren, die jquery benötigen? – bluesky777

+0

Ich verstehe nicht, die vendor.js jquery haben innen? Wenn ja, könnten Sie die Datei vendor.js mit diesem Fenster laden. $ Method, afaik. –

+0

Einige Kommentare später im verlinkten Problem gibt es eine noch bessere Lösung: "Knoten-Integration": false "als Option für" BrowserWindow ". – Boldewyn

15

Sie können node-integration: false innerhalb Optionen auf BrowserWindow setzen.

zB: window = new BrowserWindow({'node-integration': false});

+4

Dies ist eine gute Lösung für Benutzer, die keine Knotenintegration benötigen. –

+2

das funktioniert nicht mehr –

+0

Das ist super, funktioniert perfekt für mich. Danke @Murilo Feres. Irgendwelche Möglichkeiten, was Knoten-Integrationsoptionen tun? –

40

Ein anderer Weg <script>window.$ = window.jQuery = require('./path/to/jquery');</script> des Schreibens ist:

<script src="./path/to/jquery" onload="window.$ = window.jQuery = module.exports;"></script> 
4

Ich glaube, ich Ihren Kampf verstehe ich, löste es wenig differently.I Script Loader für meine js-Datei verwendet, die jquery einschließlich ist .Script loader nimmt Ihre js-Datei und fügt sie an die Spitze Ihrer vendor.js-Datei an.

https://www.npmjs.com/package/script-loader

nach der Installation das Skript loader diese in Ihre Boot oder Anwendungsdatei hinzuzufügen.

importieren Sie 'script! Path/your-file.js';

39

Elektron FAQ Antwort falsch sein:

http://electron.atom.io/docs/faq/

ich kann nicht jQuery/RequireJS/Meteor/AngularJS in Elektron.

Aufgrund der Node.js-Integration von Electron gibt es einige zusätzliche Symbole in das DOM-ähnliche Modul eingefügt, Exporte, erfordern. Diese verursacht Probleme für einige Bibliotheken, da sie die Symbole mit den gleichen Namen einfügen möchten.

Um dies zu lösen, können Sie Knoten Integration in Electron deaktivieren:

// Im Hauptprozess.

let win = new BrowserWindow({ 
webPreferences: { 
nodeIntegration: false } }); 

Aber wenn man die Fähigkeiten der Verwendung von Node.js und Electron APIs behalten möchten, müssen Sie die Symbole auf der Seite umbenennen, bevor anderen Bibliotheken einschließlich:

<head> 
<script> 
window.nodeRequire = require; 
delete window.require; 
delete window.exports; delete window.module; 
</script> 
<script type="text/javascript" src="jquery.js"></script> 
</head> 
+0

@ Fran6 Was kann ich tun, wenn ich eine externe Seite lade? :( – georgiosd

+0

Das funktionierte, aber nachdem ich das getan hatte, konnte meine Electron App nicht schließen - das heißt, ich konnte die Webseite nicht verlassen. – tale852150

18

Gerade ist das gleiche Problem aufgetreten

npm install jquery --save

<script>window.$ = window.jQuery = require('jquery');</script>

arbeitete für mich

+0

Genau das sagt meine ursprüngliche Antwort. –

+4

@BrunoVaz Sir, Sie fügen Jquery manuell hinzu, ich bin mit npm –

+0

Akzeptierte Antwort funktioniert, aber das ist viel besser. Vielen Dank Mann – bmavus

2

ok, hier ist eine weitere Option, wenn Sie eine relative wollen gehören ...

<script> window.$ = window.jQuery = require('./assets/scripts/jquery-3.2.1.min.js') </script> 
7

Eine schöne und saubere Lösung

  1. Installieren Sie jQuery mit npm. (npm install jquery --save)
  2. es verwenden: <script> let $ = require("jquery") </script>
2
<script> 
    delete window.module; 
</script> 

vor Ihrem jquery Import und Sie sind gut zu gehen. more info here.

Verwandte Themen