Saltar al contenido principal

Restaurar archivos borrados

Breaking changes will be documented here, and deprecation warnings added to JS code where possible, at least one major version before the change is made.

Tipos de cambios de ruptura

Este documento usa la siguiente convención para clasificar los cambios de ruptura:

  • API Modificada: Se cambió una API de tal manera que se garantiza que el código que no ha sido actualizado produzca una excepción.
  • **Comportamiento Modificado: ** El comportamiento de Electron ha cambiado, pero no de tal manera que una excepción se produzca necesariamente.
  • Valor por defecto Modificado: Código dependiente del viejo valor por defecto puede romperse, no necesariamente lanzando una excepción. El comportamiento antiguo puede ser restaurado especificando explícitamente el valor.
  • Obsoleto: Una API fue marcada como obsoleta. La API continuará funcionando, pero emitirá una advertencia de desaprobación y será eliminada en una futura versión.
  • Eliminado: Una API o característica fue eliminada y ya no es compatible por Electron.

Cambios Planeados en la API (33.0)

Behavior Changed: frame properties may retrieve detached WebFrameMain instances or none at all

APIs which provide access to a WebFrameMain instance may return an instance with frame.detached set to true, or possibly return null.

When a frame performs a cross-origin navigation, it enters into a detached state in which it's no longer attached to the page. In this state, it may be running unload handlers prior to being deleted. In the event of an IPC sent during this state, frame.detached will be set to true with the frame being destroyed shortly thereafter.

When receiving an event, it's important to access WebFrameMain properties immediately upon being received. Otherwise, it's not guaranteed to point to the same webpage as when received. To avoid misaligned expectations, Electron will return null in the case of late access where the webpage has changed.

ipcMain.on('unload-event', (event) => {
event.senderFrame; // ✅ accessed immediately
});

ipcMain.on('unload-event', async (event) => {
await crossOriginNavigationPromise;
event.senderFrame; // ❌ returns `null` due to late access
});

Behavior Changed: custom protocol URL handling on Windows

Due to changes made in Chromium to support Non-Special Scheme URLs, custom protocol URLs that use Windows file paths will no longer work correctly with the deprecated protocol.registerFileProtocol and the baseURLForDataURL property on BrowserWindow.loadURL, WebContents.loadURL, and <webview>.loadURL. protocol.handle will also not work with these types of URLs but this is not a change since it has always worked that way.

// No longer works
protocol.registerFileProtocol('other', () => {
callback({ filePath: '/path/to/my/file' })
})

const mainWindow = new BrowserWindow()
mainWindow.loadURL('data:text/html,<script src="loaded-from-dataurl.js"></script>', { baseURLForDataURL: 'other://C:\\myapp' })
mainWindow.loadURL('other://C:\\myapp\\index.html')

// Replace with
const path = require('node:path')
const nodeUrl = require('node:url')
protocol.handle(other, (req) => {
const srcPath = 'C:\\myapp\\'
const reqURL = new URL(req.url)
return net.fetch(nodeUrl.pathToFileURL(path.join(srcPath, reqURL.pathname)).toString())
})

mainWindow.loadURL('data:text/html,<script src="loaded-from-dataurl.js"></script>', { baseURLForDataURL: 'other://' })
mainWindow.loadURL('other://index.html')

Behavior Changed: webContents property on login on app

The webContents property in the login event from app will be null when the event is triggered for requests from the utility process created with respondToAuthRequestsFromMainProcess option.

Deprecated: textured option in BrowserWindowConstructorOption.type

The textured option of type in BrowserWindowConstructorOptions has been deprecated with no replacement. This option relied on the NSWindowStyleMaskTexturedBackground style mask on macOS, which has been deprecated with no alternative.

Removed: macOS 10.15 support

macOS 10.15 (Catalina) is no longer supported by Chromium.

Older versions of Electron will continue to run on Catalina, but macOS 11 (Big Sur) or later will be required to run Electron v33.0.0 and higher.

Obsoleto: systemPreferences.accessibilityDisplayShouldReduceTransparency

The systemPreferences.accessibilityDisplayShouldReduceTransparency property is now deprecated in favor of the new nativeTheme.prefersReducedTransparency, which provides identical information and works cross-platform.

// Deprecated
const shouldReduceTransparency = systemPreferences.accessibilityDisplayShouldReduceTransparency

// Replace with:
const prefersReducedTransparency = nativeTheme.prefersReducedTransparency

Cambios Planeados en la API (32.0)

Removed: File.path

The nonstandard path property of the Web File object was added in an early version of Electron as a convenience method for working with native files when doing everything in the renderer was more common. However, it represents a deviation from the standard and poses a minor security risk as well, so beginning in Electron 32.0 it has been removed in favor of the webUtils.getPathForFile method.

// Before (renderer)

const file = document.querySelector('input[type=file]').files[0]
alert(`Uploaded file path was: ${file.path}`)
// After (renderer)

const file = document.querySelector('input[type=file]').files[0]
electron.showFilePath(file)

// (preload)
const { contextBridge, webUtils } = require('electron')

contextBridge.exposeInMainWorld('electron', {
showFilePath (file) {
// It's best not to expose the full file path to the web content if
// possible.
const path = webUtils.getPathForFile(file)
alert(`Uploaded file path was: ${path}`)
}
})

Deprecated: clearHistory, canGoBack, goBack, canGoForward, goForward, goToIndex, canGoToOffset, goToOffset on WebContents

The navigation-related APIs are now deprecated.

These APIs have been moved to the navigationHistory property of WebContents to provide a more structured and intuitive interface for managing navigation history.

// Deprecated
win.webContents.clearHistory()
win.webContents.canGoBack()
win.webContents.goBack()
win.webContents.canGoForward()
win.webContents.goForward()
win.webContents.goToIndex(index)
win.webContents.canGoToOffset()
win.webContents.goToOffset(index)

// Replace with
win.webContents.navigationHistory.clear()
win.webContents.navigationHistory.canGoBack()
win.webContents.navigationHistory.goBack()
win.webContents.navigationHistory.canGoForward()
win.webContents.navigationHistory.goForward()
win.webContents.navigationHistory.canGoToOffset()
win.webContents.navigationHistory.goToOffset(index)

Cambios Planeados en la API (31.0)

Removed: WebSQL support

Chromium has removed support for WebSQL upstream, transitioning it to Android only. See Chromium's intent to remove discussion for more information.

Behavior Changed: nativeImage.toDataURL will preserve PNG colorspace

PNG decoder implementation has been changed to preserve colorspace data, the encoded data returned from this function now matches it.

See crbug.com/332584706 for more information.

Behavior Changed: window.flashFrame(bool) will flash dock icon continuously on macOS

This brings the behavior to parity with Windows and Linux. Prior behavior: The first flashFrame(true) bounces the dock icon only once (using the NSInformationalRequest level) and flashFrame(false) does nothing. New behavior: Flash continuously until flashFrame(false) is called. This uses the NSCriticalRequest level instead. To explicitly use NSInformationalRequest to cause a single dock icon bounce, it is still possible to use dock.bounce('informational').

Cambios Planeados en la API (30.0)

