2015-08-28 4 views
46

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

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

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> 

Когда я бегу выше приложения (перетащив папку приложения в El ectron) внешняя страница (http://mydummysite/index.html) нагрузки в электронной оболочке , но с ошибкой «неперехваченным Ошибка: Не удается найти модуль„JQuery“»

enter image description here

Можете ли вы помочь мне найти причину этой проблемы?

Как вы можете видеть на моем скриншоте структуры каталогов, у меня есть alread установленный модуль jquery для моей папки, и я сделал это с помощью команды «npm install jquery».

Примечание: Чтобы играть с командой «require» в JS, я попытался добавить «require (« ipc ») на моей странице с внешней страницы http://mydummysite/index.html, и она работает так, что может быть причиной с требованием (« jquery »).

Я правильно ли добавил внешний модуль (jquery) в Electron?

Я пропустил некоторую зависимость в пакете.json?

То, что я уже пробовал: кэш

  • НПМ чистый, НПМ установить JQuery (к моей папке приложения)
  • НПМ установки --save Jquery
  • НПМ установить JQuery -g
  • npm rebuild
  • sudo npm install jquery -g
  • sudo npm install jquery
  • экспорт NODE_PATH =/USR/местные/Библиотека/node_modules

Вот скриншот места, откуда выбрасывается ошибка в module.js

enter image description here

Может кто-то предложить, почему require («ipc») работает и требует («jquery») нет?

Моя цель - использовать jQuery с электронным приложением с интеграцией узлов true.

+0

https://github.com/UncoolAJ86/node-jquery/issues/35 не уверен, является ли эта ссылка будет решить, но это поможет вам начать. – Akki619

+0

Возможный дубликат [Как использовать узел \ _modules внутри электрона (ранее атом-оболочка)] (http://stackoverflow.com/questions/30664111/how-to-use-node-modules-within-electron-formerly-atom -shell) –

+0

Yan. Тот, который вы упомянули, касается случая, когда мы используем страницу внутри приложения оболочки атома. Я загружаю страницу с внешнего URL-адреса. – Raghav

ответ

7

Установить JQuery с НПМ не хватает:

npm install --save jquery 

восстанавливает исходные файлы JQuery в проекте. Но вы должны включить скрипт в 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> 
+0

Путь "node_modules/jquery/dist/jquery.min.js" приведет к "http: //mydummysite/node_modules/jquery/dist/jquery.min.js", который даст 404. У меня есть модуль jquery, установленный в моем Электронное приложение вместо удаленного приложения (http: // mydummysite /) – Raghav

+0

Да, но если вы хотите использовать jquery на своем фиктивном сайте, вам нужно загрузить jquery на свой фиктивный сайт. Для тестирования вы можете включить скрипт из jquery CDN, например, проблему без пути: Damien

+0

Если я использую скрипт тег, тогда пространство имен jQuery не отображается. Кажется, проблема связана с модулями с интеграцией узлов. – Raghav

2

Я надеюсь, что ниже ссылку поставит некоторый свет на вашем сомнении для

why require("ipc") is working and require("jquery") not?

https://github.com/atom/electron/issues/254

https://discuss.atom.io/t/electron-app-to-host-external-site/16390/7

+0

Мне нужно взаимодействие с узлами. Вторая ссылка говорит, чтобы отключить ее. – Raghav

35

Т.Л. ; dr

В отличие от обычного приложения nodejs, где у вас есть доступ к глобальным модулям (например, расположенный в /usr/bin/node), электрон автоматически не устанавливает переменные среды NODE_PATH. Вы должны установить его вручную для всех путей, содержащих нужные модули.


Update:

Ответ на вопрос

why require("ipc") is working and require("jquery") not?

можно найти в этом issue, заявив, что модули системы/пользователя не должен быть включен в глобальном пути модуль

since they could contain modules not shipped with the app and possibly compiled with the wrong v8 headers.

И если вы посмотрите на electron's source вы можете увидеть, что внутренние модули добавляются к 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-файл, который вы предоставили, и я думаю, что я знаю, в чем проблема: Если вы не добавить путь к вашему app node_modules под вашим корнем приложения к переменной NODE_PATH, это не сработает. Так что вам нужно сделать что-то вроде этого:

export NODE_PATH=/PATH/TO/APP/node_modules 
electron /PATH/TO/APP 

NODE_PATH При экспорте убедитесь, что вы обеспечить абсолютный путь.


Update 2:

Ответ на комментарий:

I get jQuery not found errors

можно найти в this ticket. В принципе, если вы используете пакет NPM в JQuery или сделать что-то вроде следующих в вашей HTML-файлах внутри электрона:

<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 

То, что вы получите это завода и не сам объект JQuery подключен к глобальному контексту (например window). Как я уже говорил в previous answer (содержащий также исходный код JQuery в)

When you require jQuery inside a CommonJS or similar environment which provides module and module.exports , what you get is a factory and not the actual jQuery object.

Теперь использовать этот завод (либо путем импорта кода из CDN или если у вас есть модуль НПМ доступный локально) вам нужно будет что-то в качестве следующее:

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

Я написал article, объясняющую комбинацию узла + Jquery.

+0

Информационный и тщательный. Это должен быть принятый ответ ИМО. –

+0

@keizom спасибо. Я очень ценю это :) –

+0

И почему работает 'require ('ipc')'? –

0

То же самое произошло со мной, простое решение - добавить это в свой индекс.JS файл:

app.on('ready', function() { 
     var mainWindow = new BrowserWindow({ 
     "node-integration": false 
     }) 
//rest of your initialization code here. 
}) 

проблема вызвана узлом, для получения дополнительной информации, пожалуйста, обратитесь к этому post

Setting node-integration to false will disable node.js in the renderer process - i.e. your app can only do what a web browser will do.

2

У меня есть один и тот же вопрос при использовании 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

+0

Это было единственное решение, которое сработало для меня. – justDev7a3

3
# assuming you have installed jquery locally instead of globally like in as 
npm install jquery -s   # without -g flag 

instead of require("jquery"), give relative path from source directory
require("./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> 
Смежные вопросы