@trops/dash-core

中文文档
0.1.895发布于 2026/11/03MITESM + CJS构建来源已验证

Core framework for Dash dashboard applications

原始使用文档
文档目录24 节
  1. Installation
  2. Two Export Paths
  3. Renderer (React)
  4. Electron (Main Process)
  5. Architecture
  6. Renderer Layer ( src/ )
  7. Electron Layer ( electron/ )
  8. Directory Structure
  9. Key Patterns
  10. createMainApi Factory
  11. Provider System
  12. ThemeContext Import Rule
  13. MCP Provider Lifecycle
  14. ComponentManager
  15. Widget Bundle Loading
  16. Layout System
  17. Key Files
  18. Documentation
  19. Related Packages
  20. Development
  21. Build Output Verification
  22. Rollup Configuration
  23. Troubleshooting
  24. License

@trops/dash-core

Core framework for Dash dashboard applications. Provides the widget system, provider architecture, context providers, layout engine, and Electron main process layer used by all Dash apps.

Installation

npm install @trops/dash-core

Peer dependencies:

{
  "@trops/dash-react": ">=0.1.187",
  "react": "^18.2.0",
  "react-dom": "^18.2.0"
}

Two Export Paths

Renderer (React)

Platform-agnostic UI framework — contexts, hooks, models, components, widget system.

import {
  ComponentManager,
  DashboardPublisher,
  ErrorBoundary,
  // Contexts
  AppContext,
  DashboardContext,
  ThemeWrapper,
  ProviderContext,
  // Hooks
  useDashboard,
  useMcpProvider,
  useWidgetProviders,
  useInstalledWidgets,
  // Models
  DashboardModel,
  LayoutModel,
  ThemeModel,
  // Components
  LayoutBuilder,
  SettingsPanel,
  NavigationBar,
  // Widget
  Widget,
  WidgetFactory,
  ExternalWidget,
} from "@trops/dash-core";

Electron (Main Process)

Controllers, IPC handlers, events, and widget pipeline for Electron apps.

const {
  // Factory
  createMainApi,
  // Controllers
  providerController,
  mcpController,
  workspaceController,
  themeController,
  registryController,
  // Widget pipeline
  widgetRegistry,
  widgetCompiler,
  dynamicWidgetLoader,
  // Events
  events,
} = require("@trops/dash-core/electron");

Architecture

@trops/dash-core
├── src/                    Renderer layer (ESM + CJS)
│   ├── Api/                IPC API clients
│   ├── Components/         Dashboard, Layout, Settings, Navigation, etc.
│   ├── Context/            React Context providers
│   ├── Models/             Data models (Dashboard, Layout, Theme, etc.)
│   ├── Widget/             Widget, WidgetFactory, ExternalWidget
│   ├── hooks/              useDashboard, useMcpProvider, useWidgetProviders
│   └── utils/              Bundle loader, layout helpers, validation
│
└── electron/               Electron layer (CJS only)
    ├── api/                IPC handlers + createMainApi factory
    ├── controller/         Business logic (providers, MCP, themes, etc.)
    ├── events/             Event definitions
    ├── mcp/                MCP server catalog
    └── utils/              File, color, browser utilities

Renderer Layer (src/)

Platform-agnostic UI framework.

ModuleKey FilesPurpose
ComponentManagerComponentManager.jsWidget/workspace registration, config resolution
ContextContext/AppContext, DashboardContext, ThemeWrapper, ProviderContext, WidgetContext, WorkspaceContext
Hookshooks/useDashboard, useMcpProvider, useWidgetProviders, useInstalledWidgets, useWidgetEvents, useRegistrySearch
ModelsModels/DashboardModel, LayoutModel, ThemeModel, ComponentConfigModel, SettingsModel, etc.
ApiApi/DashboardApi, ElectronDashboardApi (typed), WidgetApi, ThemeApi, MockDashboardApi
ComponentsComponents/Dashboard, Layout, Settings, Navigation, Theme, Provider, Menu, Workspace
WidgetWidget/Widget, WidgetFactory, ExternalWidget
Utilsutils/widgetBundleLoader, layout, validation, mcpUtils, dragTypes, resolveIcon, themeGenerator, DynamicWidgetLoader, WidgetRegistry, plugin-loader

Electron Layer (electron/)

Main process controllers, APIs, and widget pipeline.