Behavior Changed: cross-origin iframes now use Permission Policy to access features

Cross-origin iframes must now specify features available to a given iframe via the allow attribute in order to access them.

See documentation for more information.

Removed: The --disable-color-correct-rendering switch

This switch was never formally documented but it's removal is being noted here regardless. Chromium itself now has better support for color spaces so this flag should not be needed.

Behavior Changed: BrowserView.setAutoResize behavior on macOS

In Electron 30, BrowserView is now a wrapper around the new WebContentsView API.

Previously, the setAutoResize function of the BrowserView API was backed by autoresizing on macOS, and by a custom algorithm on Windows and Linux. For simple use cases such as making a BrowserView fill the entire window, the behavior of these two approaches was identical. However, in more advanced cases, BrowserViews would be autoresized differently on macOS than they would be on other platforms, as the custom resizing algorithm for Windows and Linux did not perfectly match the behavior of macOS's autoresizing API. The autoresizing behavior is now standardized across all platforms.

If your app uses BrowserView.setAutoResize to do anything more complex than making a BrowserView fill the entire window, it's likely you already had custom logic in place to handle this difference in behavior on macOS. If so, that logic will no longer be needed in Electron 30 as autoresizing behavior is consistent.

Deprecated: BrowserView

The BrowserView class has been deprecated and replaced by the new WebContentsView class.

BrowserView related methods in BrowserWindow have also been deprecated:

BrowserWindow.fromBrowserView(browserView)
win.setBrowserView(browserView)
win.getBrowserView()
win.addBrowserView(browserView)
win.removeBrowserView(browserView)
win.setTopBrowserView(browserView)
win.getBrowserViews()

Removed: params.inputFormType property on context-menu on WebContents

The inputFormType property of the params object in the context-menu event from WebContents has been removed. Use the new formControlType property instead.

Eliminado: process.getIOCounters()

Chromium has removed access to this information.

Cambios Planeados en la API (29.0)

Behavior Changed: ipcRenderer can no longer be sent over the contextBridge

Attempting to send the entire ipcRenderer module as an object over the contextBridge will now result in an empty object on the receiving side of the bridge. This change was made to remove / mitigate a security footgun. You should not directly expose ipcRenderer or its methods over the bridge. Instead, provide a safe wrapper like below:

contextBridge.exposeInMainWorld('app', {
onEvent: (cb) => ipcRenderer.on('foo', (e, ...args) => cb(args))
})

Removed: renderer-process-crashed event on app

The renderer-process-crashed event on app has been removed. Use the new render-process-gone event instead.

// Removed
app.on('renderer-process-crashed', (event, webContents, killed) => { /* ... */ })

// Replace with
app.on('render-process-gone', (event, webContents, details) => { /* ... */ })

Removed: crashed event on WebContents and <webview>

The crashed events on WebContents and <webview> have been removed. Use the new render-process-gone event instead.

// Removed
win.webContents.on('crashed', (event, killed) => { /* ... */ })
webview.addEventListener('crashed', (event) => { /* ... */ })

// Replace with
win.webContents.on('render-process-gone', (event, details) => { /* ... */ })
webview.addEventListener('render-process-gone', (event) => { /* ... */ })

Removed: gpu-process-crashed event on app

The gpu-process-crashed event on app has been removed. Use the new child-process-gone event instead.

// Removed
app.on('gpu-process-crashed', (event, killed) => { /* ... */ })

// Replace with
app.on('child-process-gone', (event, details) => { /* ... */ })

Cambios Planeados en la API (28.0)

Behavior Changed: WebContents.backgroundThrottling set to false affects all WebContents in the host BrowserWindow

WebContents.backgroundThrottling set to false will disable frames throttling in the BrowserWindow for all WebContents displayed by it.

Eliminado: BrowserWindow.setTrafficLightPosition(position)

BrowserWindow.setTrafficLightPosition(position) has been removed, the BrowserWindow.setWindowButtonPosition(position) API should be used instead which accepts null instead of { x: 0, y: 0 } to reset the position to system default.

// Removed in Electron 28
win.setTrafficLightPosition({ x: 10, y: 10 })
win.setTrafficLightPosition({ x: 0, y: 0 })

// Replace with
win.setWindowButtonPosition({ x: 10, y: 10 })
win.setWindowButtonPosition(null)

Eliminado: BrowserWindow.getTrafficLightPosition()

BrowserWindow.getTrafficLightPosition() has been removed, the BrowserWindow.getWindowButtonPosition() API should be used instead which returns null instead of { x: 0, y: 0 } when there is no custom position.

// Removed in Electron 28
const pos = win.getTrafficLightPosition()
if (pos.x === 0 && pos.y === 0) {
// No custom position.
}

// Replace with
const ret = win.getWindowButtonPosition()
if (ret === null) {
// No custom position.
}

Eliminado: ipcRenderer.sendTo()

The ipcRenderer.sendTo() API has been removed. It should be replaced by setting up a MessageChannel between the renderers.

The senderId and senderIsMainFrame properties of IpcRendererEvent have been removed as well.

Eliminado: app.runningUnderRosettaTranslation

The app.runningUnderRosettaTranslation property has been removed. Use app.runningUnderARM64Translation instead.

// Removed
console.log(app.runningUnderRosettaTranslation)
// Replace with
console.log(app.runningUnderARM64Translation)

Deprecated: renderer-process-crashed event on app

The renderer-process-crashed event on app has been deprecated. Use the new render-process-gone event instead.

// Deprecated
app.on('renderer-process-crashed', (event, webContents, killed) => { /* ... */ })

// Replace with
app.on('render-process-gone', (event, webContents, details) => { /* ... */ })

Deprecated: params.inputFormType property on context-menu on WebContents

The inputFormType property of the params object in the context-menu event from WebContents has been deprecated. Use the new formControlType property instead.

Deprecated: crashed event on WebContents and <webview>

The crashed events on WebContents and <webview> have been deprecated. Use the new render-process-gone event instead.

// Deprecated
win.webContents.on('crashed', (event, killed) => { /* ... */ })
webview.addEventListener('crashed', (event) => { /* ... */ })

// Replace with
win.webContents.on('render-process-gone', (event, details) => { /* ... */ })
webview.addEventListener('render-process-gone', (event) => { /* ... */ })

Deprecated: gpu-process-crashed event on app

The gpu-process-crashed event on app has been deprecated. Use the new child-process-gone event instead.

// Deprecated
app.on('gpu-process-crashed', (event, killed) => { /* ... */ })

// Replace with
app.on('child-process-gone', (event, details) => { /* ... */ })

Cambios en API Planeados (27.0)

Eliminado: soporte para macOS 10.13 / 10.14

macOS 10.13 (High Sierra) and macOS 10.14 (Mojave) are no longer supported by Chromium.

Las versiones antiguas de Electron continuarán funcionando en estos sistemas operativos, pero macOS 10.15 (Catalina) o versiones superiores son requeridas para ejecutar Electron v27.0.0 o superior.

Deprecado: ipcRenderer.sendTo()

La API de ipcRenderer.sendTo() es obsoleta. It should be replaced by setting up a MessageChannel between the renderers.

