전자 : 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기능을 사용하지 않습니까?

답변:


760

더 좋고 일반적인 솔루션 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>

혜택

  • 동일한 코드로 브라우저와 전자 모두에서 작동
  • 각 라이브러리를 지정하지 않고도 모든 타사 라이브러리 (jQuery뿐만 아니라)의 문제를 해결합니다.
  • 스크립트 빌드 / 팩 친화적 (예 : Grunt / Gulp 모든 스크립트를 vendor.js로)
  • node-integration거짓 일 필요 는 없다

여기에 소스


1
@fareednamrouti 예, 그러나이 솔루션의 핵심은 타사 라이브러리를 나열 할 필요가 없다는 것입니다 (단지 작동합니다!). 많은 라이브러리 (또는 자체 번들 스크립트)를 가져올 때 편리합니다.
Dale Harders

2
감사! 필자의 경우이 솔루션은 d3 v3 이하와 같은 이전 버전의 d3에서도 작동합니다.
headwinds

2
@DaleHarders window.module와 같은 값으로 시작 module되므로 코드가 예상대로 작동하지 않습니다. 올바른 방법은 module대신 (사용하지 않은) 다른 창 속성 에 저장 하는 것 window.tempModule입니다. 내가 말한 것을 확인하려면 console.log(module)마지막 진술 후에 지금 확인하십시오 module === undefined.
Lucio Paiva

1
@Lucio Nope. 우리는 서드 파티 라이브러리가 기대하는 곳 (브라우저 환경)이므로 window.module에 저장해야합니다. Node.js와 브라우저 환경을 혼란스럽게 생각합니다. 이 트릭은 개발에 도움이되므로 코드를 추가 구성없이 브라우저 및 노드 / 전자에서 실행할 수 있습니다. 다른 많은 방법이 있지만 이것은 가장 간단한 IMHO입니다.
Dale Harders

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.

솔루션은 정말 쉽습니다 .를 통해 jQuery를로드하는 대신 <script src="...">다음과 같이로드해야합니다.

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

참고 : 경로 앞의 점 은 현재 디렉토리임을 나타내므로 필요합니다 . 또한 의존하는 다른 플러그인을로드하기 전에 jQuery를로드해야합니다 .


1
고마워요.하지만 yeoman이 만든 각도 시스템이 있습니다. 그런트는 모든 bower 의존성을 가져 와서 vendor.js 파일로 만듭니다. jquery를로드하고 라인을 수정하고 jquery가 필요한 다른 bower 종속성을 계속 사용하려면 어떻게해야합니까?
bluesky777

이해할 수 없습니다, vendor.js에 jquery가 있습니까? 그렇다면 vendor.js를이 window. $ 메소드와 함께로드 할 수 있습니다.
Bruno Vaz

링크 된 문제의 뒷부분에 나오는 일부 의견에는 더 나은 솔루션 'node-integration': falseBrowserWindow있습니다.
Boldewyn

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을 계속 사용할 수 있기 때문에 이것이 가장 좋은 대답이라고 생각했습니다! 그리고 아무것도 덮어 쓸 필요가 없습니다.
patotoma 2016 년

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

이것은 효과가 있었지만이 일을 한 후에 Electron 앱이 닫히지 않을 것입니다. 즉, 웹 페이지를 종료 할 수 없었습니다.
tale852150

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

이 답변 @BrunoVaz 청소기입니다 :)
moeiscool는

20

node-integration: falseBrowserWindow에 옵션을 넣을 수 있습니다 .

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


4
이는 노드 통합이 필요없는 사용자에게 적합한 솔루션입니다.
Adam Szmyd

이것은 굉장하고 완벽하게 작동합니다. @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>

바벨 사용

import $ from 'jquery';

웹팩 사용

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 App에서 내 솔루션은 다음과 같습니다.

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

이 문제의 경우 웹 페이지에서 사용하는 것과 동일한 JQuery 및 다른 j를 사용하십시오. 그러나 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>

주어진 것과 같이 가져 오면 JQuery전자에 있는 것과 다른 것을 사용할 수 있습니다 .


0

다음 명령으로 Jquery를 설치하십시오.

npm install --save jquery

그 후 Jquery를 사용하려는 js 파일에 belew line을 넣으십시오.

let $ = require('jquery')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.