尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GrapesJS 组件脚本中如何使用外部 JS 库依赖?

GrapesJS 组件脚本中如何使用外部 JS 库依赖? GrapesJS 组件脚本中如何使用外部 JS 库依赖【免费下载链接】grapesjsFree and Open source Web Builder Framework. Next generation tool for building templates without coding项目地址: https://gitcode.com/GitHub_Trending/gr/grapesjs在 GrapesJS 中给组件计数器、轮播、图库这类需要初始化逻辑的组件绑定 JavaScript 时最常见的障碍是你在编辑器页面加载的外部 JS 库在组件脚本里直接调不到。原因是所有组件脚本都运行在画布canvas的 iframe 内与编辑器所在的document相互隔离——这与最终导出模板的运行环境一致。本文基于官方 Components JS 指南该指南要求 GrapesJS v0.16.34 或更高版本给出两种官方支持的依赖接入方式组件级动态加载依赖以及模板级通过画布配置注入脚本并说明如何验证结果。先弄清脚本的执行环境组件通过script属性挂载脚本脚本的this指向组件对应的 DOM 元素。官方示例// 自定义脚本避免使用箭头函数 const script function () { alert(Hi); // this 绑定到组件元素 console.log(the element, this); }; // 定义新的自定义组件 editor.Components.addType(comp-with-js, { model: { defaults: { script, // 加一点样式让组件可见 style: { width: 100px, height: 100px, background: red }, }, }, }); // 创建一个 block方便拖入画布 editor.Blocks.add(test-block, { label: Test block, attributes: { class: fa fa-text }, content: { type: comp-with-js }, });把 block 拖入画布后你会看到 alert 弹窗和 console 输出。通过编辑器导出按钮或editor.getHtml()查看生成的 HTML以下输出为文档示例div idc764/div script var items document.querySelectorAll(#c764); for (var i 0, len items.length; i len; i) { (function () { // START component code alert(Hi); console.log(the element, this); // END component code }).bind(items[i])(); } /script编辑器会给每个带脚本的组件分配唯一 ID并用querySelectorAll批量查找后逐个绑定脚本。再拖入一个同类组件生成的选择器会变成#c764, #c765两个元素共用一段脚本。由此引出两个直接约束脚本在画布 iframe 内独立执行和最终模板一样没有携带任何依赖。你在编辑器外层加载的库在脚本中不可用。脚本内不能引用函数作用域之外的变量。例如在编辑器页面定义const myVar John脚本里写alert(Hi myVar)会得到myVarundefined 错误——因为导出的 HTML 中只有脚本函数体本身编辑器页面的变量不会被带进去。方式一组件级脚本内动态加载依赖适合“某个组件依赖某个库”的场景。官方评价这是首选方式依赖会动态加载并且只有当该组件存在于画布中时才打印到最终 HTML。做法是在初始化脚本执行前先检查库是否已定义未定义则创建script标签加载后再初始化const script function (props) { const initLib function () { const el this; const myLibOpts { prop1: props.myprop1, prop2: props.myprop2, }; someExtLib(el, myLibOpts); }; if (typeof someExtLib undefined) { const script document.createElement(script); script.onload initLib; script.src https://.../somelib.min.js; document.body.appendChild(script); } else { initLib(); } };代码块中someExtLib是你的外部库在浏览器中暴露的入口名script.src需替换为该库的实际地址源文档使用https://.../somelib.min.js占位。script.onload initLib保证库加载完成后才执行初始化避免库未就绪就调用。如果初始化库需要用到组件属性例如不同组件实例用不同选项初始化用script-props声明要传入的属性const script function (props) { // props 只包含你在 script-props 中声明的属性 const myLibOpts { prop1: props.myprop1, prop2: props.myprop2, }; alert(My lib options: JSON.stringify(myLibOpts)); }; editor.Components.addType(comp-with-js, { model: { defaults: { script, // 自定义属性的默认值 myprop1: value1, myprop2: 10, // 定义 traits使属性可编辑 traits: [ { type: select, name: myprop1, changeProp: true, options: [ { value: value1, name: Value 1 }, { value: value2, name: Value 2 }, ], }, { type: number, name: myprop2, changeProp: true, }, ], // 声明要传给脚本的属性这些属性变化时脚本会重新执行 script-props: [myprop1, myprop2], }, }, });script-props数组里的属性会变化触发脚本重置并用新值重新执行所以修改 trait 后库会以新的props重新初始化。方式二模板级通过 canvas 配置注入脚本如果一个依赖会被全部组件共用例如 jQuery不必在每个组件脚本里重复加载可以直接注入画布const editor grapesjs.init({ // ... canvas: { scripts: [https://.../somelib.min.js], // 外部样式同理 styles: [https://.../ext-style.min.css], } });canvas配置项在初始化时传入完整字段见 Canvas API。这种方式有一个必须知道的边界编辑器不会把这些依赖渲染到导出的 HTML 中例如editor.getHtml()的产物里不含它们。最终页面在哪里渲染这份 HTML就要由你自行把同样的脚本引入该页面否则组件初始化脚本会在最终环境中报“库未定义”。因此模板级方式适合库确实随最终页面全局可用的项目组件级方式则能保证导出 HTML 自包含。验证接入是否生效按场景分别检查画布内行为把带依赖的 block 拖入画布。组件级方式下脚本会自行插入script标签加载库加载完成后执行初始化你能观察到 alert 或 console 输出文档示例为alert(Hi)和console.log(the element, this)。生成 HTML通过导出按钮或editor.getHtml()检查产物。组件级依赖会随组件出现在 HTML 中——组件不在画布时对应的依赖脚本也不会出现模板级依赖则按上述说明不会出现在导出结果里这是预期行为而非缺陷。脚本加载时机如果需要确认画布 iframe 的 head 中脚本即canvas.scripts注入的脚本已加载完成可以监听 Canvas API 中定义的canvas:frame:load:head事件它在 iframe 完成 head 元素如脚本加载后触发editor.on(canvas:frame:load:head, ({ window }) { console.log(Frame head loaded, window); });限制与注意点该指南含依赖两种方案要求GrapesJS v0.16.34 或更高版本低版本不支持。组件脚本会随组件序列化进 HTML源文档明确提示避免使用箭头函数导出产物中脚本以函数表达式形式出现。脚本内引用编辑器页面作用域的变量、或依赖编辑器页面加载的库都会得到 undefined 错误遇到这类报错先确认脚本是否只用到了组件自身上下文和通过script-props传入的数据。组件的script相关属性完整说明见 Component APIscript、script-export组件模型与 block 的通用定义见 Components 指南。【免费下载链接】grapesjsFree and Open source Web Builder Framework. Next generation tool for building templates without coding项目地址: https://gitcode.com/GitHub_Trending/gr/grapesjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表