Las propiedades senderId y senderIsMainFrame de IpcRendererEvent también están obsoletas.

Eliminado: eventos de esquema de color en systemPreferences

Los siguientes eventos de systemPreferences han sido eliminados:

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

Use el nuevo evento updated en el módulo nativeTheme en su lugar.

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

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

Removed: Some window.setVibrancy options on macOS

The following vibrancy options have been removed:

  • 'claro'
  • 'medium-light'
  • 'oscuro'
  • 'ultra-dark'
  • 'appearance-based'

These were previously deprecated and have been removed by Apple in 10.15.

Eliminado: webContents.getPrinters

El método webContents.getPrinters ha sido eliminado. Use webContents.getPrintersAsync instead.

const w = new BrowserWindow({ show: false })

// Removed
console.log(w.webContents.getPrinters())
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers)
})

Eliminado: systemPreferences.{get,set}AppLevelAppearance y systemPreferences.appLevelAppearance

Los métodos de systemPreferences.getAppLevelAppearance y systemPreferences.setAppLevelAppearance han sido eliminados, al igual que la propiedad de systemPreferences.appLevelAppearance. Use the nativeTheme module instead.

// Removed
systemPreferences.getAppLevelAppearance()
// Replace with
nativeTheme.shouldUseDarkColors

// Removed
systemPreferences.appLevelAppearance
// Replace with
nativeTheme.shouldUseDarkColors

// Removed
systemPreferences.setAppLevelAppearance('dark')
// Replace with
nativeTheme.themeSource = 'dark'

Eliminado: valor alternate-selected-control-text para systemPreferences.getColor

El valor alternate-selected-control-text para systemPreferences.getColor ha sido eliminado. Use selected-content-background instead.

// Removed
systemPreferences.getColor('alternate-selected-control-text')
// Replace with
systemPreferences.getColor('selected-content-background')

Cambios en API Planeados (26.0)

Deprecado: webContents.getPrinters

El método webContents.getPrinters ha sido desaprobado. Use webContents.getPrintersAsync instead.

const w = new BrowserWindow({ show: false })

// Deprecated
console.log(w.webContents.getPrinters())
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers)
})

Deprecated: systemPreferences.{get,set}AppLevelAppearance and systemPreferences.appLevelAppearance

The systemPreferences.getAppLevelAppearance and systemPreferences.setAppLevelAppearance methods have been deprecated, as well as the systemPreferences.appLevelAppearance property. Use the nativeTheme module instead.

// Deprecated
systemPreferences.getAppLevelAppearance()
// Replace with
nativeTheme.shouldUseDarkColors

// Deprecated
systemPreferences.appLevelAppearance
// Replace with
nativeTheme.shouldUseDarkColors

// Deprecated
systemPreferences.setAppLevelAppearance('dark')
// Replace with
nativeTheme.themeSource = 'dark'

Deprecated: alternate-selected-control-text value for systemPreferences.getColor

The alternate-selected-control-text value for systemPreferences.getColor has been deprecated. Use selected-content-background instead.

// Deprecated
systemPreferences.getColor('alternate-selected-control-text')
// Replace with
systemPreferences.getColor('selected-content-background')

Cambios en API Planeados (25.0)

Deprecated: protocol.{un,}{register,intercept}{Buffer,String,Stream,File,Http}Protocol and protocol.isProtocol{Registered,Intercepted}

The protocol.register*Protocol and protocol.intercept*Protocol methods have been replaced with protocol.handle.

El nuevo método puede registrar un nuevo protocolo o interceptar un protocolo existente, y las respuestas pueden ser de cualquier tipo.

// Deprecated in Electron 25
protocol.registerBufferProtocol('some-protocol', () => {
callback({ mimeType: 'text/html', data: Buffer.from('<h5>Response</h5>') })
})

// Replace with
protocol.handle('some-protocol', () => {
return new Response(
Buffer.from('<h5>Response</h5>'), // Could also be a string or ReadableStream.
{ headers: { 'content-type': 'text/html' } }
)
})
// Deprecated in Electron 25
protocol.registerHttpProtocol('some-protocol', () => {
callback({ url: 'https://electronjs.org' })
})

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('https://electronjs.org')
})
// Deprecated in Electron 25
protocol.registerFileProtocol('some-protocol', () => {
callback({ filePath: '/path/to/my/file' })
})

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('file:///path/to/my/file')
})

Deprecado: BrowserWindow.setTrafficLightPosition(position)

BrowserWindow.setTrafficLightPosition(position) ahora es obsoleto, la API BrowserWindow.setWindowButtonPosition(position) debe ser usada en su lugar, la cual acepta null en vez de { x: 0, y: 0 } para restablecer la posición al valor predeterminado del sistema.

// Deprecated in Electron 25
win.setTrafficLightPosition({ x: 10, y: 10 })
win.setTrafficLightPosition({ x: 0, y: 0 })

// Replace with
win.setWindowButtonPosition({ x: 10, y: 10 })
win.setWindowButtonPosition(null)

Deprecado: BrowserWindow.getTrafficLightPosition()

BrowserWindow.getTrafficLightPosition() ahora es obsoleto, la API BrowserWindow.getWindowButtonPosition() debe ser usada en su lugar, la cual retorna null en vez de { x: 0, y: 0 } cuando no hay una posición personalizada.

// Deprecated in Electron 25
const pos = win.getTrafficLightPosition()
if (pos.x === 0 && pos.y === 0) {
// No custom position.
}

// Replace with
const ret = win.getWindowButtonPosition()
if (ret === null) {
// No custom position.
}

Cambios en API Planeados (24.0)

API modificada: nativeImage.createThumbnailFromPath(path, size)

The maxSize parameter has been changed to size to reflect that the size passed in will be the size the thumbnail created. Anteriormente, en Windows la imagen no se redimensionaba si era más pequeña que maxSize, y en macOS siempre se establecía el tamaño en maxSize. Behavior is now the same across platforms.

Comportamiento actualizado:

// a 128x128 image.
const imagePath = path.join('ruta', 'a', 'capybara.png')

// Escalando una imagen más pequeña.
const upSize = { width: 256, height: 256 }
nativeImage.createThumbnailFromPath(imagePath, upSize).then(result => {
console.log(result.getSize()) // { width: 256, height: 256 }
})

// Escalando una imagen más grande.
const downSize = { width: 64, height: 64 }
nativeImage.createThumbnailFromPath(imagePath, downSize).then(result => {
console.log(result.getSize()) // { width: 64, height: 64 }
})

Comportamiento previo (en Windows):

// una imagen de 128x128
const imagePath = path.join('ruta', 'a', 'capybara.png')
const size = { width: 256, height: 256 }
nativeImage.createThumbnailFromPath(imagePath, size).then(result => {
console.log(result.getSize()) // { width: 128, height: 128 }
})

Cambios Planeados en la API (23.0)

Comportamiento cambiado: Regiones arrastrables en macOS

La implementación de regiones arrastrables (usando la propiedad CSS -webkit-app-region: drag) ha cambiado en macOS para adaptarla a Windows y Linux. Anteriormente, cuando una región con -webkit-app-region: no-drag se traslapó con una región con -webkit-app-region: drag, la región no-drag siempre tendría prioridad en macOS, sin importar la capa CSS. Es decir, si una región drag estuviera por encima de una región de no-drag, sería ignorada. Comenzando en Electron 23, una región drag encima de una región no-drag hará que la región sea arrastrable.

