Spec-Zone.ru › Electron

Изменения, вносящие разрыв совместимости

Изменения, вносящие разрыв совместимости, будут документированы здесь, а предупреждения о устаревании добавлены в код JS, где это возможно, по крайней мере за одну основную версию до внесения изменений.

Типы изменений, вносящих разрыв совместимости​

В этом документе используется следующая конвенция для категоризации изменений, вносящих разрыв совместимости:

  • Изменённый API: API был изменён таким образом, что код, который не был обновлён, гарантированно сгенерирует исключение.
  • Изменённое поведение: Поведение Electron изменилось, но не таким образом, что обязательно будет сгенерировано исключение.
  • Изменённое значение по умолчанию: Код, зависящий от старого значения по умолчанию, может сломаться, необязательно генерируя исключение. Старое поведение можно восстановить, явно указав значение.
  • Устаревший: API был помечен как устаревший. API будет продолжать работать, но будет выводить предупреждение об устаревании и будет удалён в будущей версии.
  • Удалено: API или функция были удалены и больше не поддерживаются Electron.

Планируемые изменения API, вносящие разрыв совместимости (20.0)​

Изменённое значение по умолчанию: Рендеры без nodeIntegration: true по умолчанию работают в песочнице​

Ранее рендеры, которые указывали скрипт предварительной загрузки, по умолчанию работали вне песочницы. Это означало, что по умолчанию скрипты предварительной загрузки имели доступ к Node.js. В Electron 20 это значение по умолчанию изменилось. Начиная с Electron 20, рендеры будут работать в песочнице по умолчанию, если не указано nodeIntegration: true или sandbox: false.

Если вашим скриптам предварительной загрузки не требуется Node.js, никаких действий не требуется. Если ваши скрипты предварительной загрузки требуют Node.js, либо перепишите их, чтобы убрать использование Node.js из рендера, либо явно укажите sandbox: false для соответствующих рендеров.

Удалено: skipTaskbar на Linux​

В X11 skipTaskbar отправляет сообщение _NET_WM_STATE_SKIP_TASKBAR в менеджер окон X11. Нет прямого эквивалента для Wayland, и известные обходные пути имеют неприемлемые компромиссы (например, Window.is_skip_taskbar в GNOME требует небезопасного режима), поэтому Electron не может поддерживать эту функцию на Linux.

Изменённый API: session.setDevicePermissionHandler(handler)​

Обработчик, вызываемый при использовании session.setDevicePermissionHandler(handler), претерпел изменения в своих аргументах. Этот обработчик больше не получает кадр [WebFrameMain](/docs/latest/api/web-frame-main), а вместо этого получает origin, которое является источником, проверяющим разрешение на устройства.

Планируемые изменения API, вносящие разрыв совместимости (19.0)​

Удалено: IA32 Linux бинарные файлы​

Это результат отказа Chromium 102.0.4999.0 от поддержки IA32 Linux. Это завершает удаление поддержки IA32 Linux.

Планируемые изменения API, вносящие разрыв совместимости (18.0)​

Удалено: nativeWindowOpen​

До Electron 15 window.open по умолчанию был эмулирован с использованием BrowserWindowProxy. Это означало, что window.open('about:blank') не работал для синхронного открытия дочерних окон, доступных через скрипт, среди прочих несовместимостей. Начиная с Electron 15, nativeWindowOpen включён по умолчанию.

Дополнительные подробности см. в документации по window.open в Electron.

Планируемые изменения API, вносящие разрыв совместимости (17.0)​

Удалено: desktopCapturer.getSources в рендере​

API desktopCapturer.getSources теперь доступен только в основном процессе. Это изменение внесено для повышения безопасности приложений Electron по умолчанию.

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

// Main process
const { ipcMain, desktopCapturer } = require('electron')

ipcMain.handle(
  'DESKTOP_CAPTURER_GET_SOURCES',
  (event, opts) => desktopCapturer.getSources(opts)
)
// Renderer process
const { ipcRenderer } = require('electron')

const desktopCapturer = {
  getSources: (opts) => ipcRenderer.invoke('DESKTOP_CAPTURER_GET_SOURCES', opts)
}

Однако, следует рассмотреть возможность дальнейшего ограничения информации, возвращаемой рендеру; например, отображения селектора источников пользователю и возвращения только выбранного источника.

Устаревший: nativeWindowOpen​

До Electron 15 window.open по умолчанию был эмулирован с использованием BrowserWindowProxy. Это означало, что window.open('about:blank') не работал для синхронного открытия дочерних окон, доступных через скрипт, среди прочих несовместимостей. Начиная с Electron 15, nativeWindowOpen включён по умолчанию.

Дополнительные подробности см. в документации по window.open в Electron.

Планируемые изменения API, вносящие разрыв совместимости (16.0)​

Изменённое поведение: Реализация crashReporter переключена на Crashpad на Linux​

Основная реализация API crashReporter на Linux переключена с Breakpad на Crashpad, что соответствует Windows и Mac. В результате этого дочерние процессы теперь автоматически отслеживаются, и вызов process.crashReporter.start в дочерних процессах Node.js больше не требуется (и не рекомендуется, так как это запустит второй экземпляр отчётчика Crashpad).

Также есть некоторые тонкие изменения в том, как будут сообщаться аннотации на Linux, включая то, что длинные значения больше не будут разделены между аннотациями, добавленными с __1, __2 и так далее, а вместо этого будут усечены на (новом, более длинном) пределе значения аннотации.

Устаревший: desktopCapturer.getSources в рендере​

Использование API desktopCapturer.getSources в рендере устарело и будет удалено. Это изменение повышает безопасность приложений Electron по умолчанию.

Подробности о замене этого API в вашем приложении см. здесь.

