Restaurar archivos borrados
Los cambios de ruptura se documentaran aquí y se agregaran advertencias de desaprobación al código JS cuando sea posible, al menos una versión superior se publicará, antes de que se realice cualquier cambio.
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.
Planned Breaking API Changes (20.0)
Default Changed: renderers without nodeIntegration: true
are sandboxed by default
Previously, renderers that specified a preload script defaulted to being unsandboxed. This meant that by default, preload scripts had access to Node.js. En Electron 20, este comportamiento ha cambiado. Beginning in Electron 20, renderers will be sandboxed by default, unless nodeIntegration: true
or sandbox: false
is specified.
If your preload scripts do not depend on Node, no action is needed. If your preload scripts do depend on Node, either refactor them to remove Node usage from the renderer, or explicitly specify sandbox: false
for the relevant renderers.
Eliminado: skipTaskbar
en Linux
On X11, skipTaskbar
sends a _NET_WM_STATE_SKIP_TASKBAR
message to the X11 window manager. There is not a direct equivalent for Wayland, and the known workarounds have unacceptable tradeoffs (e.g. Window.is_skip_taskbar in GNOME requires unsafe mode), so Electron is unable to support this feature on Linux.
Planned Breaking API Changes (19.0)
None (yet)
Planned Breaking API Changes (18.0)
Eliminada: nativeWindowOpen
Prior to Electron 15, window.open
was by default shimmed to use BrowserWindowProxy
. 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.
Planned Breaking API Changes (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)
}
However, you should consider further restricting the information returned to the renderer; for instance, displaying a source selector to the user and only returning the selected source.
Deprecated: nativeWindowOpen
Prior to Electron 15, window.open
was by default shimmed to use BrowserWindowProxy
. 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.
Planned Breaking API Changes (16.0)
Behavior Changed: crashReporter
implementation switched to Crashpad on Linux
The underlying implementation of the crashReporter
API on Linux has changed from Breakpad to Crashpad, bringing it in line with Windows and Mac. As a result of this, child processes are now automatically monitored, and calling process.crashReporter.start
in Node child processes is no longer needed (and is not advisable, as it will start a second instance of the Crashpad reporter).
There are also some subtle changes to how annotations will be reported on Linux, including that long values will no longer be split between annotations appended with __1
, __2
and so on, and instead will be truncated at the (new, longer) annotation value limit.
Deprecated: desktopCapturer.getSources
in the renderer
Usage of the desktopCapturer.getSources
API in the renderer has been deprecated and will be removed. This change improves the default security of Electron apps.
Consulte aquí para más detalles sobre como reemplazar esta API en tu aplicación.
Planned Breaking API Changes (15.0)
Valor por defecto modificado: nativeWindowOpen
por defecto a true
Prior to Electron 15, window.open
was by default shimmed to use BrowserWindowProxy
. 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.
Planned Breaking API Changes (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. Beginning with Electron 14, this behavior is removed, and windows will not inherit any BrowserWindow constructor options from their parents.
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 []
. (Though note, the new-window
event itself is deprecated, and is replaced by 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')) {
// ...
}
})
// Replace with
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()
// Eliminado en Electron 13
BrowserWindow.addExtension(path)
BrowserWindow.addDevToolsExtension(path)
// Reemplazar con
session.defaultSession.loadExtension(path)
// Eliminado en Electron 13
BrowserWindow.removeExtension(name)
BrowserWindow.removeDevToolsExtension(name)
// Reemplazar con
session.defaultSession.removeExtension(extension_id)
// Eliminado en Electron 13
BrowserWindow.getExtensions()
BrowserWindow.getDevToolsExtensions()
// Reemplazar con
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. Es reemplazado por 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.
Nosotros recomendamos tener contextIsolation activado por la seguridad de su aplicación.
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 Planeados en la API (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
.
// Desaprobado en Electron 10
crashReporter.start({ companyName: 'Umbrella Corporation' })
// Reemplazar con
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')
.
// Obsoleto en Electron 10
crashReporter.getCrashesDirectory()
// Reemplazar con
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
}
})
Nosotros recomendamos alejarse del módulo remote.
protocol.unregisterProtocol
protocol.uninterceptProtocol
Las APIs ahora son síncronas y el callback opcional ya no es necesario.
// Obsoleto
protocol.unregisterProtocol(scheme, () => { /* ... */ })
// Reemplazar con
protocol.unregisterProtocol(scheme)
protocol.registerFileProtocol
protocol.registerBufferProtocol
protocol.registerStringProtocol
protocol.registerHttpProtocol
protocol.registerStreamProtocol
protocol.interceptFileProtocol
protocol.interceptStringProtocol
protocol.interceptBufferProtocol
protocol.interceptHttpProtocol
protocol.interceptStreamProtocol
Las APIs ahora son síncronas y el callback opcional ya no es necesario.
// Obsoleto
protocol.registerFileProtocol(scheme, handler, () => { /* ... */ })
// Reemplazar con
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.
// Obsoleto
protocol.isProtocolHandled(scheme).then(() => { /* ... */ })
// Reemplazar con
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()
// Obsoleto en Electron 9
BrowserWindow.addExtension(path)
BrowserWindow.addDevToolsExtension(path)
// Reemplazar con
session.defaultSession.loadExtension(path)
// Obsoleto en Electron 9
BrowserWindow.removeExtension(name)
BrowserWindow.removeDevToolsExtension(name)
// Reemplazar con
session.defaultSession.removeExtension(extension_id)
// Obsoleto en Electron 9
BrowserWindow.getExtensions()
BrowserWindow.getDevToolsExtensions()
// Reemplazar con
session.defaultSession.getAllExtensions()
Eliminado: <webview>.getWebContents()
Esta API la cual fue marcada como obsoleta en Electron 8.0, ahora es eliminada.
// Eliminado en Electron 9.0
webview.getWebContents()
// Reemplazar con
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. In particular, DOM objects (e.g. Element
, Location
and DOMMatrix
), Node.js objects backed by C++ classes (e.g. process.env
, some members of Stream
), and Electron objects backed by C++ classes (e.g. WebContents
, BrowserWindow
and WebFrame
) are not serializable with 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 Planeados en la API (8.0)
Comportamiento Cambiado: Los valores enviados sobre IPC ahora son serializados con Algoritmo de Clon Estructurado
El algoritmo usado para serializar los objetos enviados sobre IPC (mediante ipcRenderer.send
, ipcRenderer.sendSync
, WebContents.send
y métodos relacionados) han sido cambiados de un algoritmo personalizado a los de V8 Structured Clone Algorithm, el mismo algoritmo usado para serializar los mensajes para postMessage
. Esto conlleva una mejora en el rendimiento de 2x para mensajes grandes, pero también trae algunos cambios de comportamiento.
- 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
.
// Anteriormente:
ipcRenderer.send('channel', { value: 3, someFunction: () => {} })
// => results in { value: 3 } arriving in the main process
// Desde 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 anull
.- Los objectos que contengan referencias cíclicas ahora serán correctamente serializados en lugar de ser convertidos a
null
. - Los valores
Set
,Map
,Error
yRegExp
ahora serán correctamente serializados en lugar de ser convertidos a{}
. - Los valores
BigInt
ahora serán correctamente serializados en lugar de ser convertidos anull
. - Las matrices dispersas se serializarán como tales, en lugar de convertirse en matrices densas con
null
s. - Los objetos
Date
serán transferidos como objetosDate
, 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.jsBuffer
. - Los objetos Node.js
Buffer
serán transferidos comoUint8Array
s. Puedes convertir unUint8Array
de nuevo a un Node.jsBuffer
envolviendo elArrayBuffer
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
, que tiene implicaciones de rendimiento y seguridad. Por lo tanto, su uso debe ser explícito.
// Obsoleto
webview.getWebContents()
// Reemplazar con
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.
// Obsoleto
systemPreferences.on('inverted-color-scheme-changed', () => { /* ... */ })
systemPreferences.on('high-contrast-color-scheme-changed', () => { /* ... */ })
// Reemplazar con
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
// Obsoleto
systemPreferences.isDarkMode()
// Reemplazar con
nativeTheme.shouldUseDarkColors
// Obsoleto
systemPreferences.isInvertedColorScheme()
// Reemplazar con
nativeTheme.shouldUseInvertedColorScheme
// Obsoleto
systemPreferences.isHighContrastColorScheme()
// Reemplazar con
nativeTheme.shouldUseHighContrastColors
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
// Eliminada en Electron 7.0
powerMonitor.querySystemIdleTime(callback)
// Reemplazar con API síncrona
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 removida 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, que FileList
lista todos los archivos contenido dentro de la carpeta, similar a Chrome, Firefox, y Edge (enlace a los documentos 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. Si requieras la ruta a la carpeta seleccionada en lugar de los contenidos de la carpeta, ver el 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()
#15742app.dock.show()
#16904contentTracing.getCategories()
#16583contentTracing.getTraceBufferUsage()
#16600contentTracing.startRecording()
#16584contentTracing.stopRecording()
#16584contents.executeJavaScript()
#17312cookies.flushStore()
#16464cookies.get()
#16464cookies.remove()
#16464cookies.set()
#16464debugger.sendCommand()
#16861dialog.showCertificateTrustDialog()
#17181inAppPurchase.getProducts()
#17355inAppPurchase.purchaseProduct()
#17355netLog.stopLogging()
#16862session.clearAuthCache()
#17259session.clearCache()
#17185session.clearHostResolverCache()
#17229session.clearStorageData()
#17249session.getBlobData()
#17303session.getCacheSize()
#17185session.resolveProxy()
#17222session.setProxy()
#17222shell.openExternal()
#16176webContents.loadFile()
#15855webContents.loadURL()
#15855webContents.hasServiceWorker()
#16535webContents.printToPDF()
#16795webContents.savePage()
#16742webFrame.executeJavaScript()
#17312webFrame.executeJavaScriptInIsolatedWorld()
#17312webviewTag.executeJavaScript()
#17312win.capturePage()
#15743
These functions now have two forms, synchronous and Promise-based asynchronous:
dialog.showMessageBox()
/dialog.showMessageBoxSync()
#17298dialog.showOpenDialog()
/dialog.showOpenDialogSync()
#16973dialog.showSaveDialog()
/dialog.showSaveDialogSync()
#17054
Cambios Planeados en la API (6.0)
API Modificada: win.setMenu(null)
ahora es win.removeMenu()
// Deprecado
win.setMenu(null)
// Reemplazar con
win.removeMenu()
API Modificada: electron.screen
en el proceso renderer debe ser accedido a través de remote
// Deprecado
require('electron').screen
// Reemplazar con
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
// Deprecado
require('child_process')
// Reemplazar con
require('electron').remote.require('child_process')
// Deprecado
require('fs')
// Reemplazar con
require('electron').remote.require('fs')
// Deprecado
require('os')
// Reemplazar con
require('electron').remote.require('os')
// Deprecado
require('path')
// Reemplazar con
require('electron').remote.require('path')
Obsoleto: powerMonitor.querySystemIdleState
reemplazar con powerMonitor.getSystemIdleState
// Obsoleto
powerMonitor.querySystemIdleState(threshold, callback)
// Reemplazar con API síncrona
const idleState = powerMonitor.getSystemIdleState(threshold)
Obsoleto: powerMonitor.querySystemIdleTime
reemplazado con powerMonitor.getSystemIdleTime
// Obsoleto
powerMonitor.querySystemIdleTime(callback)
// Reemplazar con API síncrona
const idleTime = powerMonitor.getSystemIdleTime()
Obsoleto: app.enableMixedSandbox()
ya no es necesario
// Obsoleto
app.enableMixedSandbox()
El modo Mixed-sandbox 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.
// Deprecado
tray.setHighlightMode(mode)
// API sera eliminada en V7.0 sin reemplazo.
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.
Propiedad | Valor obsoleto | El valor por defecto nuevo |
---|---|---|
contextIsolation | false | true |
nodeIntegration | true | false |
webviewTag | nodeIntegration if set else true | false |
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
Child windows opened with the nativeWindowOpen
option will always have Node.js integration disabled, unless nodeIntegrationInSubFrames
is true
.
API Modificada: El registro de esquemas privilegiados ahora debe hacerse antes de que la aplicación este lista
Las APIs de Renderer Process webFrame.registerURLSchemeAsPrivileged
y webFrame.registerURLSchemeAsBypassingCSP
tal como la API del proceso de navegador protocol.registerStandardSchemes
han sido eliminados. 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 asincrónico y el parámetro autoCorrectWord
ha sido removido.
// Obsoleto
webFrame.setSpellCheckProvider('en-US', true, {
spellCheck: (text) => {
return !spellchecker.isMisspelled(text)
}
})
// Reemplazar con
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
// Obsoleto
app.releaseSingleInstance()
// Reemplazar con
app.releaseSingleInstanceLock()
app.getGPUInfo
app.getGPUInfo('completo')
// Ahora se comporta lo mismo con `basic` en macOS
app.getGPUInfo('básico')
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
. Consulte la guía de módulo nativo para más infromación.
Cambios en la API(3.0)
La siguiente lista incluye cambios efectuados en la API 3.0 de Electrón.
app
// Obsoleto
app.getAppMemoryInfo()
// Remplazar con
app.getAppMetrics()
// Obsoleto
const metrics = app.getAppMetrics()
const { memory } = metrics[0] // Propiedad Obsoleta
BrowserWindow
// Obsoleto
const optionsA = { webPreferences: { blinkFeatures: '' } }
const windowA = new BrowserWindow(optionsA)
// Reemplazar con
const optionsB = { webPreferences: { enableBlinkFeatures: '' } }
const windowB = new BrowserWindow(optionsB)
// Obsoleto
window.on('app-command', (e, cmd) => {
if (cmd === 'media-play_pause') {
// do something
}
})
// Reemplazar con
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
// Obsoleto
nativeImage.createFromBuffer(buffer, 1.0)
// Reemplazar con
nativeImage.createFromBuffer(buffer, {
scaleFactor: 1.0
})
process
// Obsoleto
const info = process.getProcessMemoryInfo()
screen
// Obsoleto
screen.getMenuBarHeight()
// Reemplazar con
screen.getPrimaryDisplay().workArea
session
// Deprecado
ses.setCertificateVerifyProc((hostname, certificate, callback) => {
callback(true)
})
// Reemplazar con
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>
// Eliminado
webview.setAttribute('disableguestresize', '')
// No hay reemplazo para esto en la API
// Eliminado
webview.setAttribute('guestinstance', instanceId)
// No hay reemplazo para esto en la API
// Los eventos de tecldo ya no funcionan en la etiqueta de webview
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
// Obsoleto
const optionsA = { titleBarStyle: 'hidden-inset' }
const windowA = new BrowserWindow(optionsA)
// Reemplazar con
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
// Obsoleto
nativeImage.toPng()
// Reemplazar con
nativeImage.toPNG()
// Obsoleto
nativeImage.toJpeg()
// Reemplazar con
nativeImage.toJPEG()
process
Versión de procesos de Electron
yVersión de procesos de Chrome
Serán propiedades de solo lectura para la consistencia con otras propiedades deprocess.versions
configuradas por Node.
webContents
// Obsoleto
webContents.setZoomLevelLimits(1, 2)
// Reemplazar con
webContents.setVisualZoomLevelLimits(1, 2)
webFrame
// Obsoleto
webFrame.setZoomLevelLimits(1, 2)
// Reemplazar con
webFrame.setVisualZoomLevelLimits(1, 2)
<webview>
// Obsoleto
webview.setZoomLevelLimits(1, 2)
// Reemplazar con
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.