Неиспользуемая ошибка: не удается найти модуль jquery '
Я использую Electron для создания настольного приложения. В моем приложении я загружаю внешний сайт (вне приложения Atom), скажем, http://mydummysite/index.html страницу.
Вот структура моего приложения в редакторе Atom:
![enter image description here]()
то есть он имеет следующие части:
main.js
package.json
nodemodules>jquery
(для загрузки jquery)
Исходный код:
main.js:
'use strict';
var app = require('app');
app.on('ready', function() {
var BrowserWindow = require('browser-window');
var win =
new BrowserWindow({ width: 800, height: 600, show: false,
'node-integration':true });
win.on('closed', function() {
win = null;
});
win.loadUrl('http://mydummysite/index.html ');
win.show();
});
package.json:
{
"name": "my-mac-app",
"version": "5.2.0",
"description": "My Mac Desktop App",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"author": "Me",
"license": "ISC",
"dependencies": {
"jquery": "^2.1.4"
}
}
Внешняя страница - http://mydummysite/index.html код страницы:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World!</h1>
</body>
<script>
var jqr=require('jquery');
</script>
</html>
Когда я запускаю указанное выше приложение (перетаскивая папку приложения в Electron), внешняя страница (http://mydummysite/index.html) загружается в оболочку Electron.
но с ошибкой
Uncaught Error: не удается найти модуль 'jquery'
![enter image description here]()
Можете ли вы помочь мне найти причину этой проблемы?
Как вы можете видеть на моем скриншоте структуры каталогов, я уже установил модуль jquery в свою папку и сделал это с помощью команды npm install jquery
.
Примечание. Чтобы поиграть с командой require
в JS, я попытался добавить require("ipc")
на страницу http://mydummysite/index.html внешней страницы, и она работала, в чем может быть причина с require("jquery")
.
Правильно ли я добавил внешний модуль (jquery) в Electron?
Мне не хватает какой-то зависимости в package.json
?
Что я уже пробовал:
npm cache clean
, npm install jquery
(в папку моего приложения)
npm install --save jquery
npm install jquery -g
npm rebuild
sudo npm install jquery -g
sudo npm install jquery
export NODE_PATH=/usr/local/lib/node_modules
Вот скриншот места, из которого выдается ошибка в module.js
![enter image description here]()
Может кто-нибудь подсказать, почему require("ipc")
работает, а require("jquery")
нет?
Моя цель - использовать jQuery с электронным приложением с версией интеграции узлов.
Ответы
Ответ 1
ТЛ; др
В отличие от обычного приложения nodejs, где у вас есть доступ к глобальным модулям (например, расположенным в /usr/bin/node
), электрон не устанавливает автоматически переменные среды NODE_PATH
. Вы должны установить его вручную на все пути, содержащие нужные вам модули.
Обновление:
Ответ на вопрос
why require("ipc")
is working и require("jquery")
not?
можно найти в этом выпуске о том, что системные/пользовательские модули не должны быть включены в глобальный путь модуля
поскольку они могут содержать модули, не поставляемые с приложением и, возможно, скомпилированные с неправильными заголовками v8.
И если вы посмотрите на источник электронов, то увидите, что внутренние модули добавлены в module.globalPaths
:
# Add common/api/lib to module search paths.
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
именно поэтому у вас есть доступ к ipc
, app
и т.д., но не к модулям, которые вы установили глобально с помощью npm install -g
.
Я только что попробовал это с последней версией electron-prebuilt
с локальным сервером, обслуживающим точно тот же HTML файл, который вы предоставили, и я думаю, что знаю, в чем проблема: если вы не добавите путь каталог вашего приложения node_modules
в корневом каталоге вашего приложения с переменной NODE_PATH
не будет работать. Так что вам нужно сделать что-то вроде этого:
export NODE_PATH=/PATH/TO/APP/node_modules
electron /PATH/TO/APP
При экспорте NODE_PATH
убедитесь, что вы указали абсолютный путь.
Обновление 2:
Ответ на комментарий:
Я получаю jQuery не найденные ошибки
Должен быть найден в этом билете. В основном, если вы используете пакет jQuery npm или делаете что-то вроде следующего в ваших HTML файлах внутри Electron:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
То, что вы получаете, это фабрика, а не фактический объект jQuery, присоединенный к глобальному контексту (например, window
). Как я уже упоминал в предыдущем ответе (содержащем также исходный код jQuery)
Когда вам требуется jQuery внутри CommonJS или аналогичной среды, которая предоставляет module
и module.exports
, вы получаете фабрику, а не реальный объект jQuery.
Теперь, чтобы использовать эту фабрику (либо импортировав код из CDN, либо если у вас локально доступен модуль npm), вам понадобится что-то вроде следующего:
<script>
window.jQuery = window.$ = require('jquery');
</script>
Я написал статью, которая объясняет комбинацию Node + jQuery.
Ответ 2
Установить jquery с npm недостаточно:
npm install --save jquery
Он восстанавливает исходные файлы jQuery в вашем проекте. Но вы должны включить script в свой html файл:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Hello World!</h1>
</body>
<!-- Try to load from cdn to exclude path issues. -->
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
window.jQuery = window.$ = jQuery;
$(document).ready(function() {
console.log( "jQuery is loaded" );
});
</script>
</html>
Ответ 3
У меня такая же проблема при использовании jQuery с электроном, и выясните решение для этого случая:
<script type="text/javascript" src="js/jquery.min.js"
onload="window.$ = window.jQuery = module.exports;" ></script>
Источник: https://discuss.atom.io/t/electron-app-to-host-external-site/16390/9
Ответ 4
# assuming you have installed jquery locally instead of globally like in as
npm install jquery -s # without -g flag
вместо требуется ( "jquery" ), укажите относительный путь из исходного каталога
требует (". /node_modules/jquery/dist/jquery.min.js" );
Попробуйте следующее:
<script>window.$ = window.jQuery = require('./node_modules/jquery/dist/jquery.min.js');</script>
ИЛИ
<script>var $ = jQuery = require('./node_modules/jquery/dist/jquery.min.js');</script>
Ответ 5
Надеюсь, что ниже ссылка немного осветит ваше сомнение в отношении
зачем require ( "ipc" ) работает и требует ( "jquery" ) не?
https://github.com/atom/electron/issues/254
https://discuss.atom.io/t/electron-app-to-host-external-site/16390/7
Ответ 6
То же самое случилось со мной, простое решение - добавить это в ваш файл index.js:
app.on('ready', function() {
var mainWindow = new BrowserWindow({
"node-integration": false
})
//rest of your initialization code here.
})
проблема вызвана node, для получения дополнительной информации обратитесь к этому сообщению
Настройка node -интеграция на false отключит node.js в рендерере процесс - то есть ваше приложение может делать только то, что сделает веб-браузер.