Electron:jQueryが定義されていません


315

問題:Electronを使用して開発しているときに、jQueryを必要とするJSプラグインを使用しようとすると、スクリプトタグを使用して正しいパスにロードしても、プラグインがjQueryを見つけられません。

例えば、

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

上記のこのコードを実行しても機能しません。実際、DevToolsを開き、コンソールビューに移動して、<p>要素をクリックします。あなたはそれfunction $ is not definedかその効果に何かを見るべきです。


エレクトロンrequire機能を使用しないのはなぜですか?

回答:


762

より優れた、より一般的なソリューション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>

利点

  • 同じコードでブラウザとElectronの両方で動作します
  • それぞれを指定せずに、(jQueryだけでなく)すべてのサードパーティライブラリの問題を修正します。
  • スクリプトのビルド/パックに対応(つまり、すべてのスクリプトをGrunt / Gulpでvendor.jsに組み込みます)
  • node-integration偽である必要はありません

ここにソース


1
@fareednamroutiはい。ただし、このソリューションのポイントは、サードパーティのライブラリをリストする必要がないことです(それは機能します!)。多くのライブラリ(または自己バンドルスクリプト)をインポートする場合に便利です
Dale Harders

2
ありがとう!私の場合、このソリューションはd3 v3以下などの古いバージョンのd3でも機能します
向かい風

2
@DaleHardersはとwindow.module同じ値で始まるmoduleため、コードは期待どおりに機能しません。これを行う適切な方法は、module代わりに、他の(未使用の)ウィンドウプロパティに保存することですwindow.tempModule。私の言っていることを確認するには、console.log(module)最後のステートメントの後で試してみてくださいmodule === undefined
Lucio Paiva 2016年

1
@Lucio Nope。window.moduleに保存する必要があります。これは、サードパーティのライブラリが期待する場所(ブラウザー環境)だからです。Node.jsとブラウザ環境が混乱していると思います。このトリックは、コードをブラウザーとノード/電子で追加の構成なしに実行できるように、開発を支援するためのものです。これを行う方法は他にもたくさんありますが、これは最も簡単な方法です。
デールハーダーズ2016

1
これはCSPに問題があります
Trevor

121

https://github.com/atom/electron/issues/254に見られるように、このコードが原因で問題が発生します。

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

jQueryコードは、CommonJS環境で実行されていることを「認識」し、無視しwindowます。

解決策は本当に簡単<script src="...">です。jQueryをでロードする代わりに、次のようにロードする必要があります。

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

注: パスの前のドットは、現在のディレクトリであることを示しているため必須です。また、それに依存する他のプラグインをロードする前にjQueryをロードすることを忘れないでください


1
おかげで、私は角度を持ったヨーマンによって作成されたシステムを持っています。Gruntは私のすべての依存関係を取得し、vendor.jsファイルにビルドします。jqueryをロードし、自分の行で修正して、jqueryを必要とする他のbower依存関係を続行するにはどうすればよいですか?
bluesky777 2015年

わかりません。vendor.jsにはjqueryが含まれていますか?その場合は、このwindow。$メソッドを使用してvendor.jsをロードできます。
Bruno Vaz 2015年

リンクされた問題の後半のコメントには、さらに良い解決策'node-integration': falseがあります:のオプションとしてBrowserWindow
Boldewyn、2015

6
これは他のことに影響しませんか?
Bruno Vaz

53

別の書き方<script>window.$ = window.jQuery = require('./path/to/jquery');</script>は:

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

CDNを引き続き使用できるので、これが最良の回答であるとわかりました。そして、何も上書きする必要はありません。
パトトマ

53

電子FAQの回答:

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

ElectronでjQuery / RequireJS / Meteor / AngularJSを使用できません。

ElectronのNode.js統合により、モジュール、エクスポート、要求などのDOMに挿入された追加のシンボルがいくつかあります。一部のライブラリは同じ名前のシンボルを挿入したいため、これにより問題が発生します。

