CMS后端前端插件系统【免费下载链接】emdashEmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress项目地址https://gitcode.com/gh_mirrors/emdas/emdash点击查看免费下载本文以 EmDash 官方构建指南中的 Configuration 章节为骨架系统讲解基于 Astro 的全栈 TypeScript CMS —— EmDash 的站点配置体系。你将掌握astro.config.mjs中数据库、存储、站点 URL、插件的完整配置方法理解 Node.js 自托管与 Cloudflare D1/R2 两种部署形态的差异学会通过live.config.ts注册内容集合、用npx emdash types生成类型并了解反向代理场景下siteUrl与security.allowedDomains的配合原理。文中所有结论均对照当前仓库源码packages/core/src给出依据。配置文件的整体脉络一个 EmDash 站点的配置由四类文件协同完成文件职责说明astro.config.mjs注册emdash()集成数据库、存储、插件、站点 URL 等核心配置入口src/live.config.ts注册内容集合每站必有的样板文件通过emdashLoader()暴露所有内容类型emdash-env.d.ts内容类型声明开发服务器启动时自动生成为集合提供 TypeScript 类型package.json依赖声明区分 Node.js 与 Cloudflare 两种部署形态其中astro.config.mjs中的emdash()集成是整个系统的枢纽。从源码看它会在 Astro 的astro:config:setup阶段完成一系列注入工作注入/_emdash/admin管理后台路由与/_emdash/api/*REST 接口、配置中间件链middleware、覆写图片端点以支持存储直读并自动为astrojs/react缺失场景输出告警参见 packages/core/src/astro/integration/index.ts。如果你没有在integrations中注册astrojs/react()管理后台会卡在 Loading EmDash... 界面而无法水合构建时集成会打印明确的警告信息。astro.config.mjsNode.js 本地开发与自托管本地开发或 Node.js 自托管是最简单的形态。官方推荐的完整配置如下import node from astrojs/node; import react from astrojs/react; import { defineConfig } from astro/config; import emdash, { local } from emdash/astro; import { sqlite } from emdash/db; export default defineConfig({ output: server, adapter: node({ mode: standalone }), image: { layout: constrained, responsiveStyles: true, }, integrations: [ react(), emdash({ database: sqlite({ url: file:./data.db }), storage: local({ directory: ./uploads, baseUrl: /_emdash/api/media/file, }), }), ], devToolbar: { enabled: false }, });几个关键点需要说明output: server与 Node adapterEmDash 是服务端渲染 CMS必须配合astrojs/node的standalone模式运行构建产物位于dist/server/entry.mjs可通过node ./dist/server/entry.mjs启动见 templates/blank/package.json 中的start脚本。database: sqlite({ url })使用 Node 内置node:sqlite方言本地开发与 Node 部署均适用。从 packages/core/src/db/adapters.ts 的实现看sqlite()返回一个可序列化的 descriptor运行期再按需加载emdash/db/sqlite入口注意该方言要求 Node.js 22.16 及以上版本。除 SQLite 外同一文件还提供libsql({ url, authToken })Turso与postgres({ connectionString })两种适配器可按部署目标替换。storage: local({ directory, baseUrl })本地文件系统存储用于开发与测试不支持签名上传 URL。baseUrl指向媒体代理路由/_emdash/api/media/file。local()与s3()兼容 AWS S3 / R2 S3 API / MinIO都定义在 packages/core/src/astro/storage/adapters.ts 中。默认值即使不配置storage集成也会使用默认的本地存储目录./.emdash/uploadsbaseUrl 同上见 packages/core/src/astro/integration/index.ts。图片配置image.layout: constrained配合responsiveStyles: true启用响应式图片。集成会自动向 Astro 的image.remotePatterns注入存储公开 URL 与本站点源并把图片端点替换为存储直读的包装端点使媒体字节不经 HTTP 回源即可优化Cloudflare Access 场景下尤其关键。如果通过images: false显式关闭媒体将退化为普通img渲染。可选配置项补充在emdash({ ... })中还可以追加以下常用项类型定义见 packages/core/src/astro/integration/runtime.tsmaxUploadSize媒体上传上限字节默认 52,428,80050 MB如emdash({ maxUploadSize: 100 * 1024 * 1024 })。migrations数据库迁移策略默认auto运行期自动执行待应用迁移。fonts管理后台字体默认注入 Noto Sans构建时下载自托管可通过{ scripts: [arabic, japanese] }扩展脚本覆盖或设false完全禁用。admin后台白标配置可覆写 logo、站点名与 favicon。toolbar公开页编辑器工具栏投递方式server默认/client/false。objectCache可选的对象缓存后端内存或 Cloudflare KV用于缓解 D1/SQLite 读压力。反向代理场景allowedDomains 与 siteUrl当站点位于 TLS 终结的反向代理之后时Astro.url拿到的是内部地址如http://localhost:4321而非公网地址如https://mysite.example.com。这会导致 PasskeyWebAuthn、CSRF、OAuth、重定向等机制全部失效因为这些安全流程都以浏览器地址栏里的 origin 为准。第一步声明允许的公网主机名。通过 Astro 的security.allowedDomains让 Astro 依据X-Forwarded-*请求头重建 URLexport default defineConfig({ // ... security: { allowedDomains: [mysite.example.com], }, });在开发模式下还需同步配置vite.server.allowedHosts否则 Vite 会拒绝代理转发过来的Host头。源码细节当你在emdash()配置了siteUrl时集成会自动向security.allowedDomains注入对应 hostname见 packages/core/src/astro/integration/index.ts同时会把 Astro 内置的security.checkOrigin关闭因为 EmDash 的 CSRF 层checkPublicCsrf支持双 origin 校验——同时接受内部 origin 与getPublicOrigin()解析出的公网 origin从而兼容 Docker 等“域名在容器启动时才可知”的部署方式。第二步设置siteUrl。如果重建出的 URL 与浏览器仍不一致TLS 终结场景很常见直接在集成中显式声明emdash({ siteUrl: https://mysite.example.com, // ... });也可以使用环境变量注入容器部署特别方便EMDASH_SITE_URLhttps://mysite.example.com # or: SITE_URLhttps://mysite.example.comsiteUrl取代了旧的passkeyPublicOrigin后者只修复 Passkey 一个问题现在它统一作用于Passkey、CSRF origin 匹配、OAuth 重定向、登录重定向、MCP 发现、快照导出、sitemap、robots.txt 以及 JSON-LD 结构化数据。从 packages/core/src/astro/integration/index.ts 的实现可以看到两点约束siteUrl必须是http或https协议否则启动即报错它会被规范化为origin 形态不含路径存储这是安全不变量 L-1 的一部分。环境变量回退的优先级为EMDASH_SITE_URLSITE_URL 请求 URL 的 origin运行期由getPublicOrigin()解析见 packages/core/src/api/site-url.ts。正因为回退发生在运行期而非构建期Docker 镜像可以在构建时不含域名、启动时再通过环境变量注入。推荐做法TLS 在前端终结时用astro dev --host 127.0.0.1回环地址启动开发服务器通常就足够——代理能在本地访问到 dev server而siteUrl与浏览器中的 HTTPS origin 保持一致无需把 Node 端口暴露到局域网。Cloudflare 部署D1 R2在 Cloudflare Workers 上运行需要替换数据库与存储适配器并配置wrangler.jsonc绑定import cloudflare from astrojs/cloudflare; import react from astrojs/react; import { d1, r2 } from emdash-cms/cloudflare; import { defineConfig } from astro/config; import emdash from emdash/astro; export default defineConfig({ output: server, adapter: cloudflare(), image: { layout: constrained, responsiveStyles: true, }, integrations: [ react(), emdash({ database: d1({ binding: DB, session: auto }), storage: r2({ binding: MEDIA }), }), ], devToolbar: { enabled: false }, });对应wrangler.jsonc必须声明 D1 数据库与 R2 桶的绑定{ name: my-site, compatibility_date: 2026-02-24, compatibility_flags: [nodejs_compat], assets: { directory: ./dist }, d1_databases: [ { binding: DB, database_name: my-site, }, ], r2_buckets: [ { binding: MEDIA, bucket_name: my-site-media, }, ], }需要留意的差异点d1({ binding: DB, session: auto })中的session: auto表示按需启用 D1 会话read-replica session支持——DatabaseDescriptor中的supportsRequestScope标志会要求运行期入口导出createRequestScopedDb用于每请求级数据库句柄见 packages/core/src/db/adapters.ts。R2 存储通过 Worker 绑定访问无需显式凭据emdash-cms/cloudflare是 Cloudflare 专属适配器包其对应 Node 端仓库示例可参考 demos/cloudflare 目录。compatibility_flags中的nodejs_compat是运行 EmDash 运行时的常规要求具体以你所使用的版本为准。Plugins在 astro.config.mjs 中注册插件EmDash 的插件体系通过emdash()的plugins数组接入官方示例使用审计日志插件import auditLog from emdash-cms/plugin-audit-log; emdash({ database: sqlite({ url: file:./data.db }), storage: local({ directory: ./uploads, baseUrl: /_emdash/api/media/file }), plugins: [auditLog], }),插件的PluginDescriptor结构见 packages/core/src/astro/integration/runtime.ts包含id、version、entrypoint、options、adminEntry后台 React 组件入口、componentsEntry站点侧 Astro 渲染组件等字段。两种格式需要区分standard格式通过definePlugin({ hooks, routes })导出可运行在plugins: []进程内或sandboxed: []V8 isolate 沙箱中适合发布到插件注册表的三方插件native格式通过createPlugin(options)返回ResolvedPlugin只能在plugins: []中运行不能沙箱化或发布到市场。沙箱插件通过sandboxed: []声明并需要配套sandboxRunnerCloudflare 场景使用emdash-cms/cloudflare的sandbox()。集成启动时会校验插件格式与放置位置的匹配关系例如 standard 插件声明adminEntry或 native 插件被放入sandboxed: []都会直接抛错见 packages/core/src/astro/integration/index.ts。仓库自带的插件示例可在 packages/plugins 目录中查看audit-log、webhook-notifier、api-test 等。live.config.ts注册内容集合每个 EmDash 站点都必须有src/live.config.ts文件且内容是固定的样板import { defineLiveCollection } from astro:content; import { emdashLoader } from emdash/runtime; export const collections { _emdash: defineLiveCollection({ loader: emdashLoader() }), };该文件将 EmDash 的实时内容集合注册进 Astro 的 content layer。所有内容类型都通过单一的_emdash集合对外服务查询具体类型时使用getEmDashCollection(posts)等 API。blank 模板中该文件与上文完全一致见 templates/blank/src/live.config.ts。emdash-env.d.ts 与类型生成emdash-env.d.ts位于项目根目录由开发服务器在启动时自动生成为你的内容集合提供 TypeScript 类型并且会被tsconfig.json包含。自动生成内容的形态如下以Post集合为例/// reference typesemdash/locals / import type { PortableTextBlock } from emdash; export interface Post { id: string; slug: string | null; status: string; title: string; featured_image?: { id: string; src?: string; alt?: string; width?: number; height?: number; }; content?: PortableTextBlock[]; excerpt?: string; createdAt: Date; updatedAt: Date; publishedAt: Date | null; } declare module emdash { interface EmDashCollections { posts: Post; } }集合 schema 发生变更时dev server 会自动重新生成该文件。你也可以手动触发类型生成# From local dev server (writes emdash-env.d.ts at project root) npx emdash types # From remote instance npx emdash types --url https://my-site.pages.dev # Custom output path npx emdash types --output src/types/cms.ts从 packages/core/src/cli/commands/types.ts 的实现看该命令的核心流程是先通过 HTTP 从 EmDash 实例拉取 JSON schemaschemaExport()再请求生成 TypeScript 类型schemaTypes()随后写入输出文件。除了类型文件之外CLI还会在输出目录旁写入.emdash/schema.json保存原始 schema 供工具链使用自定义输出路径时 schema.json 会写到对应目录如src/types/schema.json。生成成功后会打印集合数量、类型文件路径与 schema 版本。package.json两种部署形态的依赖差异Node.js 站点核心依赖如下{ dependencies: { astro: ^6.0.0, emdash: workspace:*, astrojs/node: ^9.0.0, astrojs/react: ^4.0.0, react: ^18.0.0, react-dom: ^18.0.0 } }Cloudflare 形态则将astrojs/node替换为astrojs/cloudflare并新增emdash-cms/cloudflare提供d1、r2、access、sandbox等适配器。blank 模板的完整依赖清单见 templates/blank/package.json其中各依赖版本使用 pnpm workspace 的catalog:统一管理。Dev Server启动、类型刷新与首次设置pnpm dev # Start the Astro dev server npx emdash types # Refresh types from the running site启动时的运行期行为结合 packages/core/src/astro/integration/index.ts 的astro:server:setup钩子与运行期迁移逻辑首次请求自动迁移运行期会执行待应用的数据库迁移pending migrations。空库自动播种当数据库为空且 setup 尚未完成时会应用内置的 seed 数据。类型自动生成dev server 监听端口后立即触发首次emdash-env.d.ts生成并在 schema 变更时通过防抖刷新钩子createDebouncedTypegenRefresh自动重写文件。管理后台地址http://localhost:4321/_emdash/admin。首次运行会进入 setup 向导创建管理员账户。开发快捷入口dev 模式下会打印/_emdash/api/setup/dev-bypass链接可跳过 Passkey 设置直接以开发管理员身份登录该端点在生产环境返回 403同时会打印管理后台与 MCP server/_emdash/api/mcp的绝对可点击地址。至此一个 EmDash 站点从集成注册、数据存储、类型系统到部署形态的完整配置链路已经清晰astro.config.mjs定义运行底座live.config.ts打通内容层emdash-env.d.ts提供类型保障package.json决定部署形态。无论是本地 Node 自托管、容器化反代部署还是 Cloudflare Workers 边缘运行都可以在这一套配置体系内完成切换。赞分享CMS后端前端插件系统【免费下载链接】emdashEmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress项目地址https://gitcode.com/gh_mirrors/emdas/emdash点击查看免费下载相关推荐EmDash 站点配置完全指南从 astro.config.mjs 到类型生成EmDash 站点配置完全指南从 astro.config.mjs 到类型生成 EmDash 是基于 Astro 构建的全栈 TypeScript CMS站CMS后端前端插件系统EmDash 站点配置完全指南从 astro.config.mjs 到类型生成与多环境部署EmDash 站点配置完全指南从 astro.config.mjs 到类型生成与多环境部署 EmDash 是一个构建于 Astro 之上的全栈 TypeScrCMS后端前端插件系统AI文本生成革命零基础打造专属智能助手的终极指南 AI文本生成革命零基础打造专属智能助手的终极指南 想要在本地运行强大的AI语言模型打造完全私有的智能助手吗TextGen正是你需要的开源桌面应用程序CMS后端前端插件系统上一篇PDF补丁丁深度应用指南5个高效技巧让PDF处理效率翻倍下一篇uvw定时器与事件循环深度解析掌握异步编程的核心机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
正在现场:3个步骤搞定版本升级API变更,新手避坑指南 正在现场:3个步骤搞定版本升级API变更,新手避坑指南 昨天刚把生产环境的依赖库从 v2.0 升到 v3.0,代码跑起来直接报错,满屏的 AttributeError 和 TypeError 。这种 版本升级后 API 全变了… · 2026/9/23 13:11:48
3招搞定魅族note项目性能优化,告别代码报错 3招搞定魅族note项目性能优化,告别代码报错 复制来的代码跑不通,报错信息一堆,你盯着屏幕是不是想砸键盘?别急,这不仅是环境问题,更是性能优化没到位。在魅族note这类国产ROM定制机型上,内存管理和GC策略与标准安卓差异巨大,直接套用开… · 2026/9/23 13:11:42
2026最新碟中碟虚拟光驱性能优化实战 2026最新碟中碟虚拟光驱性能优化实战 配置环境就卡半天,这是很多开发者在搭建本地开发环境时的噩梦。特别是当我们需要处理老旧的 ISO… · 2026/9/23 13:11:41
3个核心逻辑拆解致加西亚的一封信面试必问 3个核心逻辑拆解致加西亚的一封信面试必问 刚拿到 Offer 的应届生最容易在技术二面卡住,不是因为代码写不出,而是面对面试官抛出的 java.lang.NullPointerException 或者 Python 的… · 2026/9/23 14:33:57
OpenClaw命令行工具实战指南与高效运维技巧 1. OpenClaw工具概述OpenClaw作为一款开源的命令行工具集,主要面向开发者和系统管理员提供高效的自动化操作能力。这个工具包最初由某技术团队在2018年发布,经过多年迭代已经形成了包含文件处理、系统监控、网络调试等六大模块的完整生态。不同于其他命令… · 2026/9/23 14:33:57
MATLAB遗传算法实现多机器人任务分配 简介:本资源是一份面向机器人系统开发工程师与智能优化研究者的MATLAB实践项目,聚焦遗传算法在多机器人任务分配中的建模、实现与性能评估,适用于工业自动化、物流调度及协同侦察等实际场景。压缩包共590个文件,主体为482个MATLAB… · 2026/9/23 14:33:57
千笔论文辅助工具:智能写作与文献管理全解析 1. 工具定位与核心价值解析作为一名经历过研究生阶段的科研工作者,我深知论文写作过程中的痛点:文献管理混乱、格式调整耗时、语言表达不专业、查重降重效率低下。千笔这款工具正是针对这些痛点设计的全流程论文辅助系统,它不同于简单的语法检… · 2026/9/23 14:33:57
C语言五子棋课程设计源码:可编译运行的ANSI C工程实践 简介:本资源是一份面向高校C语言初学者的课程设计实践项目,聚焦五子棋游戏开发,帮助学生通过完整可运行的代码掌握控制流程、二维数组应用、胜负判定算法及基础I/O交互等核心编程能力。压缩包共3个文件(29KB)ÿ… · 2026/9/23 14:33:57
Java图书管理系统:MySQL事务+Swing GUI实战指南 简介:本资源是一套完整的Java课程设计级图书管理系统实现方案,面向计算机专业本科生及Java初学者,解决图书馆基础业务管理需求,涵盖管理员登录、图书增删改查、用户信息管理、借阅归还全流程等核心功能。压缩包共187个文件&#x… · 2026/9/23 14:33:51
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29