Планируемые изменения API, вносящие разрыв совместимости (15.0)​

Изменённое значение по умолчанию: nativeWindowOpen по умолчанию true​

До Electron 15 window.open по умолчанию был эмулирован с использованием BrowserWindowProxy. Это означало, что window.open('about:blank') не работал для синхронного открытия дочерних окон, доступных через скрипт, среди прочих несовместимостей. nativeWindowOpen больше не экспериментальный, и теперь используется по умолчанию.

Дополнительные подробности см. в документации по window.open в Electron.

Планируемые изменения API, вносящие разрыв совместимости (14.0)​

Удалено: модуль remote​

Модуль remote был помечен как устаревший в Electron 12 и будет удален в Electron 14. Его заменяет модуль @electron/remote.

// Deprecated in Electron 12:
const { BrowserWindow } = require('electron').remote
// Replace with:
const { BrowserWindow } = require('@electron/remote')

// In the main process:
require('@electron/remote/main').initialize()

Удалено: app.allowRendererProcessReuse​

Свойство app.allowRendererProcessReuse будет удалено в рамках нашего плана более тесного соответствия модели процессов Chromium с точки зрения безопасности, производительности и поддерживаемости.

Для получения более подробной информации см. #18397.

Удалено: Связанность окон браузера​

Параметр affinity при создании нового BrowserWindow будет удален в рамках нашего плана более тесного соответствия модели процессов Chromium с точки зрения безопасности, производительности и поддерживаемости.

Для более подробной информации см. #18397.

API Изменено: window.open()​

Необязательный параметр frameName больше не будет устанавливать заголовок окна. Теперь это соответствует спецификации, описанной в официальной документации в соответствующем параметре windowName.

Если вы использовали этот параметр для установки заголовка окна, вы можете вместо этого использовать win.setTitle(title).

Удалено: worldSafeExecuteJavaScript​

В Electron 14, worldSafeExecuteJavaScript будет удалено. Альтернативы нет, убедитесь, что ваш код работает с этим свойством включенным. Оно было включено по умолчанию с Electron 12.

Это изменение повлияет на вас, если вы используете webFrame.executeJavaScript или webFrame.executeJavaScriptInIsolatedWorld. Вам нужно убедиться, что значения, возвращаемые этими методами, поддерживаются API Моста контекста, так как эти методы используют ту же семантику передачи значений.

Удалено: Наследование BrowserWindowConstructorOptions от родительских окон​

До Electron 14 окна, открытые с помощью window.open , наследовались от родительского окна параметрами конструктора BrowserWindow, такими как transparent и resizable. Начиная с Electron 14, это поведение удалено, и окна больше не будут наследоваться от родительских окон параметрами конструктора BrowserWindow.

Вместо этого, явно задайте параметры для нового окна с помощью setWindowOpenHandler:

webContents.setWindowOpenHandler((details) => {
  return {
    action: 'allow',
    overrideBrowserWindowOptions: {
      // ...
    }
  }
})

Удалено: additionalFeatures​

Устаревшее свойство additionalFeatures в событиях new-window и did-create-window WebContents было удалено. Поскольку new-window использует позиционные аргументы, аргумент всё ещё присутствует, но всегда будет пустым массивом []. (Хотя обратите внимание, что само событие new-window устарело и заменено на setWindowOpenHandler.) Ключи в параметрах window features теперь будут представлены в объекте options с значением true.

// Removed in Electron 14
// Triggered by window.open('...', '', 'my-key')
webContents.on('did-create-window', (window, details) => {
  if (details.additionalFeatures.includes('my-key')) {
    // ...
  }
})

// Replace with
webContents.on('did-create-window', (window, details) => {
  if (details.options['my-key']) {
    // ...
  }
})

Планируемые изменения API, требующие переработки (13.0)​

API Изменено: session.setPermissionCheckHandler(handler)​

Первый параметр методов handler ранее всегда был webContents, теперь иногда может быть null. Для корректной обработки проверки разрешений используйте свойства requestingOrigin, embeddingOrigin и securityOrigin. На webContents больше нельзя полагаться, так как он может быть null.

// Old code
session.setPermissionCheckHandler((webContents, permission) => {
  if (webContents.getURL().startsWith('https://google.com/') && permission === 'notification') {
    return true
  }
  return false
})

// Replace with
session.setPermissionCheckHandler((webContents, permission, requestingOrigin) => {
  if (new URL(requestingOrigin).hostname === 'google.com' && permission === 'notification') {
    return true
  }
  return false
})

Удалено: shell.moveItemToTrash()​

Устаревший синхронный API shell.moveItemToTrash() удалён. Используйте асинхронный shell.trashItem() вместо него.

// Removed in Electron 13
shell.moveItemToTrash(path)
// Replace with
shell.trashItem(path).then(/* ... */)

Удалено: BrowserWindow расширения API​

Устаревшие расширения API были удалены:

  • BrowserWindow.addExtension(path)
  • BrowserWindow.addDevToolsExtension(path)
  • BrowserWindow.removeExtension(name)
  • BrowserWindow.removeDevToolsExtension(name)
  • BrowserWindow.getExtensions()
  • BrowserWindow.getDevToolsExtensions()

Используйте API сессий вместо них:

  • ses.loadExtension(path)
  • ses.removeExtension(extension_id)
  • ses.getAllExtensions()
// Removed in Electron 13
BrowserWindow.addExtension(path)
BrowserWindow.addDevToolsExtension(path)
// Replace with
session.defaultSession.loadExtension(path)
// Removed in Electron 13
BrowserWindow.removeExtension(name)
BrowserWindow.removeDevToolsExtension(name)
// Replace with
session.defaultSession.removeExtension(extension_id)
// Removed in Electron 13
BrowserWindow.getExtensions()
BrowserWindow.getDevToolsExtensions()
// Replace with
session.defaultSession.getAllExtensions()

