为什么GrapesJS适合Nuxt 3
GrapesJS 需要 DOM,所以在 Nuxt 3 中你会在 onMounted
(仅客户端)而Nitro服务器路由负责保存。本指南安装了
编辑器,持久化内容,并导出 HTML/CSS。
1. 挂载编辑器客户端
创造 pages/editor.vue。在内部动态导入 GrapesJS
onMounted 所以在SSR期间它从未运行过。
<template>
<div>
<button @click="save">Save</button>
<div ref="el"><h1>Edit me in GrapesJS</h1></div>
</div>
</template>
<script setup>
import 'grapesjs/dist/css/grapes.min.css';
const el = ref(null);
let editor;
onMounted(async () => {
const grapesjs = (await import('grapesjs')).default;
editor = grapesjs.init({
container: el.value,
height: '100vh',
fromElement: true,
storageManager: false,
});
});
onBeforeUnmount(() => editor?.destroy());
async function save() {
await $fetch('/api/page', {
method: 'POST',
body: {
html: editor.getHtml(),
css: editor.getCss(),
project: editor.getProjectData(),
},
});
}
</script>
2. 添加Nitro服务器路由
创作 server/api/page.post.ts:
export default defineEventHandler(async (event) => {
const data = await readBody(event);
await savePage('home', data); // your DB write
return { status: 'ok' };
});
添加匹配 server/api/page.get.ts 以返回已保存的项目,
然后在 init 后再打电话 editor.loadProjectData(saved) 重新打开。
3. 导出加价
const html = editor.getHtml();
const css = editor.getCss();
// `<style>${css}</style>${html}`
Nuxt 3 常见的陷阱
Nuxt的SSR是常见的罪魁祸首。顶层import grapesjs from 'grapesjs'在服务器渲染时运行并抛window is not defined出——可以动态onMounted导入 ,或者将编辑器包裹在 <ClientOnly>。通过 Nitro 服务器路由 和 server/api $fetch保持数据库代码在服务器上。如果依赖在构建过程中仍然抱怨,就加到build.transpilenuxt.config里面。并且要打电话editor.destroy(),onBeforeUnmount避免路径更改泄露编辑器实例。
前提条件
你需要Node.js 18+ 和一个 Nuxt 3 应用。没有针对 Nuxt 的 GrapesJS 包
必须——编辑器仅支持浏览器,Nitro服务器路由处理保存。
熟悉Composition API, onMounted以及
server/api 路线就足够了。
向编辑器添加自定义方块
init 后(内部 onMounted)用块管理器注册可拖拽的块:
editor.BlockManager.add('hero', {
label: 'Hero section',
category: 'Sections',
content: '<section class="hero"><h1>Headline</h1><p>Copy</p></section>',
});
从GJS拉取现成的块库和预设。市场要买更丰富的套装。
储存深潜:氮气航线
通过Nitro服务器路由持续保存,确保数据库代码留在服务器上:
// server/api/page.post.ts
export default defineEventHandler(async (event) => {
const data = await readBody(event);
await savePage('home', data);
return { status: 'ok' };
});
// server/api/page.get.ts returns the saved project; then
// editor.loadProjectData(saved) after init reopens it.
表演技巧
动态导入GrapesJS onMounted ,避免它进入
服务器渲染路径和主捆绑包,并调用 editor.destroy()
onBeforeUnmount 所以路线更改不会泄露实例。如果是依赖关系
在构建时抱怨,就加 build.transpile 进去
nuxt.config。
安全考量
在写作前,先验证并授权Nitro存档路线。消毒储存 如果非管理员可以编辑,输出时会有标记。验证有效载荷大小,因此为大型 项目无法耗尽内存。
排查常见问题
“窗口未定义” 意味着GrapesJS在SSR期间运行——导入
动态地嵌入 onMounted 编辑器内部,或者将编辑器包裹在
<ClientOnly>。 关于依赖的构建错误
通常通过将其加到 build.transpile。 一个未被打扮的
或者空白画布 意味着样式表没加载,或者参考资料还没准备好。
何时使用 GrapesJS 配合 Nuxt 3
GrapesJS 适合你的 Nuxt 应用嵌入真实的可视化页面或邮件构建器 用户控制,拥有自己的存储和HTML输出。对于内嵌富文本,a 更轻的编辑器就足够了;适合全页构图,包含版面、样式和干净 export,GrapesJS 是更强大的、获得 MIT 许可的自托管选择。
下一步
参见相关的 GrapesJS + Vue 和 GrapesJS + Svelte 指南,浏览一下 GrapesJS市场,或者从那里开始 GJS。市场主页。
常见问题
GrapesJS 能和 Nuxt 3 SSR 一起使用吗?
是的——初始化或 onMounted 包裹
<ClientOnly> 所以它只在浏览器里运行。
我如何在Nuxt 3中保存GrapesJS的内容?
将项目数据发布到 $fetch Nitro 路线
server/api。
为什么我的构建会失败,显示“窗口未定义”?
GrapesJS 正在模块顶层导入,并在 SSR 期间运行。导入
而是动态地在内 onMounted 心。
