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.
Cambios Planeados en la API (33.0)
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.
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]')
alert(`Uploaded file path was: ${file.path}`)
// After (renderer)
const file = document.querySelector('input[type=file]')
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. Esta se debería reemplazar configurando un MessageChannel
entre los renderizadores.
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. Esta se debería reemplazar configurando un MessageChannel
entre los renderizadores.
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. En su lugar, utiliza el nuevo evento disponible input-event
en 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. Es reemplazado por 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. En su lugar, utiliza el nuevo evento disponible input-event
en 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. Este controlador ya no recibe un frame WebFrameMain
como argumento, sino que recibe el origin
, que es el origen que está verificando el permiso del dispositivo.
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
.
Si estabas utilizando este parámetro para establecer el título de una ventana, en su lugar puedes utilizar win.setTitle(título).
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
. Deberás asegurarte de que los valores devueltos por cualquiera de esos métodos sean compatibles con la API de Context Bridge, ya que estos métodos utilizan la misma semántica de paso de valores.
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. 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 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 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
, 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()
#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()
// 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.
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
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)
menu
// Removed
menu.popup(browserWindow, 100, 200, 2)
// Replaced with
menu.popup(browserWindow, { x: 100, y: 200, positioningItem: 2 })
nativeImage
// Removed
nativeImage.toPng()
// Replaced with
nativeImage.toPNG()
// Removed
nativeImage.toJpeg()
// Replaced with
nativeImage.toJPEG()
process
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
// 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.