Además, la propiedad customButtonsOnHover BrowserWindow previamente creó una región arrastrable que ignoró la propiedad CSS -webkit-app-region. Esto ha sido arreglado (ver #37210 para discusión).

Como resultado, si tu aplicación usa una ventana sin marco con regiones arrastrables en macOS, las regiones que son arrastrables en tu aplicación pueden cambiar en Electron 23.

Eliminado: Soporte para Windows 7 / 8 / 8.1

Windows 7, Windows 8 y Windows 8.1 ya no son compatibles. Electron sigue la política de deprecación de Chromium planificada, que deprecará el soporte para Windows 7 a partir de Chromium 109.

Las versiones más antiguas de Electron continuarán ejecutándose en estos sistemas operativos, pero se requerirá Windows 10 o posterior para ejecutar Electron v23.0.0 y superior.

Eliminado: eventos BrowserWindow scroll-touch-*

Los eventos deprecados de BrowserWindow scroll-touch-begin, scroll-touch-end y scroll-touch-edge han sido eliminados. Instead, use the newly available input-event event on WebContents.

// Eliminado en Electron 23.0
win.on('scroll-touch-begin', scrollTouchBegin)
win.on('scroll-touch-edge', scrollTouchEdge)
gana. n('scroll-touch-end', scrollTouchEnd)

// Reemplazar con
win.webContents.on('input-event', (_, event) => {
if (event. type === 'gestureScrollBegin') {
scrollTouchBegin()
} else if (event. type === 'gestureScrollUpdate') {
scrollTouchEdge()
} else if (event. type === 'gestureScrollEnd') {
scrollTouchEnd()
}
})

Eliminado: webContents.incrementCapturerCount(stayHidden, stayAwake)

El método webContents.incrementCapturerCount(stayHidden, stayAwake) ha sido eliminado. It is now automatically handled by webContents.capturePage when a page capture completes.

const w = new BrowserWindow({ show: false })

// Eliminado en Electron 23
w.webContents.incrementCapturerCount()
w.capturePage().then(image => {
console.log(image. oDataURL())
w.webContents.decrementCapturerCount()
})

// Reemplazar con
w.capturePage().then(image => {
console.log(image.toDataURL())
})

Eliminado: webContents.decrementCapturerCount(stayHidden, stayAwake)

El método webContents.decrementCapturerCount(stayHidden, stayAwake) ha sido eliminado. It is now automatically handled by webContents.capturePage when a page capture completes.

const w = new BrowserWindow({ show: false })

// Eliminado en Electron 23
w.webContents.incrementCapturerCount()
w.capturePage().then(image => {
console.log(image. oDataURL())
w.webContents.decrementCapturerCount()
})

// Reemplazar con
w.capturePage().then(image => {
console.log(image.toDataURL())
})

Cambios Planeados en la API (22.0)

Obsoleto: webContents.incrementCapturerCount(stayHidden, stayAwake)

webContents.incrementCapturerCount(stayHidden, stayAwake) has been deprecated. It is now automatically handled by webContents.capturePage when a page capture completes.

const w = new BrowserWindow({ show: false })

// Eliminado en Electron 23
w.webContents.incrementCapturerCount()
w.capturePage().then(image => {
console.log(image. oDataURL())
w.webContents.decrementCapturerCount()
})

// Reemplazar con
w.capturePage().then(image => {
console.log(image.toDataURL())
})

Obsoleto: webContents.decrementCapturerCount(stayHidden, stayAwake)

webContents.decrementCapturerCount(stayHidden, stayAwake) has been deprecated. It is now automatically handled by webContents.capturePage when a page capture completes.

const w = new BrowserWindow({ show: false })

// Eliminado en Electron 23
w.webContents.incrementCapturerCount()
w.capturePage().then(image => {
console.log(image. oDataURL())
w.webContents.decrementCapturerCount()
})

// Reemplazar con
w.capturePage().then(image => {
console.log(image.toDataURL())
})

Eliminado: evento new-window de Webcontens

El evento new-window de WebContents ha sido eliminado. It is replaced by webContents.setWindowOpenHandler().

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

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

Removed: <webview> new-window event

The new-window event of <webview> has been removed. There is no direct replacement.

// Removed in Electron 22
webview.addEventListener('new-window', (event) => {})
// Replace with

// main.js
mainWindow.webContents.on('did-attach-webview', (event, wc) => {
wc.setWindowOpenHandler((details) => {
mainWindow.webContents.send('webview-new-window', wc.id, details)
return { action: 'deny' }
})
})

// preload.js
const { ipcRenderer } = require('electron')
ipcRenderer.on('webview-new-window', (e, webContentsId, details) => {
console.log('webview-new-window', webContentsId, details)
document.getElementById('webview').dispatchEvent(new Event('new-window'))
})

// renderer.js
document.getElementById('webview').addEventListener('new-window', () => {
console.log('got new-window event')
})

Eliminado: eventos scroll-touch-* de BrowserWindow

Los eventos scroll-touch-begin, scroll-touch-end y scroll-touch-edge en BrowserWindow están deprecados. Instead, use the newly available input-event event on WebContents.

// Deprecado
win.on('scroll-touch-begin', scrollTouchBegin)
win.on('scroll-touch-edge', scrollTouchEdge)
gana. n('scroll-touch-end', scrollTouchEnd)

// Reemplazar con
win.webContents.on('input-event', (_, event) => {
if (event. type === 'gestureScrollBegin') {
scrollTouchBegin()
} else if (event. type === 'gestureScrollUpdate') {
scrollTouchEdge()
} else if (event. type === 'gestureScrollEnd') {
scrollTouchEnd()
}
})

Cambios Planeados en la API (21.0)

Comportamiento modificado: V8 Memory Cage habilitado

La memory cage V8 ha sido activada, lo que tiene implicancias para los módulos nativos que envuelven memoria no-V8 con ArrayBuffer o Buffer. See the blog post about the V8 memory cage for more details.

API modificada: webContents.printToPDF()

webContents.printToPDF() ha sido modificado para adaptarse a Page.printToPDF en el Protocolo de Chrome DevTools. Esto ha sido cambios para abordar los cambios originales que hicieron nuestra implementación anterior insostenible y plagada de errores.

Argumentos cambiados

  • pageRanges

Argumentos eliminados

  • printSelectionOnly
  • marginsType
  • headerFooter
  • scaleFactor

Argumentos agregados

  • headerTemplate
  • footerTemplate
  • displayHeaderFooter
  • márgenes
  • scale
  • preferCSSPageSize
// Proceso principal
const { webContents } = require('electron')

webContents.printToPDF({
landscape: true, // horizontal
displayHeaderFooter: true, // mostrar encabezado y pie de página
printBackground: true, // imprimir fondo
scale: 2, // escala
pageSize: 'Ledger', // tamaño de página
margins: { // márgenes
top: 2, // superior
bottom: 2, // inferior
left: 2, // izquierdo
right: 2 // derecho
},
pageRanges: '1-5, 8, 11-13', // rangos de páginas
headerTemplate: '<h1>Título</h1>', // plantilla de encabezado
footerTemplate: '<div><span class="pageNumber"></span></div>', // plantilla de pie de página
preferCSSPageSize: true // tamaño de página CSS preferido
}).then(data => {
fs.writeFile(pdfPath, data, (error) => {
if (error) throw error
console.log(`El archivo PDF se escribió correctamente en ${pdfPath}`)
})
}).catch(error => {
console.log(`No se pudo escribir el archivo PDF en ${pdfPath}: `, error)
})

Cambios Planeados en la API (20.0)

Eliminado: soporte para macOS 10.11 / 10.12

macOS 10.11 (El Capitan) y macOS 10.12 (Sierra) ya no son compatibles con Chromium.

Las versiones antiguas de Electron seguirán funcionando en estos sistemas operativos, pero macOS 10.13 (High Sierra) o posterior será requerido para ejecutar Electron v20.0.0 y versiones posteriores.

Default Changed: renderers without nodeIntegration: true are sandboxed by default

Anteriormente, los renderers que especificaban un script de precarga tenían por defecto el no estar aislados del sandbox. This meant that by default, preload scripts had access to Node.js. En Electron 20, este comportamiento ha cambiado. A partir de Electron 20, los renderizadores estarán en sandbox por defecto, a menos que se especifique nodeIntegration: true o sandbox: false.

If your preload scripts do not depend on Node, no action is needed. Si tus scripts de precarga dependen de Node, o bien reestructúralos para eliminar el uso de Node desde el proceso de renderizado, o especifica explícitamente sandbox: false para los procesos de renderizado relevantes.

Eliminado: skipTaskbar en Linux

En X11, skipTaskbar envía un mensaje _NET_WM_STATE_SKIP_TASKBAR al gestor de ventanas X11. No hay un equivalente directo para Wayland, y los conocidos soluciones alternativas tienen intercambios inaceptables (por ejemplo, Window.is_skip_taskbar en GNOME requiere modo inseguro), por lo que Electron no puede admitir esta función en Linux.

API cambiada: session.setDevicePermissionHandler(handler)

El manejador invocado cuando se utiliza session.setDevicePermissionHandler(handler) ha cambiado sus argumentos. This handler no longer is passed a frame WebFrameMain, but instead is passed the origin, which is the origin that is checking for device permission.

Cambios Planeados en la API (19.0)

Elimnado: IA32 Binarios Linux

Esto es un resultado de Chromium 102.0.4999.0 que soporte a Linux IA32. Esto concluye el soporte de Linux IA32 .

Cambios Planeados en la API (18.0)

Eliminada: nativeWindowOpen

Antes de Electron 15, window.open estaba relucido de usar BrowserWindowProxy por defecto. This meant that window.open('about:blank') did not work to open synchronously scriptable child windows, among other incompatibilities. Since Electron 15, nativeWindowOpen has been enabled by default.

See the documentation for window.open in Electron for more details.

Cambios Planeados en la API (17.0)

Eliminado: desktopCapturer.getSources en el renderizador

La API desktopCapturer.getSources ahora sólo esta disponible en el proceso principal. Esto a sido cambiado para mejorar la seguridad por defecto de las aplicaciones Electron.

Si necesitas esta funcionalidad, puede ser reemplazado de la siguiente manera:

// Proceso principal
const { ipcMain, desktopCapturer } = require('electron')

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

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

Sin embargo, es recomendable que restrinjas aún más la información que se devuelve al proceso de renderizado; por ejemplo, mostrando un selector de fuente al usuario y solo devolviendo la fuente seleccionada.

Deprecado: nativeWindowOpen

Antes de Electron 15, window.open estaba relucido de usar BrowserWindowProxy por defecto. This meant that window.open('about:blank') did not work to open synchronously scriptable child windows, among other incompatibilities. Since Electron 15, nativeWindowOpen has been enabled by default.

See the documentation for window.open in Electron for more details.

Cambios Planeados en la API (16.0)

Behavior Changed: crashReporter implementation switched to Crashpad on Linux

La implementación subyacente de la API crashReporter en Linux ha cambiado de Breakpad a Crashpad, lo que la pone en línea con Windows y Mac. Como resultado de este cambio, los procesos secundarios ahora son monitoreados automáticamente, y llamar a process.crashReporter.start en procesos secundarios de Node ya no es necesario (y no es recomendable, ya que iniciará una segunda instancia del reportero de Crashpad).

Hay algunos cambios sutiles en la forma en que se informarán las anotaciones en Linux, incluyendo que los valores largos ya no se dividirán entre anotaciones agregadas con __1, __2, etc., sino que se truncarán en el nuevo límite de valor de anotación (más largo).

Deprecado: desktopCapturer.getSources en el proceso de renderizado

El uso de la API desktopCapturer.getSources en el proceso de renderer ha sido deprecado y será eliminado. Este cambio va a mejorar la seguridad de los apps Electron predefinidos.

Consulte aquí para más detalles sobre como reemplazar esta API en tu aplicación.

Cambios en API Planeados (15.0)

Valor por defecto modificado: nativeWindowOpen por defecto a true

Antes de Electron 15, window.open estaba relucido de usar BrowserWindowProxy por defecto. This meant that window.open('about:blank') did not work to open synchronously scriptable child windows, among other incompatibilities. nativeWindowOpen is no longer experimental, and is now the default.

See the documentation for window.open in Electron for more details.

Deprecado: app.runningUnderRosettaTranslation

The app.runningUnderRosettaTranslation property has been deprecated. Use app.runningUnderARM64Translation instead.

// Deprecated
console.log(app.runningUnderRosettaTranslation)
// Replace with
console.log(app.runningUnderARM64Translation)

Cambios Planeados en la API (14.0)

Eliminado: módulo remote

El módulo remote fue desaprobado en Electron 12, y será eliminado en Electron 14. Es reemplazado por el módulo @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()

Eliminada: app.allowRendererProcessReuse

La propiedad app.allowRendererProcessReuse se eliminará como parte de nuestro plan para alinearnos más estrechamente con el modelo de proceso de Chromium para la seguridad, el rendimiento y la capacidad de mantenimiento.

Para información más detallada vea #18397.

Eliminado: Browser Window Affinity

La opción affinity al construir una nueva BrowserWindow se eliminará como parte de nuestro plan para alinear más estrechamente con el modelo de proceso de Chromium por seguridad, rendimiento y mantenimiento.

Para información más detallada vea #18397.

API modificada: window.open()

El parámetro opcional frameName ya no se establecerá como el título de la ventana. Esto ahora sigue la especificación descrita por la documentación nativa bajo el correspondiente parámetro windowName.

If you were using this parameter to set the title of a window, you can instead use win.setTitle(title).

Eliminado: worldSafeExecuteJavaScript

En Electron 14 worldSafeExecuteJavaScript será eliminado. No hay alternativa, por favor asegúrese que su código trabaja con esta propiedad activada. Ha sido activada por defecto desde Electron 12.

Será afectado por este cambio si usted utliza webFrame.executeJavaScript o webFrame.executeJavaScriptInIsolatedWorld. You will need to ensure that values returned by either of those methods are supported by the Context Bridge API as these methods use the same value passing semantics.

Eliminado: BrowserWindowConstructorOptions que hereda desde las ventanas padres

Prior to Electron 14, windows opened with window.open would inherit BrowserWindow constructor options such as transparent and resizable from their parent window. A partir de Electron 14, este comportamiento se ha eliminado, y las ventanas no heredarán ninguna opción de constructor BrowserWindow de sus padres.

Instead, explicitly set options for the new window with setWindowOpenHandler:

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

Eliminada: additionalFeatures

The deprecated additionalFeatures property in the new-window and did-create-window events of WebContents has been removed. Since new-window uses positional arguments, the argument is still present, but will always be the empty array []. (Sin embargo, cabe destacar que el evento new-window en sí está obsoleto y ha sido reemplazado por setWindowOpenHandler.) Bare keys in window features will now present as keys with the value true in the options object.

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

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

Cambios Planeados en la API (13.0)

API modificada: session.setPermissionCheckHandler(handler)

El primer parámetro de los métodos handler anteriormente siempre era un webContents, ahora puede ser a veces null. Debe usar las propiedades requestingOrigin, embeddingOrigin y securityOrigin para responder correctamente a la verificación de permiso. Como el webContents puede ser null ya no se puede confiar en él.

// 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
})