ModuleKey FilesPurpose
Controllerscontroller/providerController, mcpController, workspaceController, themeController, settingsController, layoutController, dataController, registryController, secureStoreController, dialogController, algoliaController, openaiController, menuItemsController, pluginController
APIsapi/IPC handlers for each controller + mainApi.js (createMainApi factory)
Eventsevents/Event channel definitions for each module
Widget PipelinewidgetRegistry.js, widgetCompiler.js, dynamicWidgetLoader.jsInstall, compile (esbuild), and load external widgets
MCPmcp/mcpServerCatalog.jsonMCP server definitions (transport, command, args, env mapping)

Directory Structure

dash-core/
├── src/                            # Renderer layer
│   ├── Api/
│   ├── ComponentManager.js
│   ├── Components/
│   │   ├── Dashboard/
│   │   ├── Layout/                  # LayoutBuilder, LayoutContainer, LayoutGridContainer
│   │   ├── Navigation/
│   │   ├── Settings/
│   │   ├── Theme/
│   │   ├── Provider/
│   │   ├── Menu/
│   │   └── Workspace/
│   ├── Context/
│   ├── DashboardPublisher.js
│   ├── ErrorBoundary.js
│   ├── Models/
│   ├── Widget/
│   ├── hooks/
│   └── utils/
├── electron/                        # Electron layer
│   ├── api/
│   │   └── mainApi.js               # createMainApi factory
│   ├── controller/
│   ├── events/
│   ├── mcp/
│   │   └── mcpServerCatalog.json
│   ├── utils/
│   ├── widgetRegistry.js
│   ├── widgetCompiler.js
│   └── dynamicWidgetLoader.js
├── dist/                            # Build output — never edit manually
│   ├── index.js                     # Renderer CJS
│   ├── index.esm.js                 # Renderer ESM
│   └── electron/
│       └── index.js                 # Electron CJS
├── docs/                            # Documentation
│   ├── requirements/                # PRDs and feature specs
│   │   └── prd/                     # Product Requirements Documents
│   └── *.md                         # Technical docs
├── .github/workflows/
│   └── release-package.yml          # Auto-publish on push to master
├── package.json
├── rollup.config.renderer.mjs
├── rollup.config.electron.mjs
├── babel.config.json
└── tsconfig.json

Key Patterns

createMainApi Factory

Template apps use createMainApi(extensions) to combine core APIs with custom ones:

const { createMainApi } = require("@trops/dash-core/electron");

const api = createMainApi({
  myCustomApi: require("./myCustomApi"),
});

Provider System

Providers are read from AppContext.providers, not DashboardContext.providers. This is due to component tree ordering — DashboardWrapper renders before providers are loaded.

ThemeContext Import Rule

Always import ThemeContext from @trops/dash-react to avoid dual context instances:

// CORRECT
import { ThemeContext } from "@trops/dash-react";

// WRONG — creates separate context
import { ThemeContext } from "./Context/ThemeContext";

MCP Provider Lifecycle

  1. Widget mounts -> useMcpProvider("slack") hook runs
  2. Hook reads provider from AppContext.providers (with mcpConfig and credentials)
  3. Calls dashApi.mcpStartServer() -> IPC -> mcpController spawns stdio child process
  4. Server returns available tools -> hook filters by allowedTools if specified
  5. Widget calls callTool("send_message", args) -> 30-second timeout per call
  6. On unmount, hook calls mcpStopServer() to clean up child process

ComponentManager

  • registerContainerTypes(LayoutContainer, LayoutGridContainer) -- auto-called on import
  • registerWidget(config, name) / config(name) for widget CRUD
  • _sourcePackage field set on external widget configs by registerBundleConfigs
  • loadWidgetComponents enriches registry entries with .dash.js metadata

Widget Bundle Loading

  • widgetBundleLoader.js evaluates CJS bundles with new Function() + require shim
  • Critical: MODULE_MAP must include @trops/dash-core so external widgets share the ComponentManager singleton
  • extractWidgetConfigs requires typeof entry.component === "function"

Layout System

  • Grid path vs non-grid path: Grid cells use layout.find() which returns raw items WITHOUT LayoutModel processing.
  • LayoutModel: Refreshes eventHandlers/events from ComponentManager.config() -- critical for keeping config fields up-to-date in the edit modal.