Удалено: методы в systemPreferences​

Следующие методы systemPreferences были устаревшими:

  • systemPreferences.isDarkMode()
  • systemPreferences.isInvertedColorScheme()
  • systemPreferences.isHighContrastColorScheme()

Используйте следующие nativeTheme свойства вместо них:

  • nativeTheme.shouldUseDarkColors
  • nativeTheme.shouldUseInvertedColorScheme
  • nativeTheme.shouldUseHighContrastColors
// Removed in Electron 13
systemPreferences.isDarkMode()
// Replace with
nativeTheme.shouldUseDarkColors

// Removed in Electron 13
systemPreferences.isInvertedColorScheme()
// Replace with
nativeTheme.shouldUseInvertedColorScheme

// Removed in Electron 13
systemPreferences.isHighContrastColorScheme()
// Replace with
nativeTheme.shouldUseHighContrastColors

Устарело: Событие WebContents new-window​

Событие new-window WebContents устарело. Его заменил webContents.setWindowOpenHandler().

// Deprecated in Electron 13
webContents.on('new-window', (event) => {
  event.preventDefault()
})

// Replace with
webContents.setWindowOpenHandler((details) => {
  return { action: 'deny' }
})

Планируемые изменения API, требующие переработки (12.0)​

Удалена поддержка Pepper Flash​

Chromium удалил поддержку Flash, и нам также пришлось это сделать. Подробнее см. в Плане развития Flash от Chromium.

Изменено значение по умолчанию: worldSafeExecuteJavaScript по умолчанию true​

В Electron 12 worldSafeExecuteJavaScript будет включено по умолчанию. Чтобы восстановить предыдущее поведение, необходимо указать worldSafeExecuteJavaScript: false в WebPreferences. Обратите внимание, что установка этого параметра в значение false небезопасно.

Этот параметр будет удален в Electron 14, поэтому, пожалуйста, переделайте свой код для поддержки значения по умолчанию.

Изменено значение по умолчанию: contextIsolation по умолчанию true​

В Electron 12 contextIsolation будет включено по умолчанию. Чтобы восстановить предыдущее поведение, необходимо указать contextIsolation: false в WebPreferences.

Мы рекомендуем включить contextIsolation для обеспечения безопасности вашего приложения.

Ещё один момент: require() нельзя использовать в процессе визуализации, если nodeIntegration не true и contextIsolation не false.

Для более подробной информации см.: https://github.com/electron/electron/issues/23506

Удалено: crashReporter.getCrashesDirectory()​

Метод crashReporter.getCrashesDirectory был удалён. Используйте app.getPath('crashDumps') вместо него.

// Removed in Electron 12
crashReporter.getCrashesDirectory()
// Replace with
app.getPath('crashDumps')

Удалено: crashReporter методы в процессе визуализации​

Следующие crashReporter методы больше недоступны в процессе визуализации:

  • crashReporter.start
  • crashReporter.getLastCrashReport
  • crashReporter.getUploadedReports
  • crashReporter.getUploadToServer
  • crashReporter.setUploadToServer
  • crashReporter.getCrashesDirectory

Вызывать их следует только из основного процесса.

См. #23265 для более подробной информации.

END_OF_DOCUMENT_MARKER

Изменённое значение по умолчанию: crashReporter.start({ compress: true })​

Значение по умолчанию параметра compress для crashReporter.start изменилось с false на true. Это означает, что дампы сбоев будут загружены на сервер обработки сбоев с заголовком Content-Encoding: gzip, а тело будет сжато.

Если ваш сервер обработки сбоев не поддерживает сжатые данные, вы можете отключить сжатие, указав { compress: false } в параметрах отчётчика о сбоях.

Устаревший модуль remote.​

Модуль remote устарел в Electron 12 и будет удалён в Electron 14. Его заменяет модуль @electron/remote.

// Deprecated in Electron 12:
const { BrowserWindow } = require('electron').remote
// Replace with:
const { BrowserWindow } = require('@electron/remote')

// In the main process:
require('@electron/remote/main').initialize()

Устаревший: shell.moveItemToTrash()​

Синхронный метод shell.moveItemToTrash() заменён новым асинхронным методом shell.trashItem().

// Deprecated in Electron 12
shell.moveItemToTrash(path)
// Replace with
shell.trashItem(path).then(/* ... */)

Планируемые изменения API, вносящие разрывы (11.0)​

Удалено: BrowserView.{destroy, fromId, fromWebContents, getAllViews} и id свойство BrowserView​

Экспериментальные API BrowserView.{destroy, fromId, fromWebContents, getAllViews} были удалены. Также удалено свойство id объекта BrowserView.

Более подробная информация доступна в #23578.

Планируемые изменения API, вносящие разрывы (10.0)​

Устаревший параметр companyName для crashReporter.start()​

Параметр companyName для crashReporter.start(), ранее обязательный, теперь является необязательным и устаревшим. Чтобы получить то же поведение, не используя устаревшую функцию, вы можете передать значение companyName в globalExtra.

// Deprecated in Electron 10
crashReporter.start({ companyName: 'Umbrella Corporation' })
// Replace with
crashReporter.start({ globalExtra: { _companyName: 'Umbrella Corporation' } })

Устаревший: crashReporter.getCrashesDirectory()​

Метод crashReporter.getCrashesDirectory устарел. Используйте app.getPath('crashDumps').

// Deprecated in Electron 10
crashReporter.getCrashesDirectory()
// Replace with
app.getPath('crashDumps')

