Есть ли разница между встроенным модулем Electron и тем, который установлен с npm? Как получить доступ к электронному объекту из других модулей? - PullRequest
0 голосов
/ 09 ноября 2018

Документация

Если вы проверите это электронное руководство по установке , вы можете прочитать, что вы должны установить электрон следующим образом:

npm install electron --save-dev

Так я и сделал. Но если вы проверите этот другой документ , они скажут:

При использовании встроенного модуля Electron вы можете столкнуться с такой ошибкой:

  > require('electron').webFrame.setZoomFactor(1.0)
  Uncaught TypeError: Cannot read property 'setZoomLevel' of undefined

Это потому, что у вас есть электронный модуль npm, установленный локально или глобально, который переопределяет встроенный модуль Electron.

Я не знаю, означают ли они «локально», как это (без --save-dev):

npm install electron

Разрешить электрон

Чтобы проверить правильность установки:

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

  console.log(require.resolve('electron'))

, а затем проверьте, имеет ли он следующую форму:

  "/path/to/Electron.app/Contents/Resources/atom.asar/renderer/api/lib/exports/electron.js"

Если это что-то вроде node_modules / Electron / Index.js, то вы должны либо удалить электронный модуль npm, либо переименовать его.

Результат в моем приложении

...\app_folder\node_modules\electron\dist\resources\electron.asar\browser\api\exports\electron.js

Проблема

Я могу получить доступ к электронному объекту из файла main.js. Это работает нормально:

const {app} = require('electron');

Но если я делаю это в других js-файлах (мне нужны эти файлы из main.js), я получаю неопределенное значение. Это нормально? Нужно ли отправлять объект электрона в качестве аргумента этим другим модулям?

Они тоже так говорят, но я принимаю во внимание:

Однако, если вы используете встроенный модуль, но по-прежнему получаете эту ошибку, весьма вероятно, что вы используете модуль в неправильном процессе. Например, Electron.app может использоваться только в основном процессе, а электрон.webFrame доступен только в процессах рендерера.

Эта документация все еще актуальна? Как мне установить Electron для работы встроенного модуля?

Конкретная проблема (обновление)

На самом деле, если я делаю в этом другом модуле

const electron = require('electron');
console.log(electron)
console.log(electron.app)

Объекты печатаются:

{ clipboard: [Getter],
crashReporter: [Getter],
nativeImage: [Getter],
shell: [Getter],
app: [Getter],
autoUpdater: [Getter],
BrowserView: [Getter],
BrowserWindow: [Getter],
contentTracing: [Getter],
dialog: [Getter],
globalShortcut: [Getter],
ipcMain: [Getter],
inAppPurchase: [Getter],
Menu: [Getter],
MenuItem: [Getter],
net: [Getter],
netLog: [Getter],
Notification: [Getter],
powerMonitor: [Getter],
powerSaveBlocker: [Getter],
protocol: [Getter],
screen: [Getter],
session: [Getter],
systemPreferences: [Getter],
TopLevelWindow: [Getter],
TouchBar: [Getter],
Tray: [Getter],
View: [Getter],
webContents: [Getter],
WebContentsView: [Getter] }

App {
_events:
{ login: [Function],
    'certificate-error': [Function],
    'select-client-certificate': [Function],
    quit: [Function],
    'web-contents-created': [Function],
    'session-created': [Function],
    'will-quit': [Function],
    ready: [ [Function], [Function] ],
    'window-all-closed': [Function] },
_eventsCount: 9,
_maxListeners: undefined,
whenReady: [Function: whenReady],
setApplicationMenu: [Function: setApplicationMenu],
getApplicationMenu: [Function: getApplicationMenu],
commandLine:
{ appendSwitch: [Function: appendSwitch],
    appendArgument: [Function: appendArgument] },
getAppMetrics: [Function],
isPackaged: false,
allowNTLMCredentialsForAllDomains: [Function],
releaseSingleInstance: [Function],
makeSingleInstance: [Function] }

Но если я попытаюсь получить путь к пользовательским данным

const __user_data = electron.app.getPath('userData');

Я получаю эту ошибку:

Cannot read property 'getPath' of undefined

Мне интересно, почему это происходит, потому что приложение существует, но если я запускаю app.getPath(), приложение больше не существует. Подобное происходит и с electron.remote, я тоже пробовал, даже это в основном процессе.

1 Ответ

0 голосов
/ 12 ноября 2018

Помимо сомнений по поводу путей установки я решил проблему. Мне требовался этот файл из разных мест в моем приложении. Иногда я вызываю это из основного процесса, а в других случаях из процесса визуализации. Поэтому я должен был сделать это для поддержки обоих случаев:

var app = null;
if (typeof(electron.remote) !== 'undefined') {
    app = electron.remote.app;
} else {
    app = electron.app
}
const __user_data = app.getPath('userData');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...