Электрон: jQuery не определен
Проблема: при разработке с использованием Electron, когда вы пытаетесь использовать любой плагин JS, для которого требуется jQuery, плагин не находит 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
Или что-то в этом роде.
21 ответ
Лучшее и более общее решение 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) без необходимости указывать каждую
- Script Build / Pack Friendly (т.е. Grunt / Gulp все скрипты в vendor.js)
- Не требует
node-integration
быть ложным
источник здесь
Как видно на 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 перед загрузкой любого другого подключаемого модуля, который зависит от него.
Еще один способ написания <script>window.$ = window.jQuery = require('./path/to/jquery');</script>
является:
<script src="./path/to/jquery" onload="window.$ = window.jQuery = module.exports;"></script>
Электронный FAQ ответ:
http://electron.atom.io/docs/faq/
Я не могу использовать jQuery/RequireJS/Meteor/AngularJS в Electron.
Из-за интеграции 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>
Просто наткнулся на эту же проблему
npm install jquery --save
<script>window.$ = window.jQuery = require('jquery');</script>
работал на меня
Вы можете положить node-integration: false
внутренние параметры на BrowserWindow.
например: window = new BrowserWindow({'node-integration': false});
Хорошее и чистое решение
- Установите jQuery, используя npm. (
npm install jquery --save
) - Используй это:
<script> let $ = require("jquery") </script>
Я столкнулся с той же проблемой, и это сработало для меня!
Установите jQuery с помощью npm
npm i jquery
Затем включите jQuery одним из следующих способов.
Использование тега Script
<script>window.$ = window.jQuery = require('jquery');</script>
Используя Вавилон
import $ from "jquery";
Использование Webpack
var $ = require('jquery')
<script>
delete window.module;
</script>
до импорта JQuery, и вы готовы. больше информации здесь.
Я думаю, я понимаю вашу борьбу, я решил ее немного по-другому. Я использовал загрузчик скриптов для моего js-файла, который включает в себя jquery. Загрузчик скриптов берет ваш js-файл и прикрепляет его к вершине вашего файла vendor.js, он сделал для меня чудо.
https://www.npmjs.com/package/script-loader
после установки загрузчика скриптов добавьте это в свой загрузочный файл или файл приложения.
импортировать 'script!path/your-file.js';
Просто установите Jquery с помощью следующей команды.
npm install --save jquery
После этого поместите белую строку в файл js, который вы хотите использовать JQuery.
let $ = require('jquery')
Хорошо, вот еще один вариант, если вы хотите, чтобы относительное включение...
<script> window.$ = window.jQuery = require('./assets/scripts/jquery-3.2.1.min.js') </script>
Я строю и 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, если в браузере, в противном случае, если это приложение, созданное на основе электронов, для него потребуется модуль.
Если вы хотите импортировать jquery в index.html вместо импорта из angular.json, используйте следующее решение:
<script src="path/to/jquery"></script>
<script>
if ( typeof module === "object" && typeof module.exports === "object" ) {
window.$ = window.jQuery = require('jquery');
}
</script>
Если вы используете Angular2, вы можете создать новый файл js с этим кодом:
// jquery-electron.js
if ((!window.jQuery || !window.$) && (!!module && !!module.exports)) {
window.jQuery = window.$ = module.exports;
}
и поместите его сразу после пути jquery, в.angular-cli.json:
"scripts": [
"../node_modules/jquery/dist/jquery.js",
"assets/js/jquery-electron.js",
...
...
]
Это работает для меня.
<script languange="JavaScript">
if (typeof module === 'object') {window.module = module; module = undefined;}
</script>
Что нужно учитывать:
1) Поместите это в раздел прямо перед </head>
2) Включите Jquery.min.js или Jquery.js прямо перед </body>
тег
1. Установите jQuery, используя 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>
Работал для меня, используя следующий код
var $ = require('jquery')
Для решения этой проблемы используйте JQuery и другие js-файлы, которые вы используете на веб-странице. Однако у Electron есть интеграция узлов, поэтому он не найдет ваши js-объекты. Вы должны установитьmodule = undefined
пока ваши js-объекты не загрузятся должным образом. См. Ниже пример
<!-- 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
и прочее в электроне.
Ну в 2022 году. Это сработало для меня.
Установить JQuery
npm install jquery --save
Использоватьscript
тег, чтобы добавить jquery в вашindex.html
файл. src
должен быть путь к jquery в вашемnode_modules
папка
<script type="text/javascript" src="../node_modules/jquery/dist/jquery.min.js"></script>
Теперь JQuery будет доступен/определен как$
в вашем процессе визуализации (renderer.js
файл)
Вы можете попробовать следующий код:
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration:false,
}
});