Устаревшие методы crashReporter в процессе рендеринга​

Вызов следующих методов crashReporter из процесса рендеринга устарел:

  • crashReporter.start
  • crashReporter.getLastCrashReport
  • crashReporter.getUploadedReports
  • crashReporter.getUploadToServer
  • crashReporter.setUploadToServer
  • crashReporter.getCrashesDirectory

В модуле crashReporter в процессе рендеринга остались только не устаревшие методы addExtraParameter, removeExtraParameter и getParameters.

Все вышеперечисленные методы остаются не устаревшими, когда вызываются из основного процесса.

Дополнительные сведения см. в #23265.

Устаревший: crashReporter.start({ compress: false })​

Указание значения { compress: false } в crashReporter.start устарело. Почти все серверы обработки сбоев поддерживают сжатие gzip. Этот параметр будет удалён в будущих версиях Electron.

Изменённое значение по умолчанию: enableRemoteModule по умолчанию false​

В Electron 9 использование модуля remote без явного включения через параметр enableRemoteModule опции WebPreferences вызывало предупреждение. В Electron 10 модуль remote отключён по умолчанию. Для использования модуля remote необходимо указать enableRemoteModule: true в WebPreferences:

const w = new BrowserWindow({
  webPreferences: {
    enableRemoteModule: true
  }
})

Мы рекомендуем отказаться от использования модуля remote.

protocol.unregisterProtocol​

protocol.uninterceptProtocol​

Теперь API является синхронным, и необязательный обратный вызов больше не нужен.

// Deprecated
protocol.unregisterProtocol(scheme, () => { /* ... */ })
// Replace with
protocol.unregisterProtocol(scheme)

protocol.registerFileProtocol​

protocol.registerBufferProtocol​

protocol.registerStringProtocol​

protocol.registerHttpProtocol​

protocol.registerStreamProtocol​

protocol.interceptFileProtocol​

protocol.interceptStringProtocol​

protocol.interceptBufferProtocol​

protocol.interceptHttpProtocol​

protocol.interceptStreamProtocol​

Теперь API является синхронным, и необязательный обратный вызов больше не нужен.

// Deprecated
protocol.registerFileProtocol(scheme, handler, () => { /* ... */ })
// Replace with
protocol.registerFileProtocol(scheme, handler)

Зарегистрированный или перехваченный протокол не повлияет на текущую страницу до навигации.

protocol.isProtocolHandled​

Этот API устарел, и вместо него следует использовать protocol.isProtocolRegistered и protocol.isProtocolIntercepted.

// Deprecated
protocol.isProtocolHandled(scheme).then(() => { /* ... */ })
// Replace with
const isRegistered = protocol.isProtocolRegistered(scheme)
const isIntercepted = protocol.isProtocolIntercepted(scheme)

Планируемые изменения API, вносящие разрывы (9.0)​

Изменённое значение по умолчанию: Загрузка модулей нативных модулей без контекстной осведомлённости в процессе рендеринга отключена по умолчанию​

Начиная с Electron 9, загрузка модулей нативных модулей без контекстной осведомлённости в процессе рендеринга отключена по умолчанию. Это улучшает безопасность, производительность и поддержку Electron в качестве проекта.

END_OF_DOCUMENT_MARKER

Если это повлияло на вас, вы можете временно установить app.allowRendererProcessReuse в false, чтобы вернуться к старому поведению. Этот флаг будет доступен только до Electron 11, поэтому вам следует запланировать обновление ваших модулей для нативных функций, чтобы они учитывали контекст.

Для получения более подробной информации см. #18397.

Устаревшие: BrowserWindow расширения API​

Следующие расширения API устарели:

  • BrowserWindow.addExtension(path)
  • BrowserWindow.addDevToolsExtension(path)
  • BrowserWindow.removeExtension(name)
  • BrowserWindow.removeDevToolsExtension(name)
  • BrowserWindow.getExtensions()
  • BrowserWindow.getDevToolsExtensions()

Используйте вместо этого API сеансов:

  • ses.loadExtension(path)
  • ses.removeExtension(extension_id)
  • ses.getAllExtensions()
// Deprecated in Electron 9
BrowserWindow.addExtension(path)
BrowserWindow.addDevToolsExtension(path)
// Replace with
session.defaultSession.loadExtension(path)
// Deprecated in Electron 9
BrowserWindow.removeExtension(name)
BrowserWindow.removeDevToolsExtension(name)
// Replace with
session.defaultSession.removeExtension(extension_id)
// Deprecated in Electron 9
BrowserWindow.getExtensions()
BrowserWindow.getDevToolsExtensions()
// Replace with
session.defaultSession.getAllExtensions()

Удалено: <webview>.getWebContents()​

Этот API, который был устаревшим в Electron 8.0, теперь удален.

// Removed in Electron 9.0
webview.getWebContents()
// Replace with
const { remote } = require('electron')
remote.webContents.fromId(webview.getWebContentsId())

Удалено: webFrame.setLayoutZoomLevelLimits()​

Chromium удалил поддержку изменения пределов масштабирования макета, и Electron не может поддерживать её. Функция была устаревшей в Electron 8.x и была удалена в Electron 9.x. Теперь пределы масштабирования макета фиксированы: минимум 0,25 и максимум 5,0, как определено здесь.

Изменено поведение: отправка объектов, не являющихся JS, через IPC, теперь вызывает исключение​

В Electron 8.0 IPC был изменён на использование алгоритма структурированного клонирования, что принесло значительные улучшения производительности. Для облегчения перехода старый алгоритм сериализации IPC сохранялся и использовался для некоторых объектов, которые нельзя сериализовать с помощью структурированного клонирования. В частности, объекты DOM (например, Element, Location и DOMMatrix), объекты Node.js, основанные на классах C++ (например, process.env, некоторые члены Stream ), и объекты Electron, основанные на классах C++, (например, WebContents, BrowserWindow и WebFrame ) не подлежат сериализации с помощью структурированного клонирования. Всякий раз, когда вызывался старый алгоритм, выводилось предупреждение об устаревании.