Eliminado: shell.moveItemToTrash()

Se ha eliminado la API síncrona shell.moveItemToTrash() obsoleta. Utilice en su lugar shell.trashItem().

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

Eliminado: APIs de extensión BrowserWindow

La APIs de extensión han sido eliminadas:

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

En su lugar use las APIs de session:

  • 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()

Eliminado: métodos en systemPreferences

Los métodos siguientes de systemPreferences han quedado obsoletos:

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

En su lugar, usa las siguientes propiedades 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

En desuso: evento Webcontens nueva ventana

El evento new-window de WebContents está obsoleto. It is replaced by webContents.setWindowOpenHandler().

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

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

Cambios Planeados en la API (12.0)

Eliminado: Soporte de Pepper Flash

Chromium a eliminado el soporte para Flash, por lo tanto nosotros debemos seguir el ejemplo. Vea el Flash Roadmap de Chromium para más detalles.

Valor por defecto moidificado: worldSafeExecuteJavaScript por defecto a true

En Electron 12, worldSafeExecuteJavaScript será activado por defecto. Para restuaurar el comportamiento anterior, worldSafeExecuteJavaScript: false debe especificarse en WebPreferences. Por favor tenga en cuenta que estableciendo esta opción a false es inseguro.

Esta opción sera removida en Electron 14, así que por favor migra tu código para soportar el valor por defecto.

