К основному содержанию
правило

electron — правило для Cursor: безопасный Electron-код

Правило для Cursor задаёт команде единый стиль разработки на Electron: контекстная изоляция, безопасный contextBridge, IPC через invoke и кросс-платформенные пути.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/electron.mdc
Открыть на GitHub

Что делает electron

Это правило подключается к Cursor и начинает работать на файлах **/*.{js,jsx}. Оно описывает, как писать Electron-приложения начиная с версии 28: проект собирается через Electron Forge, шаблон — Vite + TypeScript, имена файлов через дефис.

Безопасность здесь не обсуждается, а предписывается. contextIsolation остаётся включённым, sandbox: true рекомендуется, а наружу через contextBridge.exposeInMainWorld отдаются только конкретные функции с проверкой аргументов. Прямая передача ipcRenderer.send в окно считается ошибкой, потому что рендерер получает возможность слать произвольные IPC-сообщения. Для запросов с ответом правило требует ipcMain.handle и ipcRenderer.invoke вместо пары send/on, которая ловит гонки.

Дальше идут мелочи, которые обычно забывают: строгий CSP в index.html, расширение .mjs для ESM в main- и preload-скриптах, await для импортов до app.whenReady(), path.join и os.tmpdir() вместо склейки строк. Линтер и тесты прописаны в package.json и запускаются в pre-commit. Учтите: песочные preload-скрипты не поддерживают ESM-импорты, их придётся собирать в бандл, если нужны внешние модули.

Какие задачи решает

  • закрыть рендереру доступ к произвольным IPC-вызовам
  • убрать гонки в запросах между окном и main-процессом
  • собрать пути к файлам так, чтобы работало и на Windows, и на macOS
  • подключить строгий CSP и не сломать загрузку скриптов
  • перевести проект на ESM в Electron 28+

Примеры запросов агенту

  • Проверь preload-скрипт: не отдаём ли мы наружу лишние методы через contextBridge?
  • Перепиши этот запрос данных на ipcMain.handle и ipcRenderer.invoke
  • Замени склейку путей на path.join и os.tmpdir()

Как установить electron

Вручную: положить файлы

.cursor/rules/electron.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о electron

Как установить правило electron в Cursor?

Создайте файл .cursor/rules/electron.mdc в корне проекта и вставьте в него содержимое правила.

Что делает правило electron?

Задаёт набор требований к Electron-коду: контекстная изоляция, безопасное API через contextBridge, IPC по схеме запрос-ответ, кросс-платформенные пути и единый инструментарий сборки.

На каких файлах срабатывает правило?

На JavaScript и JSX-файлах по маске **/*.{js,jsx}.

Исходный текст