В Electron 9.0 старый алгоритм сериализации был удален, и отправка таких несериализуемых объектов теперь вызывает ошибку "объект не может быть клонирован".

Изменён API: shell.openItem теперь shell.openPath​

API shell.openItem был заменён асинхронным API shell.openPath. Вы можете ознакомиться с исходным предложением API и обоснованием здесь.

Планируемые прерывающие изменения API (8.0)​

Изменено поведение: значения, отправленные через IPC, теперь сериализуются с помощью алгоритма структурированного клонирования​

Алгоритм сериализации объектов, отправленных через IPC (через ipcRenderer.send, ipcRenderer.sendSync, WebContents.send и связанные методы), был изменён с пользовательского алгоритма на встроенный в V8 алгоритм структурированного клонирования, тот же алгоритм, используемый для сериализации сообщений для postMessage. Это приводит к удвоению производительности для больших сообщений, но также вносит некоторые прерывающие изменения в поведение.

  • Отправка функций, промисов, WeakMaps, WeakSets или объектов, содержащих такие значения, через IPC теперь вызывает исключение вместо безмолвно конвертирования функций в undefined.
// Previously:
ipcRenderer.send('channel', { value: 3, someFunction: () => {} })
// => results in { value: 3 } arriving in the main process

// From Electron 8:
ipcRenderer.send('channel', { value: 3, someFunction: () => {} })
// => throws Error("() => {} could not be cloned.")
  • NaN, Infinity и -Infinity теперь будут корректно сериализованы вместо преобразования в null.
  • Объекты, содержащие циклические ссылки, теперь будут корректно сериализованы вместо преобразования в null.
  • Set, Map, Error и RegExp значения будут корректно сериализованы, вместо преобразования в {}.
  • BigInt значения будут корректно сериализованы, вместо преобразования в null.
  • Разреженные массивы будут сериализованы как есть, а не преобразованы в плотные массивы с null.
  • Date объекты будут передаваться как Date объекты, вместо преобразования в их строковое представление ISO.
  • Массивы с типом данных (например, Uint8Array, Uint16Array, Uint32Array и так далее) будут переданы как есть, а не преобразованные в Node.js Buffer.
  • Объекты Node.js Buffer будут переданы как Uint8Array. Вы можете преобразовать Uint8Array обратно в Node.js Buffer, обернув лежащий в основе ArrayBuffer:
Buffer.from(value.buffer, value.byteOffset, value.byteLength)

Отправка любых объектов, которые не являются встроенными типами JS, таких как объекты DOM (например, Element, Location, DOMMatrix), объекты Node.js (например, process.env, Stream) или объекты Electron (например, WebContents, BrowserWindow, WebFrame ) устарело. В Electron 8 эти объекты будут сериализованы как раньше с сообщением DeprecationWarning, но начиная с Electron 9, отправка этих типов объектов вызовет ошибку "не удалось клонировать".

Устаревший: <webview>.getWebContents()​

Этот API реализован с помощью модуля remote, что влечёт за собой последствия для производительности и безопасности. Поэтому его использование должно быть явным.

// Deprecated
webview.getWebContents()
// Replace with
const { remote } = require('electron')
remote.webContents.fromId(webview.getWebContentsId())

Однако рекомендуется вообще избегать использования модуля remote.

// main
const { ipcMain, webContents } = require('electron')

const getGuestForWebContents = (webContentsId, contents) => {
  const guest = webContents.fromId(webContentsId)
  if (!guest) {
    throw new Error(`Invalid webContentsId: ${webContentsId}`)
  }
  if (guest.hostWebContents !== contents) {
    throw new Error('Access denied to webContents')
  }
  return guest
}

ipcMain.handle('openDevTools', (event, webContentsId) => {
  const guest = getGuestForWebContents(webContentsId, event.sender)
  guest.openDevTools()
})

// renderer
const { ipcRenderer } = require('electron')

ipcRenderer.invoke('openDevTools', webview.getWebContentsId())

Устаревший: webFrame.setLayoutZoomLevelLimits()​

Chromium удалил поддержку изменения пределов масштабирования макета, и Electron не может поддерживать её. Функция будет генерировать предупреждение в Electron 8.x и перестанет существовать в Electron 9.x. Пределы масштабирования макета теперь фиксированы: минимум 0,25 и максимум 5,0, как определено здесь.

Устаревшие события в systemPreferences​

Следующие события systemPreferences устарели:

  • inverted-color-scheme-changed
  • high-contrast-color-scheme-changed

Используйте новое событие updated в модуле nativeTheme вместо этого.

// Deprecated
systemPreferences.on('inverted-color-scheme-changed', () => { /* ... */ })
systemPreferences.on('high-contrast-color-scheme-changed', () => { /* ... */ })

// Replace with
nativeTheme.on('updated', () => { /* ... */ })

Устаревшие методы в systemPreferences​

Следующие методы systemPreferences устарели:

  • systemPreferences.isDarkMode()
  • systemPreferences.isInvertedColorScheme()
  • systemPreferences.isHighContrastColorScheme()

Используйте следующие свойства nativeTheme вместо этого:

  • nativeTheme.shouldUseDarkColors
  • nativeTheme.shouldUseInvertedColorScheme
  • nativeTheme.shouldUseHighContrastColors
// Deprecated
systemPreferences.isDarkMode()
// Replace with
nativeTheme.shouldUseDarkColors