これを解決するには、Electronでノード統合をオフにします。

//メインプロセス。

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

ただし、Node.jsおよびElectron APIを使用する機能を維持したい場合は、他のライブラリを含める前に、ページ内のシンボルの名前を変更する必要があります。

<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外部ページを読み込んでいる場合はどうすればよいですか?:(
georgiosd 2016

これは機能しましたが、これを行った後、Electronアプリが閉じませんでした。つまり、Webページを終了できませんでした。
tale852150 2017

34

ちょうどこの同じ問題に遭遇しました

npm install jquery --save

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

私のために働いた


これはまさに私の元の答えが言うことです。
Bruno Vaz

こんにちはmaterialize.min.jsと同じことを行う方法をcdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/js/...。..このような<script> window.Materialize = window.Materialize = require( 'Materialize'); </ script> ??? 誰かがお手伝いできますか
Makjb lh 2017

@BrunoVazこの回答はより簡潔です:)
moeiscool

20

node-integration: falseBrowserWindowの内部オプションを配置できます。

例えば: window = new BrowserWindow({'node-integration': false});


4
これは、ノード統合を必要としないユーザーに適したソリューションです。
Adam Szmyd 2016

これは素晴らしく、私にとっては完璧に機能します。@Murilo Feresに感謝します。ノード統合オプションの機能は何ですか?
Ahesanali Suthar

3
@ 1.4では機能しません。使用してください:let win = new BrowserWindow({webPreferences:{nodeIntegration:false}})
holly

14

素敵でクリーンなソリューション

  1. npmを使用してjQueryをインストールします。(npm install jquery --save
  2. これを使って: <script> let $ = require("jquery") </script>

8

私は同じ問題に直面し、これは私のために働いた!

npmを使用してjQueryをインストールする

$ npm install jquery

次に、次のいずれかの方法でjQueryを含めます。

スクリプトタグの使用

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

Babelの使用

import $ from 'jquery';

Webpackの使用

const $ = require('jquery');


5

私はあなたの苦労を少し違った方法で解決したと思います.jqueryを含む私のjsファイルにスクリプトローダーを使用しました。スクリプトローダーはjsファイルを取得し、それをvendor.jsファイルの上部に添付することで、私にとって魔法をかけました。

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

スクリプトローダーをインストールした後、これをブートファイルまたはアプリケーションファイルに追加します。

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


4

さて、相対インクルードが必要な場合は、ここに別のオプションがあります...

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

3

Angular2を使用している場合は、次のコードで新しいjsファイルを作成できます。

// jquery-electron.js

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

.angular-cli.jsonのjqueryパスの直後に配置します。

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

3

imビルドと電子を使ったAngularアプリの場合、私の解決策は次のとおりです。

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"
            ]

したがって、jqueryは、ブラウザー上にある場合はangular.jsonから読み込まれ、それ以外の場合は電子ビルドアプリの場合はモジュールが必要になります。

angular.jsonからインポートするのではなく、index.htmlにjqueryをインポートする場合は、次のソリューションを使用します。

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


2

1. npmを使用してjQueryをインストールします。

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

これは私にとってはうまくいきます。

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

考慮すべきこと:

1)これをセクションの直前に置きます </head>

2)</body>タグの直前にJquery.min.jsまたはJquery.jsを含めます


0

次のコードを試してみてください:

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

0

この問題については、Webページで使用しているのと同じJQueryおよびその他のjsを使用します。ただし、Electronにはノード統合があるため、jsオブジェクトは見つかりません。module = undefinedjsオブジェクトが正しくロードされるまで設定する必要があります。以下の例を参照

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

与えられたようにインポートした後、あなたはJQueryelectronで他のものを使用できるようになります。


0

次のコマンドでJqueryをインストールしてください。

npm install --save jquery

その後、jqueryを使用したいjsファイルにbelew行を入れてください

let $ = require('jquery')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.