Valor por defecto modificado: contextIsolation por defecto a true

En Electron 12, contextIsolation será activado por defecto. Para restaurar el comportamiento anterior contextIsolation: false debe ser especificado en WebPreferences.

We recommend having contextIsolation enabled for the security of your application.

Otra implicación es que require() no puede ser usada en el renderer process a menos que nodeIntegration sea true y contextIsolation sea false.

Para más detalles ver: https://github.com/electron/electron/issues/23506

Eliminado: crashReporter.getCrashesDirectory()

El método crashReporter.getCrashesDirectory ha sido eliminado. Uso debe ser reemplazado por app.getPath('crashDumps').

// Eliminado en Electron 12
crashReporter.getCrashesDirectory()
// Reeamplazar con
app.getPath('crashDumps')

Eliminado: métodos crashReporter en el render process

Los siguientes métodos crashReporter ya no están disponible en el renderer process:

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

Deberían ser llamados solo desde el proceso principal.

Vea #23265 para más detalles.

Valor por defecto modificado: crashReporter.start({ compress: true })

El valor por defecto de la opción compress a crashReporter.start ha cambiado de false a true. Esto significa que los volcados se subirán al servidor de ingestión de errores con el encabezado Content-Encoding: gzip y el cuerpo será comprimido.

Si su servidor de gestión de fallos no soporta cargas comprimidas, puedes desactivar la compresión especificando { compress: false } en las opciones del reportero de errores .

Obsoleto: módulo remote

El módulo remote está obsoleto en Electron 12 y sera eliminado en Electron 14. Es reemplazado por el módulo @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()

Obsoleto: shell.moveItemToTrash()

El síncrono shell.moveItemToTrash() ha sido reemplazado por el nuevo asíncrono shell.trashItem().

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

Cambios en API Planeados (11.0)

Eliminado: BrowserView.{destroy, fromId, fromWebContents, getAllViews} y id propiedad de BrowserView

Las APIs experimentales BrowserView.{destroy, fromId, fromWebContents, getAllViews} fueron removidas. Adicionalmente, la propiedad id de BrowserView también ha sido removida.

Para ver más información, consulta #23578.

Cambios Planeados en la API (10.0)

Desaprobado: argumento companyName para crashReporter.start()

El argumento companyName para crashReporter.start(), que era previamente requerido, ahora es opcional, y aún más, está desaprobado. Para obtener el mismo comportamiento de una forma no desaprobada, pude pasar un valor companyName en globalExtra.

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

Obsoleto: crashReporter.getCrashesDirectory()

El método crashReporter.getCrashesDirectory ha sido desaprobado. Uso debe ser reemplazado por app.getPath('crashDumps').

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

Obsoleto: los métodos crashReporter en el renderer process

Llamar a los siguientes métodos crashReporter desde el renderer process es obsoleto:

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

Los únicos métodos no desaprobados restantes en el modulo crashReporter en el render son addExtraParameter, removeExtraParameter y getParameters.

Todos los métodos anteriores permanecen no desaprobados cuando son llamados desde el proceso principal.

Vea #23265 para más detalles.

Obsoleto: crashReporter.start({ compress: false })

Establecer { compress: false } en crashReporter.start está obsoleto. Casi todos los servidores de gestión de fallos soportan compresión gzip. Esta opción será eliminada en una versión futura de Electron.

Valor por defecto modificado: enableRemoteModule por defecto a false

En Electron 9, usar el módulo remoto sin habilitarlo explícitamente a través de la opción enableRemoteModule WebPreferences comenzó a emitir una advertencia. En Electron 10, el módulo remote está deshabilitado por defecto. Para usar el módulo remote debe especificarse enableRemoteModule: true en WebPreferences:

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

We recommend moving away from the remote module.

protocol.unregisterProtocol

protocol.uninterceptProtocol

Las APIs ahora son síncronas y el callback opcional ya no es necesario.

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

protocol.registerFileProtocol

protocol.registerBufferProtocol

protocol.registerStringProtocol

protocol.registerHttpProtocol

protocol.registerStreamProtocol

protocol.interceptFileProtocol

protocol.interceptStringProtocol

protocol.interceptStringProtocol

protocol.interceptHttpProtocol

protocol.interceptStreamProtocol

Las APIs ahora son síncronas y el callback opcional ya no es necesario.

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

El protocolo registrado o interceptado no tiene efecto en la página actual hasta que ocurra la navegación.

