PageSourceSearch

https://www.electronjs.org/assets/js/dcea2928.ef5cd524.js

js electronjs.org collected 2026-09-24 07:02:44 UTC 13,986 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkelectronjs=self.webpackChunkelectronjs||[]).push([["15392"],{16019(e,n,r){r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>a,frontMatter:()=>c,metadata:()=>t,toc:()=>i});var t=r(12440),s=r(74848),o=r(28453);let c={title:"Electron 29.0.0",date:new Date("2024-02-20T00:00:00.000Z"),authors:"VerteDinde",slug:"electron-29-0",tags:["release"]},d,l={authorsImageUrls:[void 0]},i=[{value:"Notable Changes",id:"notable-changes",level:2},{value:"Stack Changes",id:"stack-changes",level:2},{value:"New Features",id:"new-features",level:2},{value:"Breaking Changes",id:"breaking-changes",level:2},{value:"Behavior Changed: <code>ipcRenderer</code> can no longer be sent over the <code>contextBridge</code>",id:"behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge",level:3},{value:"Removed: <code>renderer-process-crashed</code> event on <code>app</code>",id:"removed-renderer-process-crashed-event-on-app",level:3},{value:"Removed: <code>crashed</code> event on <code>WebContents</code> and <code>&lt;webview&gt;</code>",id:"removed-crashed-event-on-webcontents-and-webview",level:3},{value:"Removed: <code>gpu-process-crashed</code> event on <code>app</code>",id:"removed-gpu-process-crashed-event-on-app",level:3},{value:"End of Support for 26.x.y",id:"end-of-support-for-26xy",level:2},{value:"What&#39;s Next",id:"whats-next",level:2}];function h(e){let n={a:"a",code:"code",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Electron 29.0.0 has been released! It includes upgrades to Chromium ",(0,s.jsx)(n.code,{children:"122.0.6261.39"}),", V8 ",(0,s.jsx)(n.code,{children:"12.2"}),", and Node.js ",(0,s.jsx)(n.code,{children:"20.9.0"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.p,{children:["The Electron team is excited to announce the release of Electron 29.0.0! You can install it with npm via ",(0,s.jsx)(n.code,{children:"npm install electron@latest"})," or download it from our ",(0,s.jsx)(n.a,{href:"https://releases.electronjs.org/release?channel=stable",children:"releases website"}),". Continue reading for details about this release."]}),"\n",(0,s.jsxs)(n.p,{children:["If you have any feedback, please share it with us on ",(0,s.jsx)(n.a,{href:"https://twitter.com/electronjs",children:"Twitter"})," or ",(0,s.jsx)(n.a,{href:"https://social.lfx.dev/@electronjs",children:"Mastodon"}),", or join our community ",(0,s.jsx)(n.a,{href:"https://discord.com/invite/electronjs",children:"Discord"}),"! Bugs and feature requests can be reported in Electron's ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/issues",children:"issue tracker"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"notable-changes",children:"Notable Changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Added a new top-level ",(0,s.jsx)(n.code,{children:"webUtils"})," module, a renderer process module that provides a utility layer to interact with Web API objects. The first available API in the module is ",(0,s.jsx)(n.code,{children:"webUtils.getPathForFile"}),". Electron's previous ",(0,s.jsx)(n.code,{children:"File.path"})," augmentation was a deviation from web standards; this new API is more in line with current web standards behavior."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"stack-changes",children:"Stack Changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Chromium ",(0,s.jsx)(n.code,{children:"122.0.6261.39"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["New in ",(0,s.jsx)(n.a,{href:"https://developer.chrome.com/blog/new-in-chrome-122/",children:"Chrome 122"})," and in ",(0,s.jsx)(n.a,{href:"https://developer.chrome.com/blog/new-in-devtools-122/",children:"DevTools 122"})]}),"\n",(0,s.jsxs)(n.li,{children:["New in ",(0,s.jsx)(n.a,{href:"https://developer.chrome.com/blog/new-in-chrome-121/",children:"Chrome 121"})," and in ",(0,s.jsx)(n.a,{href:"https://developer.chrome.com/blog/new-in-devtools-121/",children:"DevTools 121"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Node ",(0,s.jsx)(n.code,{children:"20.9.0"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://nodejs.org/en/blog/release/v20.9.0/",children:"Node 20.9.0 notes"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://nodejs.org/en/blog/release/v20.0.0/",children:"Node 20.0.0 notes"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["V8 ",(0,s.jsx)(n.code,{children:"12.2"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Electron 29 upgrades Chromium from ",(0,s.jsx)(n.code,{children:"120.0.6099.56"})," to ",(0,s.jsx)(n.code,{children:"122.0.6261.39"}),", Node from ",(0,s.jsx)(n.code,{children:"18.18.2"})," to ",(0,s.jsx)(n.code,{children:"20.9.0"}),", and V8 from ",(0,s.jsx)(n.code,{children:"12.0"})," to ",(0,s.jsx)(n.code,{children:"12.2"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"new-features",children:"New Features"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Added new ",(0,s.jsx)(n.code,{children:"webUtils"})," module, a utility layer to interact with Web API objects, to replace ",(0,s.jsx)(n.code,{children:"File.path"})," augmentation. ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/pull/38776",children:"#38776"})]}),"\n",(0,s.jsxs)(n.li,{children:["Added ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/net",children:"net"})," module to ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/glossary#utility-process",children:"utility process"}),". ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/pull/40890",children:"#40890"})]}),"\n",(0,s.jsxs)(n.li,{children:["Added a new ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/tutorial/fuses",children:"Electron Fuse"}),", ",(0,s.jsx)(n.code,{children:"grantFileProtocolExtraPrivileges"}),", that opts the ",(0,s.jsx)(n.code,{children:"file://"})," protocol into more secure and restrictive behaviour that matches Chromium. ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/pull/40372",children:"#40372"})]}),"\n",(0,s.jsxs)(n.li,{children:["Added an option in ",(0,s.jsx)(n.code,{children:"protocol.registerSchemesAsPrivileged"}
1)," to allow V8 code cache in custom schemes. ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/pull/40544",children:"#40544"})]}),"\n",(0,s.jsxs)(n.li,{children:["Migrated ",(0,s.jsx)(n.code,{children:"app.{set|get}LoginItemSettings(settings)"})," to use Apple's new recommended underlying framework on macOS 13.0+. ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/pull/37244",children:"#37244"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"breaking-changes",children:"Breaking Changes"}),"\n",(0,s.jsxs)(n.h3,{id:"behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge",children:["Behavior Changed: ",(0,s.jsx)(n.code,{children:"ipcRenderer"})," can no longer be sent over the ",(0,s.jsx)(n.code,{children:"contextBridge"})]}),"\n",(0,s.jsxs)(n.p,{children:["Attempting to send the entire ",(0,s.jsx)(n.code,{children:"ipcRenderer"})," module as an object over the ",(0,s.jsx)(n.code,{children:"contextBridge"})," will now result in\nan empty object on the receiving side of the bridge. This change was made to remove / mitigate\na security footgun. You should not directly expose ipcRenderer or its methods over the bridge.\nInstead, provide a safe wrapper like below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:"contextBridge.exposeInMainWorld('app', {\n  onEvent: (cb) => ipcRenderer.on('foo', (e, ...args) => cb(args)),\n});\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"removed-renderer-process-crashed-event-on-app",children:["Removed: ",(0,s.jsx)(n.code,{children:"renderer-process-crashed"})," event on ",(0,s.jsx)(n.code,{children:"app"})]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"renderer-process-crashed"})," event on ",(0,s.jsx)(n.code,{children:"app"})," has been removed.\nUse the new ",(0,s.jsx)(n.code,{children:"render-process-gone"})," event instead."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:"// Removed\napp.on('renderer-process-crashed', (event, webContents, killed) => {\n  /* ... */\n});\n\n// Replace with\napp.on('render-process-gone', (event, webContents, details) => {\n  /* ... */\n});\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"removed-crashed-event-on-webcontents-and-webview",children:["Removed: ",(0,s.jsx)(n.code,{children:"crashed"})," event on ",(0,s.jsx)(n.code,{children:"WebContents"})," and ",(0,s.jsx)(n.code,{children:"<webview>"})]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"crashed"})," events on ",(0,s.jsx)(n.code,{children:"WebContents"})," and ",(0,s.jsx)(n.code,{children:"<webview>"})," have been removed.\nUse the new ",(0,s.jsx)(n.code,{children:"render-process-gone"})," event instead."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:"// Removed\nwin.webContents.on('crashed', (event, killed) => {\n  /* ... */\n});\nwebview.addEventListener('crashed', (event) => {\n  /* ... */\n});\n\n// Replace with\nwin.webContents.on('render-process-gone', (event, details) => {\n  /* ... */\n});\nwebview.addEventListener('render-process-gone', (event) => {\n  /* ... */\n});\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"removed-gpu-process-crashed-event-on-app",children:["Removed: ",(0,s.jsx)(n.code,{children:"gpu-process-crashed"})," event on ",(0,s.jsx)(n.code,{children:"app"})]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"gpu-process-crashed"})," event on ",(0,s.jsx)(n.code,{children:"app"})," has been removed.\nUse the new ",(0,s.jsx)(n.code,{children:"child-process-gone"})," event instead."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:"// Removed\napp.on('gpu-process-crashed', (event, killed) => {\n  /* ... */\n});\n\n// Replace with\napp.on('child-process-gone', (event, details) => {\n  /* ... */\n});\n"})}),"\n",(0,s.jsx)(n.h2,{id:"end-of-support-for-26xy",children:"End of Support for 26.x.y"}),"\n",(0,s.jsxs)(n.p,{children:["Electron 26.x.y has reached end-of-support as per the project's ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy",children:"support policy"}),". Developers and applications are encouraged to upgrade to a newer version of Electron."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"E29 (Feb'24)"}),(0,s.jsx)(n.th,{children:"E30 (Apr'24)"}),(0,s.jsx)(n.th,{children:"E31 (Jun'24)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"29.x.y"}),(0,s.jsx)(n.td,{children:"30.x.y"}),(0,s.jsx)(n.td,{children:"31.x.y"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"28.x.y"}),(0,s.jsx)(n.td,{children:"29.x.y"}),(0,s.jsx)(n.td,{children:"30.x.y"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"27.x.y"}),(0,s.jsx)(n.td,{children:"28.x.y"}),(0,s.jsx)(n.td,{children:"29.x.y"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"whats-next",children:"What's Next"}),"\n",(0,s.jsxs)(n.p,{children:["Did you know that Electron recently added a community Request for Comments (RFC) process? If you want to add a feature to the framework, RFCs can be a useful tool to start a dialogue with maintainers on its design. You can also see upcoming changes being discussed in the Pull Requests. To learn more, check out our ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/blog/rfcs",children:"Introducing electron/rfcs"})," blog post, or check out the README of the ",(0,s.jsx)(n.a,{href:"https://www.github.com/electron/rfcs",children:"electron/rfcs"})," repository directly."]}),"\n",(0,s.jsx)(n.p,{children:"In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8."}),"\n",(0,s.jsxs)(n.p,{children:["You can find ",(0,s.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/tutorial/electron-timelines",children:"Electron's public timeline here"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["More information about future changes can be found on the ",(0,s.jsx)(n.a,{href:"https://github.com/electron/electron/blob/main/docs/breaking-changes.md",children:"Planned Breaking Changes"})," page."]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},28453(e,n,r){r.d(n,{R:()=>c,x:()=>d});var t=r(96540);let s={},o=t.createContext(s);function c(e){let n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),t.createElement(o.Provider,{value:n},e.children)}},12440(e){e.exports=JSON.parse('{"permalink":"/blog/electron-29-0","source":"@site/blog/electron-29-0.md","title":"Electron 29.0.0","description":"Electron 29.0.0 has been released! It includes upgrades to Chromium 122.0.6261.39, V8 12.2, and Node.js 20.9.0.","date":"2024-02-20T00:00:00.000Z","tags":[{"inline":false,"label":"Release","permalink":"/blog/tags/release","description":"Blog posts about new Electron releases"}],"readingTime":4.04,"hasTruncateMarker":false,"authors":[{"name":"VerteDinde","url":"https://github.com/VerteDinde","imageURL":"https://github.com/VerteDinde.png?size=96","key":"VerteDinde","page":null}],"frontMatter":{"title":"Electron 29.0.0","date":"2024-02-20T00:00:00.000Z","authors":"VerteDinde","slug":"electron-29-0","tags":["release"]},"unlisted":false,"prevItem":{"title":"Google Summer of Code 2024","permalink":"/blog/2024-summer-of-code"},"nextItem":{"title":"Introducing electron/rfcs","permalink":"/blog/rfcs"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.