Key Files

FilePurpose
src/index.jsMain renderer export + auto-registration
electron/index.jsMain electron export
electron/api/mainApi.jscreateMainApi(extensions) factory
src/ComponentManager.jsWidget registration system
src/Context/ThemeWrapper.jsTheme provider (imports ThemeContext from @trops/dash-react)
src/Context/DashboardWrapper.jsDashboard context + provider passing
src/hooks/useMcpProvider.jsMCP server connection and tool calling
src/hooks/useWidgetProviders.jsWidget provider resolution
src/hooks/useInstalledWidgets.jsMerges builtin + installed widgets
src/utils/widgetBundleLoader.jsCJS bundle evaluation in renderer
src/Models/LayoutModel.jsLayout processing, refreshes events from ComponentManager
src/Models/ComponentConfigModel.jsNormalizes widget config with defaults
electron/controller/providerController.jsProvider CRUD + encryption
electron/controller/mcpController.jsMCP server spawn/stop/call
electron/widgetRegistry.jsWidget install/uninstall persistence
electron/widgetCompiler.jsesbuild compilation pipeline
electron/mcp/mcpServerCatalog.jsonMCP server definitions

Documentation

See docs/INDEX.md for the full documentation index:

PackagePurposeLocation
@trops/dash-reactUI component librarydash-react
dash-electronElectron app templatedash-electron

Development

# Build both layers
npm run build

# Build renderer only
npm run build:renderer

# Build electron only
npm run build:electron

# Format code
npm run prettify

Publishing is automated via GitHub Actions on push to master.

Build Output Verification

After any build, always verify all three output files exist:

ls dist/index.js dist/index.esm.js dist/electron/index.js

A build that exits 0 but produces incomplete output is a silent failure.

Rollup Configuration

Renderer (rollup.config.renderer.mjs):

  • Input: src/index.js
  • Output: CJS (dist/index.js) + ESM (dist/index.esm.js)
  • Externals: react, react-dom, @trops/dash-react, @fortawesome/*, @babel/runtime

Electron (rollup.config.electron.mjs):

  • Input: electron/index.js
  • Output: CJS only (dist/electron/index.js)
  • Externals: electron, Node builtins, esbuild, @anthropic-ai/sdk, @modelcontextprotocol/sdk, algoliasearch, openai, etc.

Troubleshooting

Build exits 0 but dist files are missing: Silent rollup failure -- check for unresolved imports or circular dependencies.

dist/electron/index.js missing after build: Electron rollup config may have failed silently. Run npm run build:electron alone to isolate.

Consumer app breaks after a dash-core change: Fix root cause in dash-core, don't modify dash-electron as workaround.

ThemeContext not updating in consumer: Verify ThemeContext is imported from @trops/dash-react everywhere.

MCP tools not appearing in widget: Check that AppContext.providers (not DashboardContext.providers) is the source.

License

MIT

版本与发布记录

@trops/dash-core 共发布 851 个版本,首次发布于 2026/02/25;过去 12 个月发布了 851 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.895latest2026/11/03今天
0.1.8942026/11/02今天
0.1.8932026/11/021 天前
0.1.8912026/11/021 天前
0.1.8922026/11/021 天前
0.1.8902026/11/012 天前

关于 @trops/dash-core 的常见问题

@trops/dash-core 是什么?

Dash仪表板应用程序的核心框架

如何安装 @trops/dash-core?

在项目目录运行 npm install @trops/dash-core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18.2.0)、react-dnd(^16.0.1)、react-dom(^18.2.0)、prop-types(^15.8.1)、tailwindcss(^3.2.7)、@heroicons/react(^2.0.16)、react-router-dom(^6.3.0)、@headlessui/react(1.4)、@trops/dash-react(>=1.0.83)、react-dnd-html5-backend(^16.0.1)、react-instantsearch-hooks-web(^6.26.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 dash-scan-manifest,可以用 npx dash-scan-manifest 直接运行。

@trops/dash-core 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/trops__dash-core 是否存在。

@trops/dash-core 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@trops/dash-core 可以商用吗?

@trops/dash-core 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@trops/dash-core 还在维护吗?

最新版本 0.1.895 发布于 2026/11/03(今天);至今共发布 851 个版本,其中过去 12 个月发布了 851 个;首次发布于 2026/02/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。