// Deprecated
systemPreferences.isInvertedColorScheme()
// Replace with
nativeTheme.shouldUseInvertedColorScheme

// Deprecated
systemPreferences.isHighContrastColorScheme()
// Replace with
nativeTheme.shouldUseHighContrastColors
END_OF_DOCUMENT_MARKER

Планируемые изменения API, при которых нарушается совместимость (7.0)​

Устаревший: URL заголовков узла Atom.io​

Это URL, указанный как disturl в файле .npmrc или как флаг командной строки --dist-url при построении модулей Node.js. Оба варианта будут поддерживаться в обозримом будущем, но рекомендуется перейти на другой.

Устаревший: https://atom.io/download/electron

Заменить на: https://electronjs.org/headers

Изменён API: session.clearAuthCache() больше не принимает параметры​

API session.clearAuthCache больше не принимает параметры для очистки, и вместо этого безусловно очищает весь кэш.

// Deprecated
session.clearAuthCache({ type: 'password' })
// Replace with
session.clearAuthCache()

Изменён API: powerMonitor.querySystemIdleState теперь powerMonitor.getSystemIdleState​

// Removed in Electron 7.0
powerMonitor.querySystemIdleState(threshold, callback)
// Replace with synchronous API
const idleState = powerMonitor.getSystemIdleState(threshold)

Изменён API: powerMonitor.querySystemIdleTime теперь powerMonitor.getSystemIdleTime​

// Removed in Electron 7.0
powerMonitor.querySystemIdleTime(callback)
// Replace with synchronous API
const idleTime = powerMonitor.getSystemIdleTime()

Изменён API: webFrame.setIsolatedWorldInfo заменяет отдельные методы​

// Removed in Electron 7.0
webFrame.setIsolatedWorldContentSecurityPolicy(worldId, csp)
webFrame.setIsolatedWorldHumanReadableName(worldId, name)
webFrame.setIsolatedWorldSecurityOrigin(worldId, securityOrigin)
// Replace with
webFrame.setIsolatedWorldInfo(
  worldId,
  {
    securityOrigin: 'some_origin',
    name: 'human_readable_name',
    csp: 'content_security_policy'
  })

Удалено: свойство marked в getBlinkMemoryInfo​

Это свойство было удалено в Chromium 77, и поэтому больше недоступно.

Изменено поведение: свойство webkitdirectory для <input type="file"/> теперь отображает содержимое каталога​

Свойство webkitdirectory для HTML-элементов ввода файлов позволяет выбирать папки. Предыдущие версии Electron имели неверную реализацию, где event.target.files ввода возвращало FileList возвращающее один File, соответствующий выбранной папке.

Начиная с Electron 7, это FileList теперь представляет список всех файлов, содержащихся в папке, аналогично Chrome, Firefox и Edge (ссылка на документацию MDN).

В качестве примера, рассмотрим папку со следующей структурой:

folder
├── file1
├── file2
└── file3

В Electron <=6 это возвращало FileList с объектом File для:

path/to/folder

В Electron 7 это теперь возвращает FileList с объектом File для:

/path/to/folder/file3
/path/to/folder/file2
/path/to/folder/file1

Обратите внимание, что webkitdirectory больше не предоставляет путь к выбранной папке. Если вам нужен путь к выбранной папке, а не её содержимое, обратитесь к API dialog.showOpenDialog (ссылка).

Изменён API: Функции обратного вызова для асинхронных API, использующие promises​

Electron 5 и Electron 6 представили версии API на основе Promises для существующих асинхронных API и устарели их старые аналоги на основе функций обратного вызова. В Electron 7 все устаревшие API на основе функций обратного вызова были удалены.

Эти функции теперь возвращают только Promises:

  • app.getFileIcon() #15742
  • app.dock.show() #16904
  • contentTracing.getCategories() #16583
  • contentTracing.getTraceBufferUsage() #16600
  • contentTracing.startRecording() #16584
  • contentTracing.stopRecording() #16584
  • contents.executeJavaScript() #17312
  • cookies.flushStore() #16464
  • cookies.get() #16464
  • cookies.remove() #16464
  • cookies.set() #16464
  • debugger.sendCommand() #16861
  • dialog.showCertificateTrustDialog() #17181
  • inAppPurchase.getProducts() #17355
  • inAppPurchase.purchaseProduct()#17355
  • netLog.stopLogging() #16862
  • session.clearAuthCache() #17259
  • session.clearCache() #17185
  • session.clearHostResolverCache() #17229
  • session.clearStorageData() #17249
  • session.getBlobData() #17303
  • session.getCacheSize() #17185
  • session.resolveProxy() #17222
  • session.setProxy() #17222
  • shell.openExternal() #16176
  • webContents.loadFile() #15855
  • webContents.loadURL() #15855
  • webContents.hasServiceWorker() #16535
  • webContents.printToPDF() #16795
  • webContents.savePage() #16742
  • webFrame.executeJavaScript() #17312
  • webFrame.executeJavaScriptInIsolatedWorld() #17312
  • webviewTag.executeJavaScript() #17312
  • win.capturePage() #15743

Эти функции теперь имеют две формы: синхронную и асинхронную на основе Promises.

  • dialog.showMessageBox()/dialog.showMessageBoxSync() #17298
  • dialog.showOpenDialog()/dialog.showOpenDialogSync() #16973
  • dialog.showSaveDialog()/dialog.showSaveDialogSync() #17054

Планируемые изменения API, требующие перестройки (6.0)​

Изменение API: win.setMenu(null) теперь win.removeMenu()​

// Deprecated
win.setMenu(null)
// Replace with
win.removeMenu()

Изменение API: electron.screen в процессе рендеринга должен использоваться через remote​

