| # UI development |
| |
| Some tips to get started with the UI development: |
| |
| ## Development environment |
| |
| If you're looking for an IDE to write the TypeScript code, Visual Studio Code |
| works well out of the box. WebStorm or IntelliJ Idea Ultimate (Community does |
| not have JavaScript/TypeScript support) also work really well. The code is |
| located in the `ui` folder. |
| |
| ## Working with devserver |
| |
| See [Build Instructions](build-instructions.md) page for the details about |
| starting the local development server. |
| |
| The devserver has a live reload functionality: once you make a change in |
| TypeScript files, the resulting code will be recompiled and the page is going to |
| reload automatically. By default, this logic uses a timeout in order to prevent |
| successive reloads on rapid changes. This logic can be disabled via |
| development-only "Rapid live reload" flag in the UI. Disabling it will reload |
| the page earlier, at the cost of sometimes making multiple reloads in a row. |
| |
| ## Mithril components |
| |
| Perfetto UI uses the [Mithril](https://mithril.js.org/) library for rendering |
| the interface. The majority of the components in the codebase use |
| [class components](https://mithril.js.org/components.html#classes). When Mithril |
| is imported via `m` alias (as it is usually done in the codebase), the class |
| component should extend `m.ClassComponent`, which has an optional generic |
| parameter allowing the component to take inputs. The entry point of class |
| components is a `view` method, returning a tree of virtual DOM elements to be |
| rendered when the component is present on the page. |
| |
| ## Component state |
| |
| Local state of components can reside in class members and accessed directly in |
| methods via accessing `this`. State that is shared across different components |
| is stored in the `State` class definition, and should be modified via |
| implementing a new action in `src/common/actions.ts`. A new field added to |
| `State` should be initialized in `src/common/empty_state.ts`. |
| |
| There are restrictions on whan can be used in the global state: plain JS objects |
| are OK, but class instances are not (this limitation is due to state |
| serialization: the state should be a valid JSON object). If storing class |
| instances (like `Map` and `Set` data structures) is necessary, these can be |
| stored in the `NonSerializableState` portion of the state, that is omitted from |
| saving into JSON objects. |