Elektron: jQuery tidak didefinisikan


315

Masalah: saat mengembangkan menggunakan Electron, ketika Anda mencoba menggunakan plugin JS apa pun yang membutuhkan jQuery, plugin tidak menemukan jQuery, bahkan jika Anda memuat di jalur yang benar menggunakan tag skrip.

Sebagai contoh,

<body>
<p id="click-me">Click me!</p>
...
<script src="node_modules/jquery/dist/jquery.min.js"></script> //jQuery should be loaded now
<script>$("#click-me").click(() => {alert("Clicked")});</script>
</body>

Menjalankan kode di atas tidak akan berfungsi. Bahkan, buka DevTools, buka tampilan Konsol, dan klik pada <p>elemen. Anda harus melihat itu function $ is not definedatau sesuatu dengan efek itu.


Mengapa tidak menggunakan requirefungsi Elektron saja ?

Jawaban:


762

Solusi IMO yang lebih baik dan lebih umum:

<!-- 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>

Manfaat

  • Bekerja untuk peramban dan elektron dengan kode yang sama
  • Memperbaiki masalah untuk SEMUA perpustakaan pihak ketiga (bukan hanya jQuery) tanpa harus menentukan masing-masing
  • Script Build / Pack Friendly (yaitu Grunt / Gulp semua skrip ke vendor.js)
  • TIDAK perlu node-integrationpalsu

sumber di sini


1
@fareednamrouti Ya, tetapi inti dari solusi ini adalah Anda tidak perlu mendaftar pustaka pihak ke-3 (hanya berfungsi!). Berguna ketika Anda mengimpor banyak perpustakaan (atau skrip bundel sendiri)
Dale Harders

2
Terima kasih! dalam kasus saya, solusi ini juga berfungsi untuk versi yang lebih lama dari d3 seperti d3 v3 atau lebih rendah
headwinds

2
@DaleHarders Ternyata window.moduledimulai dengan nilai yang sama dengan module, jadi kode Anda tidak berfungsi seperti yang diharapkan. Cara yang tepat untuk melakukannya adalah dengan menyimpan moduleke beberapa properti jendela (yang tidak digunakan) lainnya, seperti window.tempModule. Untuk mengkonfirmasi apa yang saya katakan, coba console.log(module)setelah pernyataan terakhir Anda untuk memverifikasi itu sekarang module === undefined.
Lucio Paiva

1
@Lucio Nggak. Kita perlu menyimpan ke window.module karena ini adalah tempat perpustakaan pihak ke-3 mengharapkannya (lingkungan browser). Saya pikir Anda membingungkan Node.js dan lingkungan browser. Trik ini adalah untuk membantu pengembangan sehingga kode Anda dapat berjalan di browser DAN node / elektron tanpa konfigurasi tambahan. Ada banyak cara lain untuk melakukannya tetapi ini adalah IMHO paling sederhana.
Dale Harders

1
Ini bermasalah dengan CSP — tidak ada skrip sebaris
Trevor

121

Seperti yang terlihat di https://github.com/atom/electron/issues/254 masalahnya disebabkan karena kode ini:

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

Kode jQuery "melihat" bahwa itu berjalan di lingkungan CommonJS dan mengabaikan window.

Solusinya sangat mudah , alih-alih memuat jQuery <script src="...">, Anda harus memuat seperti ini:

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

Catatan: titik sebelum jalur diperlukan , karena ini menunjukkan bahwa itu adalah direktori saat ini. Juga, ingatlah untuk memuat jQuery sebelum memuat plugin lain yang bergantung padanya .


1
Terima kasih, tetapi saya memiliki sistem yang dibuat oleh yeoman dengan sudut. Grunt mengambil semua dependensi bower saya dan membuatnya menjadi file vendor.js. Bagaimana saya bisa memuat jquery, memperbaiki dengan baris Anda, dan melanjutkan dengan dependensi bower lain yang membutuhkan jquery?
bluesky777

Saya tidak mengerti, vendor. Saya punya jquery di dalam? Jika demikian, Anda dapat memuat vendor.js dengan jendela ini. $ Method, afaik.
Bruno Vaz

Beberapa komentar kemudian dalam masalah terkait ada solusi yang lebih baik: 'node-integration': falsesebagai opsi untuk BrowserWindow.
Boldewyn

6
Bukankah ini memengaruhi hal-hal lain?
Bruno Vaz

53

Cara penulisan lainnya <script>window.$ = window.jQuery = require('./path/to/jquery');</script>adalah:

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

Saya menemukan ini sebagai jawaban terbaik karena saya masih bisa menggunakan CDN dengan itu! Dan tidak perlu menimpa apa pun.
patotoma

53

jawaban FAQ elektron:

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

Saya tidak bisa menggunakan jQuery / RequireJS / Meteor / AngularJS di Electron.

Karena integrasi Node.js dari Electron, ada beberapa simbol tambahan yang dimasukkan ke dalam modul DOM seperti, ekspor, memerlukan. Ini menyebabkan masalah untuk beberapa perpustakaan karena mereka ingin menyisipkan simbol dengan nama yang sama.

Untuk mengatasi ini, Anda dapat mematikan integrasi simpul di Elektron:

// Dalam proses utama.

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

Tetapi jika Anda ingin mempertahankan kemampuan menggunakan Node.js dan Electron APIs, Anda harus mengganti nama simbol di halaman sebelum menyertakan pustaka lain:

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