protocol.isProtocolHandled

Esta API está obsoleta y los usuarios deberían usar protocol.isProtocolRegistered y protocol.isProtocolIntercepted en su lugar.

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

Cambios Planeados en la API (9.0)

Valor por defecto modificado: La carga de módulos nativos sin contexto conscientes en el proceso renderer está desactivada por defecto

A partir de Electron 9 no permitimos la carga de módulos nativos no conscientes del contexto en el proceso de renderizado. Esto es para mejorar la seguridad, el rendimiento y el mantenimiento de Electron como proyecto.

Si esto te impacta, puedes configurar de forma temporal app.allowRendererProcessReuse a false para revertir el comportamiento antiguo. Esta marca solo será una opción hasta Electron 11 y deberías planear actualizar tus módulos nativos para que sean conscientes del contexto.

Para información más detallada vea #18397.

Obsoleto: APIs de extensión BrowserWindow

Las siguientes APIs de extensión han sido marcadas como obsoletas:

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

En su lugar use las APIs de session:

  • 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()

Eliminado: <webview>.getWebContents()

Esta API la cual fue marcada como obsoleta en Electron 8.0, ahora es eliminada.

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

Eliminada: webFrame.setLayoutZoomLevelLimits()

Chromium ha eliminado el soporte para cambiar los limites del nivel de zoom del diseño y esta más allá de la capacidad de Electron el mantenerlo. La función fue marcada como obsoleta en Electron 8.x, y ha sido eliminada en Electron 9.x. Los niveles de zoom limites ahora están fijados a un mínimo de 0.25 y un máximo de 5.0, como se define aquí.

Comportamiento Modificado: Enviando objetos no JS sobre IPC ahora lanza una excepción

En Electron 8.0, el IPC se cambió para que utilizara el algoritmo de clon estructurado, con importantes mejoras de rendimiento. Para ayudar a aliviar la transición, el antiguo algoritmo de serialización de IPC se mantuvo y se usó para algunos objetos que no son serializables con un clon estructurado. En particular, los objetos DOM (por ejemplo, Element, Location y DOMMatrix), objetos Node.js respaldados por clases C++ (por ejemplo, process.env, algunos miembros de Stream), y objetos Electron respaldados por clases C++ (por ejemplo, WebContents, BrowserWindow y WebFrame) no son serializables con Structured Clone. Siempre que se invocaba el algoritmo anterior, se imprimía una advertencia de desaprobación.

En Electron 9,0, se eliminó el algoritmo de serialización anterior, y enviar tales objetos no serializables ahora lanzará un error "no se pudo clonar el objeto".

API Modificada: shell.openItem ahora es shell.openPath

La API shell.openItem ha sido reemplazada con una API asíncrona shell.openPath. Puede ver el la propuesta y lógica original la API aquí.

Cambios en API Planeados (8.0)

Comportamiento Cambiado: Los valores enviados sobre IPC ahora son serializados con Algoritmo de Clon Estructurado

The algorithm used to serialize objects sent over IPC (through ipcRenderer.send, ipcRenderer.sendSync, WebContents.send and related methods) has been switched from a custom algorithm to V8's built-in Structured Clone Algorithm, the same algorithm used to serialize messages for postMessage. This brings about a 2x performance improvement for large messages, but also brings some breaking changes in behavior.

  • Enviar Functions, Promises, WeakMaps, WeakSets, o objetos que contengan tales valores sobre IPC no lanzará ninguna excepción, en lugar de convertir las funciones a 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 y -Infinity ahora serán correctamente serializados en lugar de ser convertidos a null.
  • Los objectos que contengan referencias cíclicas ahora serán correctamente serializados en lugar de ser convertidos a null.
  • Los valores Set, Map, Error y RegExp ahora serán correctamente serializados en lugar de ser convertidos a {}.
  • Los valores BigInt ahora serán correctamente serializados en lugar de ser convertidos a null.
  • Las matrices dispersas se serializarán como tales, en lugar de convertirse en matrices densas con nulls.
  • Los objetos Date serán transferidos como objetos Date, en lugar de ser convertidos en su representación de cadena ISO.
  • Los Arrays con tipo (tales como Uint8Array, Uint16Array, Uint32Array y así sucesivamente) serán transferidas como tales, en lugar de ser convertida a Node.js Buffer.
  • Los objetos Node.js Buffer serán transferidos como Uint8Arrays. Puedes convertir un Uint8Array de nuevo a un Node.js Buffer envolviendo el ArrayBuffer subyacente:
Buffer.from(value.buffer, value.byteOffset, value.byteLength)

Enviar objetos que no son de tipos nativos de JS, tales como objetos DOM (p.ej. Element, Location, DOMMatrix),objetos Node.js (p.ej. process.env, Stream), u objetos Electron (p.ej. WebContents, BrowserWindow, WebFrame) es obsoleto. En Electron 8, estos objetos serán serializados como antes con un mensaje DeprecationWarning, pero a partir de Electron 9, enviar estos tipos de objetos lanzará un error 'could not be cloned'.

Obsoleto: <webview>.getWebContents()

Esta API está implementada usando el módulo remote, el cual tiene implicaciones de rendimiento y seguridad. Por lo tanto, su uso debe ser explícito.

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

Sin embargo, es recomendado evitar el uso por completo del modulo 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())

Obsoleto: webFrame.setLayoutZoomLevelLimits()

Chromium ha eliminado el soporte para cambiar los limites del nivel de zoom del diseño y esta más allá de la capacidad de Electron el mantenerlo. La función emitirá una advertencia en Electron 8.x, y dejará de existir en Electron 9.x. Los niveles de zoom limites ahora están fijados a un mínimo de 0.25 y un máximo de 5.0, como se define aquí.

Eventos obsoletos en systemPreferences

Los siguientes eventos systemPreferences han sido marcados como obsoletos:

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

Use el nuevo evento updated en el módulo nativeTheme en su lugar.

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

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

Obsoleto: métodos en systemPreferences

Los métodos siguientes de systemPreferences han quedado obsoletos:

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

En su lugar, usa las siguientes propiedades nativeTheme:

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

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

Cambios Planeados en la API (7.0)

Obsoleto: Atom.io Node Headers URL

Este es el URL especificado como disturl en un archivo .npmrc o como el comando de linea --dist-url al construir los módulos nativos de nodo. Ambos serán admitidos para el futuro previsible, pero se recomienda que cambies.

Obsoleto: https://atom.io/download/electron

Reemplazar con: https://electronjs.org/headers

API Modificada: session.clearAuthCache() ya no acepta opciones

La API session.clearAuthCache ya no acepta opciones de que limpiar y en su lugar incondicionalmente limpia la cache entera.

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

API Modificada: powerMonitor.querySystemIdleState ahora es powerMonitor.getSystemIdleState

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

API Modificada: powerMonitor.querySystemIdleTime ahora es powerMonitor.getSystemIdleTime

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

API Modificada: webFrame.setIsolatedWorldInfo reemplaza métodos separados

// 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'
})

Eliminado: propiedad marked en getBlinkMemoryInfo

Esta propiedad fue eliminada en Chromium 77, y como tal ya no está disponible.