electron.mdc · CC0-1.0
---
description: This guide provides opinionated, actionable best practices for building secure, performant, and maintainable Electron applications using modern patterns and consistent tooling.
globs: **/*.{js,jsx}
---
# Electron Best Practices

Electron development demands a disciplined approach to security, performance, and maintainability. This guide outlines the definitive best practices for our team, leveraging modern Electron features and tooling (targeting Electron 28+).

## 1. Project Setup & Structure

Always start with **Electron Forge** to standardize project structure, build pipelines, and stay aligned with the latest Electron APIs.

-   **Scaffolding:** Use a modern template like Vite + TypeScript.
    ❌ BAD: Manual setup, outdated CLIs.
    ✅ GOOD:
    ```bash
    npx create-electron-app@latest my-app --template=vite-typescript
    ```

-   **File Naming:** Adhere to Electron's coding style for JavaScript files.
    ❌ BAD: `my_module.js`
    ✅ GOOD: `my-module.js`

## 2. Security Fundamentals (Non-Negotiable)

Security is paramount. Always enable context isolation and expose APIs safely.

-   **Context Isolation (Mandatory):** Keep `contextIsolation` enabled. It's on by default since Electron 12.
    ❌ BAD: `new BrowserWindow({ webPreferences: { contextIsolation: false } })`
    ✅ GOOD: (Default behavior, no explicit setting needed unless overriding)
    ```javascript
    // main.mjs
    new BrowserWindow({
      webPreferences: {
        preload: path.join(__dirname, 'preload.mjs'),
        sandbox: true // Strongly recommended
      }
    })
    ```

-   **Safe API Exposure with `contextBridge`:** Never mutate the global `window` object directly. Use `contextBridge.exposeInMainWorld` and filter arguments.
    ❌ BAD: Exposing `ipcRenderer.send` directly.
    ```javascript
    // preload.mjs
    const { contextBridge, ipcRenderer } = require('electron');
    contextBridge.exposeInMainWorld('myAPI', {
      send: ipcRenderer.send // ❌ Allows renderer to send arbitrary IPC messages
    });
    ```
    ✅ GOOD: Expose specific, argument-filtered functions.
    ```javascript
    // preload.mjs
    import { contextBridge, ipcRenderer } from 'electron';

    contextBridge.exposeInMainWorld('electronAPI', {
      loadPreferences: () => ipcRenderer.invoke('load-prefs'),
      saveSettings: (settings) => {
        // ✅ Validate and filter arguments before sending
        if (typeof settings === 'object' && settings !== null) {
          ipcRenderer.send('save-settings', settings);
        } else {
          console.error('Invalid settings object provided.');
        }
      }
    });

    // interface.d.ts (for TypeScript)
    declare global {
      interface Window {
        electronAPI: {
          loadPreferences: () => Promise<any>;
          saveSettings: (settings: object) => void;
        };
      }
    }
    ```

-   **Content Security Policy (CSP):** Implement a strict CSP in your `index.html` or via `webRequest.onHeadersReceived`.
    ✅ GOOD:
    ```html
    <!-- index.html -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'">
    ```

## 3. ES Modules (ESM) Adoption (Electron 28+)

Leverage native ESM for cleaner, more modern code.

-   **Main Process:** Use `.mjs` extension or `"type": "module"` in `package.json`.
    -   **`await` for Pre-Ready APIs:** ESM imports are asynchronous. Ensure critical APIs (e.g., `app.setPath`) are `await`ed before `app.whenReady()`.
    ❌ BAD:
    ```javascript
    // main.mjs
    import './setup-paths.mjs'; // May resolve after app is ready
    app.whenReady().then(() => { /* ... */ });
    ```
    ✅ GOOD:
    ```javascript
    // main.mjs
    import { app } from 'electron';
    await import('./setup-paths.mjs'); // Guarantees execution before ready
    app.whenReady().then(() => { /* ... */ });
    ```

-   **Preload Scripts:** Always use the `.mjs` extension for ESM preload scripts.
    -   **Sandboxed Preloads:** Cannot use ESM imports. Bundle them if external modules are needed.
    -   **Context Isolation:** Required for dynamic Node.js ESM imports in unsandboxed preloads.
    ❌ BAD: `preload.js` with `import` statements.
    ✅ GOOD: `preload.mjs`

## 4. IPC Communication

Use `ipcMain.handle` and `ipcRenderer.invoke` for explicit request-response patterns.

-   **Request-Response:**
    ❌ BAD: Using `ipcRenderer.send` for requests that expect a response.
    ```javascript
    // renderer.js
    ipcRenderer.send('get-data', someId);
    ipcRenderer.on('data-response', (event, data) => { /* ... */ }); // Race condition prone
    ```
    ✅ GOOD:
    ```javascript
    // main.mjs
    ipcMain.handle('get-data', async (event, someId) => {
      // ✅ Perform validation, access native APIs
      return await fetchData(someId);
    });

    // renderer.js
    const data = await window.electronAPI.getData(someId); // Assuming exposed via contextBridge
    ```

## 5. System Path Handling

Always use Node.js `path` and `os` modules for cross-platform compatibility.

-   **File Paths:** Use `path.join()` for concatenation.
    ❌ BAD: `app.getPath('userData') + '/config.json'`
    ✅ GOOD:
    ```javascript
    import path from 'node:path';
    import { app } from 'electron';
    const configPath = path.join(app.getPath('userData'), 'config.json');
    ```

-   **Temporary Directories:** Use `os.tmpdir()`.
    ❌ BAD: `'/tmp/my-app-data'`
    ✅ GOOD:
    ```javascript
    import os from 'node:os';
    const tempDir = os.tmpdir();
    ```

## 6. Testing & Linting

Integrate Electron's built-in tooling for consistent code quality.

-   **Linting:** Run `npm run lint` regularly and integrate into pre-commit hooks.
    ✅ GOOD: Ensure your `package.json` includes:
    ```json
    "scripts": {
      "lint": "electron-builder lint" // Or specific linter like 'eslint .'
    }
    ```

-   **Unit Tests:** Add new tests for any changes or new features.
    ✅ GOOD: `npm run test`
    ```json
    "scripts": {
      "test": "electron-mocha spec" // Example with electron-mocha
    }
    ```

## 7. Staying Current

Electron evolves rapidly. Proactively manage updates and breaking changes.

-   **Official Documentation:** Always consult the version-specific official documentation.
-   **Breaking Changes:** Regularly review the "Breaking Changes" page for each major Electron release to anticipate necessary updates.

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Всё по теме «Безопасность» →
electron-development Mindrally Скилл задаёт агенту правила разработки десктопных приложений на Electron: разделение процессов, IPC, безопасность окон. CX Codex +1 1 300установок electron-pro VoltAgent Community Субагент для создания приложений на Electron 27+. Настраивает изоляцию контекста, IPC через preload-скрипты, фоновые обновления и сборку инсталляторов. 376установок electron-best-practices agent-skills Скилл ведёт ИИ-агента по разработке Electron-приложений на React: безопасность, типизированный IPC, сборка и подпись. Пригодится, когда агент пишет код main, preload или renderer. CX Codex +1 820установок electron-dev jamditis Скилл для сборки десктопных приложений на Electron с React, TypeScript и Vite: IPC, трей, PTY-терминалы, упаковка. CX Codex +1 305установок electron-builder pedronauck Настраивает сборку десктопных приложений на Electron под Windows, macOS и Linux. Помогает с подписью кода, выпуском релизов и автоматическими обновлениями. CX Codex +1 392установок electron-chromium-upgrade electron Помогает обновлять версию Chromium в репозитории Electron на ветке roller/chromium/main. Разбирает конфликты патчей при вызове e sync --3 и оформляет коммиты. CX Codex +1 618установок

Из того же набора69

flutter Правило задаёт Cursor единый стиль Flutter-кода: форматирование, линты, слои MVVM и Riverpod. Пригодится, когда агент пишет виджеты и состояние в одном файле. ★ 3 579звёзд репо flake8 Правило для Cursor задаёт, как настроить flake8 и какие проверки включить. Пригодится, если в проекте есть Python и хочется ловить стилевые ошибки и баги до коммита. ★ 3 579звёзд репо ffmpeg Правило для Cursor, которое задаёт агенту порядок работы с FFmpeg: вызовы через libav*, двухпроходное кодирование и закреплённые сборки в CI. ★ 3 579звёзд репо esbuild Правило для Cursor, которое задаёт агенту порядок работы с esbuild: один конфиг вместо россыпи флагов в package.json. Пригодится, когда сборка уже есть, но её никто не может поддерживать. ★ 3 579звёзд репо drizzle Правило задаёт агенту Cursor стиль работы с Drizzle ORM: модульные схемы, явные ограничения полей и единый нейминг в TypeScript-проекте. ★ 3 579звёзд репо django-rest-framework Правило Cursor, которое задаёт агенту единый стиль разработки API на Django REST Framework: структура проекта, сериализаторы, ViewSets. ★ 3 579звёзд репо digitalocean Правило для Cursor задаёт, как строить и разворачивать приложения в DigitalOcean: VPC, managed-сервисы, контейнеры. ★ 3 579звёзд репо datadog Правило для Cursor задаёт стандарты Datadog: обязательные теги service, env и version, структурные логи и порядок в именах метрик. ★ 3 579звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой