Подтвердить что ты не робот

Неиспользуемая ошибка: не удается найти модуль jquery '

Я использую Electron для создания настольного приложения. В моем приложении я загружаю внешний сайт (вне приложения Atom), скажем, http://mydummysite/index.html страницу.

Вот структура моего приложения в редакторе Atom:

enter image description here

то есть он имеет следующие части:

  1. main.js
  2. package.json
  3. 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 с электронным приложением с версией интеграции узлов.

4b9b3361

Ответ 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>

Ответ 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 в рендерере процесс - то есть ваше приложение может делать только то, что сделает веб-браузер.