Документация
Если вы проверите это электронное руководство по установке , вы можете прочитать, что вы должны установить электрон следующим образом:
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
, я тоже пробовал, даже это в основном процессе.