Comportamiento Cambiado: atributo webkitdirectory a <input type="file"/> ahora lista el contenido del directorio

La propiedad webkitdirectory en las entradas de archivos HTML les permite seleccionar carpetas. Las versiones anteriores de Electron tenían una implementación incorrecta donde la entrada de event.target.files retornaba un FileList que retornaba un File correspondiente a la carpeta seleccionada.

A partir de Electron 7, esa FileList ahora es una lista de todos los archivos contenidos dentro de la carpeta, similar a Chrome, Firefox y Edge (enlace a la documentación de MDN).

Como una ilustración, toma una carpeta con esta estructura:

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

En Electron <=6, esto debería retornar un FileList con un objeto File para:

path/to/folder

En Electron 7, esto ahora retorna un FileList con un objeto File para:

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

Tenga en cuenta que webkitdirectory ya no expone la ruta de la carpeta seleccionada. If you require the path to the selected folder rather than the folder contents, see the dialog.showOpenDialog API (link).

API Modificada: Versiones basadas en Callback de APIs promisificadas

Electron 5 y Electron 6 introdujeron versiones basadas en Promise de las API asíncornas existentes y desaprobaron sus contrapartes antiguas basadas en callback. En Electron 7, todas las APIs desaprobadas basadas en callback ahora están eliminadas.

Estas funciones ahora sólo devuelven 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

These functions now have two forms, synchronous and Promise-based asynchronous:

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

Cambios Planeados en la API (6.0)

API Modificada: win.setMenu(null) ahora es win.removeMenu()

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

API Modificada: electron.screen en el proceso renderer debe ser accedido a través de remote

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

API Modificada: require() los ing integrados de node builtins en renderizadores sandboxed no carga más de forma implícita la versión 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')

Obsoleto: powerMonitor.querySystemIdleState reemplazar con powerMonitor.getSystemIdleState

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

Obsoleto: powerMonitor.querySystemIdleTime reemplazado con powerMonitor.getSystemIdleTime

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

Obsoleto: app.enableMixedSandbox() ya no es necesario

// Deprecated
app.enableMixedSandbox()

El modo Mixed-sandox ahora está activado por defecto.

Obsoleto: Tray.setHighlightMode

Bajo macOS Catalina nuestra implementación Tray se rompe. El sustituto nativo de Apple no soporta cambiar el comportamiento de resaltado.

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

Cambios Planeados en la API (5.0)

Valor por defecto modificado: nodeIntegration y webviewTag por defecto a false, contextIsolation por defecto a true

Los siguientes valores por defectos de opción webPreferences están obsoletos a favor de los nuevos valores por defectos listados a continuación.

PropiedadValor obsoletoEl valor por defecto nuevo
contextIsolationfalsetrue
nodeIntegrationtruefalse
webviewTagnodeIntegration if set else truefalse

P.e. Volver a habilitar el webviewTag

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

Comportamiento Modificado: nodeIntegration en ventanas hijas abiertas a través de nativeWindowOpen

Las ventanas secundarias abiertas con la opción nativeWindowOpen tendrán siempre la integración de Node.js desactivada, a menos que nodeIntegrationInSubFrames sea true.

API Modificada: El registro de esquemas privilegiados ahora debe hacerse antes de que la aplicación este lista

Se han eliminado las APIs del proceso Renderer webFrame.registerURLSchemeAsPrivileged y webFrame.registerURLSchemeAsBypassingCSP, así como la API del proceso del navegador protocol.registerStandardSchemes. Una nueva API, protocol.registerSchemesAsPrivileged ha sido agregada y debe ser usada para registrar esquemas personalizados con los privilegios requeridos. Se requieren esquemas personalizados para ser registrados antes de que la aplicación esté lista.

Obsoleto: webFrame.setIsolatedWorld* reemplazado con 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 Modificada: webFrame.setSpellCheckProvider ahora toma un callbak asíncrono

El callback spellCheck ahora es asíncrono, y el parametro autoCorrectWord ha sido eliminado.

// 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 Modificada: webContents.getZoomLevel y webContents.getZoomFactor ahora son síncrono

webContents.getZoomLevel y webContents.getZoomFactor ya no toman parámetros callback, en su lugar devuelven directamente sus valores numéricos.

// 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)

Cambios planeados en la API(4.0)

La siguiente lista incluye cambios efectuados en la API 4.0 de Electrón.

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

Cuando se construye módulos nativos para windows, la variable win_delay_load_hook del módulo binding.gyp debe ser true (el cual es por defecto). Si este hook no esta presente, luego el módulo nativo va a fallar al cargar en Windows, con un mensaje de error como Cannot find module. See the native module guide for more.

Eliminado: soporte de Linux IA32

Electron 18 ya no se ejecutará en sistemas Linux de 32 bits. Para más información, consulta la discontinuación del soporte para Linux de 32 bits.

Cambios en la API(3.0)

La siguiente lista incluye cambios efectuados en la API 3.0 de Electrón.

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

// Cambiar
clipboard.readRtf()
// Reemplazar con
clipboard.readRTF()

// Cambiar
clipboard.writeRtf()
// Reemplazar con
clipboard.writeRTF()

// Cambiar
clipboard.readHtml()
// Reemplazar con
clipboard.readHTML()

// Cambiar
clipboard.writeHtml()
// Reemplazar con
clipboard.writeHTML()

crashReporter

// Cambiar
crashReporter.start({
companyName: 'Crashly',
submitURL: 'https://crash.server.com',
autoSubmit: true
})
// Reemplazar con
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

// Cambiar
tray.setHighlightMode(true)
// Reemplazar con
tray.setHighlightMode('on')

// Cambiar
tray.setHighlightMode(false)
// Reemplazar con
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 de cabecera de nodo

Este es el URL especificado como disturl en un archivo .npmrc o como el comando de linea --dist-url al construir los módulos nativos de nodo.

Cambiar: https://atom.io/download/atom-shell

Reemplazar con: https://atom.io/download/electron

Cambios en la API(2.0)

La siguiente lista incluye cambios efectuados en la API 2.0 de Electrón.

BrowserWindow

// Deprecated
const optionsA = { titleBarStyle: 'hidden-inset' }
const windowA = new BrowserWindow(optionsA)
// Replace with
const optionsB = { titleBarStyle: 'hiddenInset' }
const windowB = new BrowserWindow(optionsB)
// 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

  • Versión de procesos de Electron y Versión de procesos de Chrome Serán propiedades de solo lectura para la consistencia con otras propiedades de process.versions configuradas por 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)

Duplicado de brazo ARM

Cada versión de Electrón incluye dos versiones de ARM idénticas con diferentes nombres de archivo, como: electron-v1.7.3-linux-arm.zip y electron-v1.7.3-linux-armv7l.zip. Se agregó el archivo con el prefijo v7l para aclarar a los usuarios qué versión de ARM soporta y desambiguar los futuros archivos de armv6l y arm64 que pueden ser producidos.

El archivo sin el prefijo todavía se está publicando para evitar romper cualquier configuración que pueda estar consumiéndolo. A partir de 2.0, el archivo sin prefijo ya no será publicado.

Para más detalles, vea: 6986 y 7189.