// Deprecated
require('electron').screen
// Replace with
require('electron').remote.screen

Изменение API: require() встроенных модулей Node в изолированных процессах рендеринга больше не подразумевает загрузку remote версии​

// Deprecated
require('child_process')
// Replace with
require('electron').remote.require('child_process')

// Deprecated
require('fs')
// Replace with
require('electron').remote.require('fs')

// Deprecated
require('os')
// Replace with
require('electron').remote.require('os')

// Deprecated
require('path')
// Replace with
require('electron').remote.require('path')

Устаревший: powerMonitor.querySystemIdleState заменён на powerMonitor.getSystemIdleState​

// Deprecated
powerMonitor.querySystemIdleState(threshold, callback)
// Replace with synchronous API
const idleState = powerMonitor.getSystemIdleState(threshold)

Устаревший: powerMonitor.querySystemIdleTime заменён на powerMonitor.getSystemIdleTime​

// Deprecated
powerMonitor.querySystemIdleTime(callback)
// Replace with synchronous API
const idleTime = powerMonitor.getSystemIdleTime()

Устаревший: app.enableMixedSandbox() больше не нужен​

// Deprecated
app.enableMixedSandbox()

Режим смешанной изоляции теперь включён по умолчанию.

Устаревший: Tray.setHighlightMode​

Под macOS Catalina наша реализация подсистемы лотка работает некорректно. Встроенная замена Apple не поддерживает изменение поведения подсветки.

// Deprecated
tray.setHighlightMode(mode)
// API will be removed in v7.0 without replacement.

Планируемые изменения API, требующие перестройки (5.0)​

Изменение по умолчанию: nodeIntegration и webviewTag по умолчанию false, contextIsolation по умолчанию true​

Следующие значения по умолчанию webPreferences опций устарели в пользу новых значений по умолчанию, указанных ниже.

Свойство Устаревшее значение по умолчанию Новое значение по умолчанию
contextIsolation false true
nodeIntegration true false
webviewTag nodeIntegration при установке, иначе true false

Например, повторное включение webviewTag

const w = new BrowserWindow({
  webPreferences: {
    webviewTag: true
  }
})

Изменение поведения: nodeIntegration в дочерних окнах, открытых через nativeWindowOpen​

Дочерние окна, открытые с опцией nativeWindowOpen, всегда будут иметь отключенную интеграцию с Node.js, если только nodeIntegrationInSubFrames не будет true.

Изменение API: Регистрация привилегированных схем должна производиться до события app ready​

API процессов рендеринга webFrame.registerURLSchemeAsPrivileged и webFrame.registerURLSchemeAsBypassingCSP, а также API процесса браузера protocol.registerStandardSchemes были удалены. Добавлено новое API protocol.registerSchemesAsPrivileged, которое следует использовать для регистрации пользовательских схем с необходимыми привилегиями. Пользовательские схемы должны быть зарегистрированы до события app ready.

Устаревший: webFrame.setIsolatedWorld* заменён на webFrame.setIsolatedWorldInfo​

// Deprecated
webFrame.setIsolatedWorldContentSecurityPolicy(worldId, csp)
webFrame.setIsolatedWorldHumanReadableName(worldId, name)
webFrame.setIsolatedWorldSecurityOrigin(worldId, securityOrigin)
// Replace with
webFrame.setIsolatedWorldInfo(
  worldId,
  {
    securityOrigin: 'some_origin',
    name: 'human_readable_name',
    csp: 'content_security_policy'
  })

Изменение API: webFrame.setSpellCheckProvider теперь принимает асинхронный обратный вызов​

Обратный вызов spellCheck теперь асинхронный, и параметр autoCorrectWord удалён.

// Deprecated
webFrame.setSpellCheckProvider('en-US', true, {
  spellCheck: (text) => {
    return !spellchecker.isMisspelled(text)
  }
})
// Replace with
webFrame.setSpellCheckProvider('en-US', {
  spellCheck: (words, callback) => {
    callback(words.filter(text => spellchecker.isMisspelled(text)))
  }
})

Изменение API: webContents.getZoomLevel и webContents.getZoomFactor теперь синхронны​

webContents.getZoomLevel и webContents.getZoomFactor больше не принимают параметры обратного вызова, а вместо этого возвращают числовые значения напрямую.

// Deprecated
webContents.getZoomLevel((level) => {
  console.log(level)
})
// Replace with
const level = webContents.getZoomLevel()
console.log(level)
// Deprecated
webContents.getZoomFactor((factor) => {
  console.log(factor)
})
// Replace with
const factor = webContents.getZoomFactor()
console.log(factor)

Планируемые изменения API, требующие перестройки (4.0)​

В этом списке приведены изменения API, требующие перестройки в Electron 4.0.

app.makeSingleInstance​

// Deprecated
app.makeSingleInstance((argv, cwd) => {
  /* ... */
})
// Replace with
app.requestSingleInstanceLock()
app.on('second-instance', (event, argv, cwd) => {
  /* ... */
})

app.releaseSingleInstance​

// Deprecated
app.releaseSingleInstance()
// Replace with
app.releaseSingleInstanceLock()

app.getGPUInfo​

app.getGPUInfo('complete')
// Now behaves the same with `basic` on macOS
app.getGPUInfo('basic')

win_delay_load_hook​

При создании нативных модулей для Windows переменная win_delay_load_hook в binding.gyp модуля должна быть true (по умолчанию). Если этот обработчик отсутствует, то нативный модуль не загрузится в Windows с сообщением об ошибке, таким как Cannot find module. Для получения дополнительной информации см. руководство по нативным модулям.

Удалено: поддержка IA32 Linux​