@ Fran6 apa yang bisa saya lakukan jika saya memuat halaman eksternal? :(
georgiosd

Ini berhasil tetapi setelah melakukan ini aplikasi Elektron saya tidak mau menutup - yaitu, saya tidak bisa keluar dari halaman web.
tale852150

34

Baru saja menemukan masalah yang sama

npm install jquery --save

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

bekerja untukku


Inilah yang dikatakan oleh jawaban asli saya.
Bruno Vaz

Hai caranya melakukan hal yang sama dengan materialize.min.js cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/js/… . .. sesuatu seperti ini <script> window.Materialize = window.Materialize = membutuhkan ('Materialize'); </script> ??? dapatkah seseorang membantu
Makjb lh

@ BrunoVaz jawaban ini lebih bersih :)
moeiscool

20

Anda dapat memasukkan node-integration: falseopsi ke dalam di BrowserWindow.

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


4
Ini adalah solusi yang baik untuk pengguna yang tidak memerlukan integrasi node.
Adam Szmyd

Ini luar biasa, sangat cocok untuk saya. Terima kasih @Murilo Feres. Adakah yang dilakukan opsi-opsi simpul-integrasi?
Ahesanali Suthar

3
tidak berfungsi @ 1.4, silakan gunakan: let win = new BrowserWindow ({webPreferences: {nodeIntegration: false}})
holly

14

Solusi yang bagus dan bersih

  1. Instal jQuery menggunakan npm. ( npm install jquery --save)
  2. Gunakan: <script> let $ = require("jquery") </script>

8

Saya menghadapi masalah yang sama dan ini berhasil untuk saya!

Instal jQuery menggunakan npm

$ npm install jquery

Kemudian sertakan jQuery dalam salah satu cara berikut.

Menggunakan tag skrip

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

Menggunakan Babel

import $ from 'jquery';

Menggunakan Webpack

const $ = require('jquery');


5

Saya pikir saya mengerti perjuangan Anda saya menyelesaikannya sedikit berbeda. Saya menggunakan skrip loader untuk file js saya yang termasuk jquery.Script loader mengambil file js Anda dan melampirkannya ke atas file vendor.js Anda itu melakukan keajaiban bagi saya.

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

setelah menginstal skrip, tambahkan ini ke boot atau file aplikasi Anda.

impor 'script! path / your-file.js';


4

ok, inilah pilihan lain, jika Anda ingin kerabat menyertakan ...

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

3

Jika Anda menggunakan Angular2 Anda dapat membuat file js baru dengan kode ini:

// jquery-electron.js

if ((!window.jQuery || !window.$) && (!!module && !!module.exports)) {
      window.jQuery = window.$ = module.exports;
}

dan letakkan di sebelah kanan setelah jquery path, di .angular-cli.json:

"scripts": [
    "../node_modules/jquery/dist/jquery.js",
    "assets/js/jquery-electron.js",
    ...
    ...
]

3

im bangunan dan Aplikasi Angular dengan elektron, solusi saya adalah sebagai berikut:

index.html

<script>
    if ( typeof module === "object" && typeof module.exports === "object" ) {
      window.$ = window.jQuery = require('jquery');
    }
</script>

angular.json

"scripts": [
              "node_modules/jquery/dist/jquery.min.js",
              "node_modules/popper.js/dist/umd/popper.min.js",
              "node_modules/bootstrap/dist/js/bootstrap.min.js"
            ]

Jadi Jquery akan diambil dari angular.json jika di browser, selain itu jika itu adalah aplikasi yang dibangun dengan elektron, ia akan memerlukan modul sebagai gantinya.

Jika Anda ingin mengimpor jquery di index.html alih-alih mengimpor dari angular.json gunakan solusi berikut:

<script src="path/to/jquery"></script>
<script>
    if ( typeof module === "object" && typeof module.exports === "object" ) {
      window.$ = window.jQuery = require('jquery');
    }
</script>


2

1. Instal jQuery menggunakan npm.

npm install jquery --save

2.

<!--firstly try to load jquery as browser-->
<script src="./jquery-3.3.1.min.js"></script>
<!--if first not work. load using require()-->
<script>
  if (typeof jQuery == "undefined"){window.$ = window.jQuery = require('jquery');}
</script>

2

Ini bekerja untuk saya.

<script languange="JavaScript">
     if (typeof module === 'object') {window.module = module; module = undefined;}
</script>

Hal yang perlu dipertimbangkan:

1) Letakkan ini di bagian sebelum </head>

2) Sertakan Jquery.min.js atau Jquery.js tepat sebelum </body>tag


0

Anda dapat mencoba kode berikut:

mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration:false,
        }
});

0

Untuk masalah ini, Gunakan JQuery dan js lainnya yang sama seperti yang Anda gunakan di Halaman Web. Namun, Elektron memiliki integrasi simpul sehingga tidak akan menemukan objek js Anda. Anda harus mengatur module = undefinedsampai objek js Anda dimuat dengan benar. Lihat contoh di bawah ini

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

<!-- normal script imports etc  -->
<script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>    

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

Setelah mengimpor seperti yang diberikan, Anda akan dapat menggunakan JQuerydan hal-hal lain dalam elektron.


0

Cukup instal Jquery dengan perintah berikut.

npm install --save jquery

Setelah itu Silakan masukkan baris belew di file js yang ingin Anda gunakan Jquery

let $ = require('jquery')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.