From 6330f8be9fe18a3d05b363775a888140d8c40060 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Sun, 23 May 2021 19:32:36 -0700 Subject: [PATCH] docs: rework introduction docs (#29062) * docs: add 'introduction' doc * note * wip * updates * wip * wip * wip * add missing code * wip * add image for chrome processes * process model wip * finish line? * update links * Update docs/README.md Co-authored-by: Cheng Zhao * Update docs/tutorial/introduction.md Co-authored-by: Mark Lee * Update docs/tutorial/quick-start.md Co-authored-by: Mark Lee * Update docs/tutorial/process-model.md Co-authored-by: Mark Lee * Update docs/tutorial/process-model.md Co-authored-by: Mark Lee * Update docs/tutorial/process-model.md Co-authored-by: Mark Lee * Update docs/tutorial/quick-start.md Co-authored-by: Mark Lee * Update docs/tutorial/quick-start.md Co-authored-by: Mark Lee * Update docs/tutorial/quick-start.md Co-authored-by: Mark Lee * Update docs/tutorial/quick-start.md Co-authored-by: Mark Lee * address code review * Update docs/tutorial/application-distribution.md Co-authored-by: Mark Lee * remove wip doc Co-authored-by: Cheng Zhao Co-authored-by: Mark Lee --- docs/README.md | 14 +- docs/api/synopsis.md | 4 +- docs/images/chrome-processes.png | Bin 0 -> 55414 bytes docs/tutorial/application-distribution.md | 2 +- docs/tutorial/introduction.md | 59 ++ docs/tutorial/process-model.md | 206 +++++++ docs/tutorial/quick-start.md | 623 ++++++++++++++-------- 7 files changed, 667 insertions(+), 241 deletions(-) create mode 100644 docs/images/chrome-processes.png create mode 100644 docs/tutorial/introduction.md create mode 100644 docs/tutorial/process-model.md diff --git a/docs/README.md b/docs/README.md index 692501a10a7d..75444671fb71 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,20 +18,14 @@ an issue: ## Guides and Tutorials -### Quickstart +### Getting started -* [Quick Start Guide](tutorial/quick-start.md) - * [Prerequisites](tutorial/quick-start.md#prerequisites) - * [Create a basic application](tutorial/quick-start.md#create-a-basic-application) - * [Run your application](tutorial/quick-start.md#run-your-application) - * [Package and distribute the application](tutorial/quick-start.md#package-and-distribute-the-application) +* [Introduction](tutorial/introduction.md) +* [Quick Start](tutorial/quick-start.md) +* [Process Model](tutorial/process-model.md) ### Learning the basics -* [Electron's Process Model](tutorial/quick-start.md#application-architecture) - * [Main and Renderer Processes](tutorial/quick-start.md#main-and-renderer-processes) - * [Electron API](tutorial/quick-start.md#electron-api) - * [Node.js API](tutorial/quick-start.md#nodejs-api) * Adding Features to Your App * [Notifications](tutorial/notifications.md) * [Recent Documents](tutorial/recent-documents.md) diff --git a/docs/api/synopsis.md b/docs/api/synopsis.md index ce1349615e32..667c1dcd35a4 100644 --- a/docs/api/synopsis.md +++ b/docs/api/synopsis.md @@ -13,7 +13,7 @@ either process type. The basic rule is: if a module is [GUI][gui] or low-level system related, then it should be only available in the main process. You need to be familiar with -the concept of [main process vs. renderer process](../tutorial/quick-start.md#main-and-renderer-processes) +the concept of main process vs. renderer process scripts to be able to use those modules. The main process script is like a normal Node.js script: @@ -43,8 +43,6 @@ extra ability to use node modules if `nodeIntegration` is enabled: ``` -To run your app, read [Run your app](../tutorial/quick-start.md#run-your-application). - ## Destructuring assignment As of 0.37, you can use diff --git a/docs/images/chrome-processes.png b/docs/images/chrome-processes.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0a1c0060f956c16056c0e37f2493e68260689b GIT binary patch literal 55414 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 Note: A renderer process is also created for [web embeds][web-embed] such as the +> `BrowserView` module. The `webContents` object is also accessible for embedded +> web content. + +Because the `BrowserWindow` module is an [`EventEmitter`][event-emitter], you can also +add handlers for various user events (for example, minimizing or maximizing your window). + +When a `BrowserWindow` instance is destroyed, its corresponding renderer process gets +terminated as well. + +[browser-window]: ../api/browser-window.md +[web-embed]: ./web-embeds.md +[web-contents]: ../api/web-contents.md +[event-emitter]: https://nodejs.org/api/events.html#events_class_eventemitter + +### Application lifecycle + +The main process also controls your application's lifecycle through Electron's +[`app`][app] module. This module provides a large set of events and methods +that you can use to add custom application behaviour (for instance, programatically +quitting your application, modifying the application dock, or showing an About panel). + +As a practical example, the app shown in the [quick start guide][quick-start-lifecycle] +uses `app` APIs to create a more native application window experience. + +```js title='main.js' +// quitting the app when no windows are open on macOS +app.on('window-all-closed', function () { + if (process.platform !== 'darwin') app.quit() +}) +``` + +[app]: ../api/app.md +[quick-start-lifecycle]: ./quick-start.md#manage-your-windows-lifecycle + +### Native APIs + +To extend Electron's features beyond being a Chromium wrapper for web contents, the +main process also adds custom APIs to interact with the user's operating system. +Electron exposes various modules that control native desktop functionality, such +as menus, dialogs, and tray icons. + +For a full list of Electron's main process modules, check out our API documentation. + +## The renderer process + +Each Electron app spawns a separate renderer process for each open `BrowserWindow` +(and each web embed). As its name implies, a renderer is responsible for +*rendering* web content. For all intents and purposes, code ran in renderer processes +should behave according to web standards (insofar as Chromium does, at least). + +Therefore, all user interfaces and app functionality within a single browser +window should be written with the same tools and paradigms that you use on the +web. + +Although explaining every web spec is out of scope for this guide, the bare minimum +to understand is: + +* An HTML file is your entry point for the renderer process. +* UI styling is added through Cascading Style Sheets (CSS). +* Executable JavaScript code can be added through ` +``` + +The code contained in `renderer.js` can then use the same JavaScript APIs and tooling +you use for typical front-end development, such as using [`webpack`][webpack] to bundle +and minify your code or [React][react] to manage your user interfaces. + +[webpack]: https://webpack.js.org +[react]: https://reactjs.org + +### Recap + +After following the above steps, you should have a fully functional +Electron application that looks like this: + +![Simplest Electron app](../images/simplest-electron-app.png) + + +The full code is available below: + +```js +// main.js + +// Modules to control application life and create native browser window const { app, BrowserWindow } = require('electron') const path = require('path') function createWindow () { - const win = new BrowserWindow({ + // Create the browser window. + const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { @@ -67,135 +368,100 @@ function createWindow () { } }) - win.loadFile('index.html') + // and load the index.html of the app. + mainWindow.loadFile('index.html') + + // Open the DevTools. + // mainWindow.webContents.openDevTools() } +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. app.whenReady().then(() => { createWindow() - app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) { - createWindow() - } + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', function () { + if (process.platform !== 'darwin') app.quit() }) + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and require them here. ``` -##### What is going on above? +```js +// preload.js -1. Line 1: First, you import the `app` and `BrowserWindow` modules of the `electron` package to be able to manage your application's lifecycle events, as well as create and control browser windows. -2. Line 2: Second, you import the `path` package which provides utility functions for file paths. -3. Line 4: After that, you define a function that creates a [new browser window](../api/browser-window.md#new-browserwindowoptions) with a preload script, loads `index.html` file into this window (line 13, we will discuss the file later). -4. Line 16: You create a new browser window by invoking the `createWindow` function once the Electron application [is initialized](../api/app.md#appwhenready). -5. Line 18: You add a new listener that creates a new browser window only if when the application has no visible windows after being activated. For example, after launching the application for the first time, or re-launching the already running application. -6. Line 25: You add a new listener that tries to quit the application when it no longer has any open windows. This listener is a no-op on macOS due to the operating system's [window management behavior](https://support.apple.com/en-ca/guide/mac-help/mchlp2469/mac). - -#### Create a web page - -This is the web page you want to display once the application is initialized. This web page represents the Renderer process. You can create multiple browser windows, where each window uses its own independent Renderer. You can optionally grant access to additional Node.js APIs by exposing them from your preload script. - -The `index.html` page looks as follows: - -```html fiddle='docs/fiddles/quick-start' - - - - - Hello World! - - - -

Hello World!

-

- We are using Node.js , - Chromium , - and Electron . -

- - -``` - -#### Define a preload script - -Your preload script (in our case, the `preload.js` file) acts as a bridge between Node.js and your web page. It allows you to expose specific APIs and behaviors to your web page rather than insecurely exposing the entire Node.js API. In this example we will use the preload script to read version information from the `process` object and update the web page with that info. - -```javascript fiddle='docs/fiddles/quick-start' +// All of the Node.js APIs are available in the preload process. +// It has the same sandbox as a Chrome extension. window.addEventListener('DOMContentLoaded', () => { const replaceText = (selector, text) => { const element = document.getElementById(selector) if (element) element.innerText = text } - for (const type of ['chrome', 'node', 'electron']) { - replaceText(`${type}-version`, process.versions[type]) + for (const dependency of ['chrome', 'node', 'electron']) { + replaceText(`${dependency}-version`, process.versions[dependency]) } }) ``` -##### What's going on above? +```html + -1. On line 1: First you define an event listener that tells you when the web page has loaded -2. On line 2: Second you define a utility function used to set the text of the placeholders in the `index.html` -3. On line 7: Next you loop through the list of components whose version you want to display -4. On line 8: Finally, you call `replaceText` to look up the version placeholders in `index.html` and set their text value to the values from `process.versions` + + + + + + + + Hello World! + + +

Hello World!

+ We are using Node.js , + Chromium , + and Electron . -#### Modify your package.json file - -Your Electron application uses the `package.json` file as the main entry point (as any other Node.js application). The main script of your application is `main.js`, so modify the `package.json` file accordingly: - -```json -{ - "name": "my-electron-app", - "version": "0.1.0", - "author": "your name", - "description": "My Electron app", - "main": "main.js" -} + + + + ``` -> NOTE: If the `main` field is omitted, Electron will attempt to load an `index.js` file from the directory containing `package.json`. - -> NOTE: The `author` and `description` fields are required for packaging, otherwise error will occur when running `npm run make`. - -By default, the `npm start` command will run the main script with Node.js. To run the script with Electron, you need to change it as such: - -```json -{ - "name": "my-electron-app", - "version": "0.1.0", - "author": "your name", - "description": "My Electron app", - "main": "main.js", - "scripts": { - "start": "electron ." - } -} +```fiddle docs/fiddles/quickstart ``` -#### Run your application +To summarize all the steps we've done: -```sh -npm start -``` +* We bootstrapped a Node.js application and added Electron as a dependency. +* We created a `main.js` script that runs our main process, which controls our app + and runs in a Node.js environment. In this script, we used Electron's `app` and + `BrowserWindow` modules to create a browser window that displays web content + in a separate process (the renderer). +* In order to access certain Node.js functionality in the renderer, we attached + a preload script to our `BrowserWindow` constructor. -Your running Electron app should look as follows: +## Package and distribute your application -![Simplest Electron app](../images/simplest-electron-app.png) - -### Package and distribute the application - -The simplest and the fastest way to distribute your newly created app is using +The fastest way to distribute your newly created app is using [Electron Forge](https://www.electronforge.io). -1. Import Electron Forge to your app folder: +1. Add Electron Forge as a development dependency of your app, and use its `import` command to set up +Forge's scaffolding: - ```sh + ```sh npm2yarn npm install --save-dev @electron-forge/cli npx electron-forge import @@ -211,12 +477,12 @@ The simplest and the fastest way to distribute your newly created app is using Thanks for using "electron-forge"!!! ``` -1. Create a distributable: +1. Create a distributable using Forge's `make` command: - ```sh + ```sh npm2yarn npm run make - > my-gsod-electron-app@1.0.0 make /my-electron-app + > my-electron-app@1.0.0 make /my-electron-app > electron-forge make ✔ Checking your system @@ -229,109 +495,12 @@ The simplest and the fastest way to distribute your newly created app is using ✔ Making for target: zip - On platform: darwin - For arch: x64 ``` - Electron-forge creates the `out` folder where your package will be located: + Electron Forge creates the `out` folder where your package will be located: ```plain - // Example for MacOS + // Example for macOS out/ ├── out/make/zip/darwin/x64/my-electron-app-darwin-x64-1.0.0.zip ├── ... └── out/my-electron-app-darwin-x64/my-electron-app.app/Contents/MacOS/my-electron-app ``` - -[node-download]: https://nodejs.org/en/download/ - -## Learning the basics - -This section guides you through the basics of how Electron works under the hood. It aims at strengthening knowledge about Electron and the application created earlier in the Quickstart section. - -### Application architecture - -Electron consists of three main pillars: - -* **Chromium** for displaying web content. -* **Node.js** for working with the local filesystem and the operating system. -* **Custom APIs** for working with often-needed OS native functions. - -Developing an application with Electron is like building a Node.js app with a web interface or building web pages with seamless Node.js integration. - -#### Main and Renderer Processes - -As it was mentioned before, Electron has two types of processes: Main and Renderer. - -* The Main process **creates** web pages by creating `BrowserWindow` instances. Each `BrowserWindow` instance runs the web page in its Renderer process. When a `BrowserWindow` instance is destroyed, the corresponding Renderer process gets terminated as well. -* The Main process **manages** all web pages and their corresponding Renderer processes. - ----- - -* The Renderer process **manages** only the corresponding web page. A crash in one Renderer process does not affect other Renderer processes. -* The Renderer process **communicates** with the Main process via IPC to perform GUI operations in a web page. Calling native GUI-related APIs from the Renderer process directly is restricted due to security concerns and potential resource leakage. - ----- - -The communication between processes is possible via Inter-Process Communication (IPC) modules: [`ipcMain`](../api/ipc-main.md) and [`ipcRenderer`](../api/ipc-renderer.md). - -#### APIs - -##### Electron API - -Electron APIs are assigned based on the process type, meaning that some modules can be used from either the Main or Renderer process, and some from both. Electron's API documentation indicates which process each module can be used from. - -For example, to access the Electron API in both processes, require its included module: - -```js -const electron = require('electron') -``` - -To create a window, call the `BrowserWindow` class, which is only available in the Main process: - -```js -const { BrowserWindow } = require('electron') -const win = new BrowserWindow() -``` - -To call the Main process from the Renderer, use the IPC module: - -```js -// In the Main process -const { ipcMain } = require('electron') - -ipcMain.handle('perform-action', (event, ...args) => { - // ... do actions on behalf of the Renderer -}) -``` - -```js -// In the Renderer process -const { ipcRenderer } = require('electron') - -ipcRenderer.invoke('perform-action', ...args) -``` - -> NOTE: Because Renderer processes may run untrusted code (especially from third parties), it is important to carefully validate the requests that come to the Main process. - -##### Node.js API - -> NOTE: To access the Node.js API from the Renderer process, you need to set the `nodeIntegration` preference to `true` and the `contextIsolation` preference to `false`. Please note that access to the Node.js API in any renderer that loads remote content is not recommended for [security reasons](../tutorial/security.md#2-do-not-enable-nodejs-integration-for-remote-content). - -Electron exposes full access to Node.js API and its modules both in the Main and the Renderer processes. For example, you can read all the files from the root directory: - -```js -const fs = require('fs') - -const root = fs.readdirSync('/') - -console.log(root) -``` - -To use a Node.js module, you first need to install it as a dependency: - -```sh -npm install --save aws-sdk -``` - -Then, in your Electron application, require the module: - -```js -const S3 = require('aws-sdk/clients/s3') -```