Electron 18 больше не будет работать на 32-битных системах Linux. Подробнее см. прекращение поддержки 32-битного Linux.

Изменения API (3.0)​

В данном списке перечислены изменения API в Electron 3.0.

app​

// Deprecated
app.getAppMemoryInfo()
// Replace with
app.getAppMetrics()

// Deprecated
const metrics = app.getAppMetrics()
const { memory } = metrics[0] // Deprecated property

BrowserWindow​

// Deprecated
const optionsA = { webPreferences: { blinkFeatures: '' } }
const windowA = new BrowserWindow(optionsA)
// Replace with
const optionsB = { webPreferences: { enableBlinkFeatures: '' } }
const windowB = new BrowserWindow(optionsB)

// Deprecated
window.on('app-command', (e, cmd) => {
  if (cmd === 'media-play_pause') {
    // do something
  }
})
// Replace with
window.on('app-command', (e, cmd) => {
  if (cmd === 'media-play-pause') {
    // do something
  }
})

clipboard​

// Deprecated
clipboard.readRtf()
// Replace with
clipboard.readRTF()

// Deprecated
clipboard.writeRtf()
// Replace with
clipboard.writeRTF()

// Deprecated
clipboard.readHtml()
// Replace with
clipboard.readHTML()

// Deprecated
clipboard.writeHtml()
// Replace with
clipboard.writeHTML()

crashReporter​

// Deprecated
crashReporter.start({
  companyName: 'Crashly',
  submitURL: 'https://crash.server.com',
  autoSubmit: true
})
// Replace with
crashReporter.start({
  companyName: 'Crashly',
  submitURL: 'https://crash.server.com',
  uploadToServer: true
})

nativeImage​

// Deprecated
nativeImage.createFromBuffer(buffer, 1.0)
// Replace with
nativeImage.createFromBuffer(buffer, {
  scaleFactor: 1.0
})

process​

// Deprecated
const info = process.getProcessMemoryInfo()

screen​

// Deprecated
screen.getMenuBarHeight()
// Replace with
screen.getPrimaryDisplay().workArea

session​

// Deprecated
ses.setCertificateVerifyProc((hostname, certificate, callback) => {
  callback(true)
})
// Replace with
ses.setCertificateVerifyProc((request, callback) => {
  callback(0)
})

Tray​

// Deprecated
tray.setHighlightMode(true)
// Replace with
tray.setHighlightMode('on')

// Deprecated
tray.setHighlightMode(false)
// Replace with
tray.setHighlightMode('off')

webContents​

// Deprecated
webContents.openDevTools({ detach: true })
// Replace with
webContents.openDevTools({ mode: 'detach' })

// Removed
webContents.setSize(options)
// There is no replacement for this API

webFrame​

// Deprecated
webFrame.registerURLSchemeAsSecure('app')
// Replace with
protocol.registerStandardSchemes(['app'], { secure: true })

// Deprecated
webFrame.registerURLSchemeAsPrivileged('app', { secure: true })
// Replace with
protocol.registerStandardSchemes(['app'], { secure: true })

<webview>​

// Removed
webview.setAttribute('disableguestresize', '')
// There is no replacement for this API

// Removed
webview.setAttribute('guestinstance', instanceId)
// There is no replacement for this API

// Keyboard listeners no longer work on webview tag
webview.onkeydown = () => { /* handler */ }
webview.onkeyup = () => { /* handler */ }

URL заголовков Node​

Это URL, указанный как disturl в файле .npmrc или как флаг командной строки --dist-url при построении нативных модулей Node.

Устарело: https://atom.io/download/atom-shell

Заменить на: https://atom.io/download/electron

Изменения API (2.0)​

В данном списке перечислены изменения API, внедрённые в Electron 2.0.

BrowserWindow​

// Deprecated
const optionsA = { titleBarStyle: 'hidden-inset' }
const windowA = new BrowserWindow(optionsA)
// Replace with
const optionsB = { titleBarStyle: 'hiddenInset' }
const windowB = new BrowserWindow(optionsB)

menu​

// Removed
menu.popup(browserWindow, 100, 200, 2)
// Replaced with
menu.popup(browserWindow, { x: 100, y: 200, positioningItem: 2 })

nativeImage​

// Removed
nativeImage.toPng()
// Replaced with
nativeImage.toPNG()

// Removed
nativeImage.toJpeg()
// Replaced with
nativeImage.toJPEG()

process​

  • process.versions.electron и process.version.chrome будут объявлены в качестве неизменяемых свойств для соответствия другим свойствам process.versions, заданным Node.

webContents​

// Removed
webContents.setZoomLevelLimits(1, 2)
// Replaced with
webContents.setVisualZoomLevelLimits(1, 2)

webFrame​

// Removed
webFrame.setZoomLevelLimits(1, 2)
// Replaced with
webFrame.setVisualZoomLevelLimits(1, 2)

<webview>​

// Removed
webview.setZoomLevelLimits(1, 2)
// Replaced with
webview.setVisualZoomLevelLimits(1, 2)

Дублируемые ресурсы ARM​

В каждом релизе Electron есть две идентичные ARM сборки с немного отличающимися именами файлов, например, electron-v1.7.3-linux-arm.zip и electron-v1.7.3-linux-armv7l.zip. Файл с префиксом v7l добавлен для ясности версии ARM, которую он поддерживает, и для разграничения от будущих ресурсов armv6l и arm64.

Файл без префикса всё ещё публикуется, чтобы не сломать настройки, которые могут его использовать. Начиная с версии 2.0, файл без префикса больше не будет публиковаться.

Для получения подробностей см. 6986 и 7189.

© GitHub Inc.
Licensed under the MIT license.
https://www.electronjs.org/docs/latest/breaking-changes

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API