DUICUO

この海外のオープンソース フレームワークを使用すると、独自のページ エディターを簡単に構築できます。

[[416380]]

私のいつもの書き方に従って、誰もが効率的かつ選択的に読んで学習できるように、記事の概要を以下にリストします。

  • GrapesJS フレームワークの基本紹介
  • GrapesJS を使って Web エディタを構築する方法
  • craft.js は、GrapesJS 上に構築されたオープンソースの Web ページ エディターです。
  • その他のビジュアルエディタの推奨事項

基本的な紹介

chrome-capture.gif

一見すると、単なるページ/HTMLエディタだと思うかもしれませんが、実際にはそれだけではありません。GrapesJSは汎用性の高いウェブページ構築フレームワークで、ドラッグ&ドロップに対応したHTML風の構造を持つビルダーを簡単に作成できます。GrapesJSはウェブページだけにとどまりません。HTML風の構造を使用するシナリオには、以下のようなものがあります。

  • ニュースレター(例:MJML)
  • ネイティブモバイルアプリケーション(React Nativeなど)
  • ネイティブ デスクトップ アプリケーション (Vuido など)
  • PDF(例:React PDF)

さらに、GrapesJS に含まれる機能とツールにより、使いやすいエディタを作成できます。これにより、ユーザーはコーディングの知識がなくても、複雑な HTML 風のテンプレートを作成できます。

GrapesJS の Web サイトには、独自の Web エディターをすばやく作成するために参照できる 3 つの異なるシナリオ例も提供されています。

  • ウェブページビルダー
  • ニュースレタービルダー
  • MJML を使用したニュースレタービルダー

これらのフレームワークの実装原理については、以前の記事で多くの分析と設計を行ってきました。ご興味のある方は、ぜひご参照ください。次に、インストール方法と使用方法を見ていきましょう。

GrapesJS を使って Web エディタを構築する方法

1. インストール

umd メソッドを使用してインポートできます。

  1. <link rel= "スタイルシート" href= "//unpkg.com/grapesjs/dist/css/grapes.min.css" >
  2. <script src= "//unpkg.com/grapesjs" ></script>

npm 経由でインストールすることもできます:

  1. npm と grapesjs -S

次のようにしてプロジェクトにインポートできます。

  1. 'grapesjs/dist/css/grapes.min.css'をインポートします
  2. からgrapesjsをインポート  「ブドウjs

2. 最初のデモ

インストール後、基本的なページ編集デモを実装してみましょう。

クロームキャプチャ (1).gif

関連するコードは次のとおりです。

  1. <html>
  2. <ヘッド>
  3. <link rel= "スタイルシート" href= "//unpkg.com/grapesjs/dist/css/grapes.min.css" >
  4. <script src= "//unpkg.com/grapesjs" ></script>
  5. <スタイル>
  6. #gjs {
  7. 境界線: 3px 実線 #444;
  8. }
  9. .gjs-cv-canvas {
  10. : 0;
  11. 幅: 100%;
  12. 高さ: 100%;
  13. }
  14. </スタイル>
  15. </head>
  16. <本文>
  17. <div id= "gjs" >
  18. <h1>Hello World コンポーネント!</h1>
  19. </div>
  20. <スクリプト>
  21. const エディター = grapesjs.init({
  22. コンテナ: '#gjs '
  23. // オプションの`components: '<h1>Hello World Component!</h1>'も使用できます
  24. fromElement: true
  25. // エディターのサイズ
  26. 高さ: '300px '
  27. 幅: '自動'
  28. // ストレージ管理を無効にする方法については、次の記事で説明します。
  29. ストレージマネージャー: false
  30. パネル: { デフォルト: [] },
  31. });
  32. </スクリプト>
  33. </本文>
  34. </html>

これでシンプルなエディタが作成されます。簡単でしょう?次はもっと強力な機能を見てみましょう。

3. コンポーネントの追加と定義

ウェブページエディタは、ユーザーがページをより簡単に作成できるように、豊富なコンポーネントセットを提供する必要があることは周知の事実です。同様に、Grapes.jsは様々なカスタムコンポーネントの追加をサポートし、よく使われる基本コンポーネントも含まれています。デモを見てみましょう。

クロームキャプチャ(2).gif

上記のデモから、ブロック、テキスト、画像という3つの基本コンポーネントが追加されていることがわかります。基本的な実装コードは次のとおりです。

  1. const エディター = grapesjs.init({
  2. // ...その他の構成
  3. ブロックマネージャー: {
  4. 追加先: '#ブロック'
  5. ブロック: [
  6. {
  7. id: 'セクション'
  8. ラベル: '<b>セクション</b>'
  9. 属性: { クラス: 'gjs-block-section' },
  10. コンテンツ: ` <セクション>
  11. <h1>H5-ドアリング</h1>
  12. <div>モジュール方式で H5 ページを構築する</div>
  13. </セクション>
  14. }, {
  15. id: 'テキスト'
  16. ラベル: 'テキスト'
  17. コンテンツ: '<div data-gjs-type="text">私の赤ちゃん</div>'
  18. }, {
  19. id: '画像'
  20. ラベル: '画像'
  21. 選択: true
  22. コンテンツ: { タイプ: '画像' },
  23. アクティブ化: true
  24. }
  25. ]
  26. },
  27. });

コードを見ると、`blockManager` の `blocks` プロパティに指定されたコンポーネントを追加するだけで済むことがわかります。コンポーネントを動的に追加することも可能です。

  1. editor.BlockManager.add ( '私のブロックID ' , {
  2. // ...ラベルなどのその他の設定
  3. コンテンツ: {
  4. タグ名: 'div '
  5. ドラッグ可能: false
  6. 属性: { '何らかの属性' : '何らかの値' },
  7. コンポーネント: [
  8. {
  9. タグ名: 'span '
  10. コンテンツ: '<b>DooringX</b>'
  11. }, {
  12. タグ名: 'div '
  13. コンポーネント: '<span>無限の可能性</span> '
  14. }
  15. ]
  16. }
  17. })

コンポーネント構成の詳細なドキュメントについては、「Grapes.js コンポーネントの仕組み」のドキュメントを参照してください。

画像.png

4. 機能パネルを追加する

単にコンポーネントを追加するだけでは不十分です。優れたエディターには、さまざまなユーザーのニーズを満たすためのさまざまな機能ボタンも必要です。

キャンバスとカスタム コンポーネントが用意できたので、ボタン付きの機能パネルを作成する方法を見てみましょう (Panels API を使用)。

クロームキャプチャ(3).gif

上部には 3 つの機能ボタンがあります。

  • コンポーネントの境界線を表示しますか?
  • ソースコードを表示
  • JSONを表示

まず、機能パネルを表示するために使用する要素を定義する必要があります (スタイルはカスタマイズできます)。

  1. <div クラス = "panel__top" >
  2. <div クラス = "panel__basic-actions" ></div>
  3. </div>

次に、マウント機能パネルを定義します。

  1. editor.Panels.addPanel({
  2. id: 'パネルトップ'
  3. el: '.panel__top' ,
  4. });
  5. editor.Panels.addPanel({
  6. id : '基本アクション'
  7. el: '.panel__basic-actions' ,
  8. ボタン: [
  9. {
  10. id: '可視性'
  11. アクティブ: true
  12. クラス名: 'btn-toggle-borders' ,
  13. ラベル: '<u>B</u> '
  14. コマンド: 'sw-visibility' ,
  15. }, {
  16. id: 'エクスポート'
  17. クラス名: 'btn-open-export' ,
  18. ラベル: 'Exp '
  19. コマンド: 'export-template' ,
  20. コンテキスト: 'エクスポートテンプレート'
  21. }, {
  22. id: 'show-json '
  23. クラス名: 'btn-show-json' ,
  24. ラベル: 'JSON '
  25. コンテキスト: 'show-json '
  26. コマンド(エディター) {
  27. editor.Modal.setTitle( 'コンポーネントJSON' )
  28. .setContent(`<textarea style= "幅:100%; 高さ: 250px;" >
  29. ${JSON.stringify(editor.getComponents())}
  30. </textarea>`)
  31. 。開ける();
  32. },
  33. }
  34. ],
  35. });

さらに多くの機能を定義することができます。それらの使用方法については、ドキュメントを参照してください。

5. レイヤー管理パネルを追加する

ウェブ要素を扱う際によく目にするツールの一つに、レイヤーマネージャーがあります。ツリー構造になっており、ページ要素を簡単に管理できます。レイヤーマネージャーを有効にするには、レンダリングする場所を指定するだけです。

  1. const エディター = grapesjs.init({
  2. // ...
  3. レイヤーマネージャー: {
  4. 追加先: '.layers-container'  
  5. },
  6. // サイド パネル レイヤー マネージャーとしてデフォルトのパネルを定義できます。
  7. パネル: {
  8. デフォルト: [{
  9. id: 'レイヤー'
  10. el: '.panel__right' ,
  11. // 定義パネルをドラッグできますか?
  12. サイズ変更可能: {
  13. 最大寸法: 350,
  14. minDim: 200,
  15. tc: 0,
  16. cl: 1, // 左側はドラッグ可能
  17. cr: 0,
  18. bc: 0,
  19. keyWidth: 'flex-basis'
  20. },
  21. }]
  22. }
  23. });

効果は以下のとおりです。

クロームキャプチャ (4).gif

右側にレイヤー パネルが表示され、ページ上の要素を簡単に管理できます。

6. スタイル設定パネルを追加する

スタイル パネルも非常にシンプルです。まずは対応するコンテナーを定義しましょう。

  1. <div クラス = "panel__right" >
  2. <div クラス = "レイヤー コンテナ" ></div>
  3. <div クラス = "スタイルコンテナ" ></div>
  4. </div>

次に、対応する構成スクリプトを初期化します。

  1. const エディター = grapesjs.init({
  2. // ...
  3. パネル: {
  4. デフォルト: [
  5. // ...
  6. {
  7. id: 'パネルスイッチャー'
  8. el: '.panel__switcher' ,
  9. ボタン: [{
  10. id: 'show-layers' ,
  11. アクティブ: true
  12. ラベル: 'レイヤー'
  13. コマンド: 'show-layers' ,
  14. // 一度有効にすると、オフにすることできなくなります 
  15. 切り替え可能: false
  16. }, {
  17. id: 'show-style'
  18. アクティブ: true
  19. ラベル: 'スタイル'
  20. コマンド: 'show-styles' ,
  21. 切り替え可能: false
  22. }],
  23. }
  24. ]
  25. },
  26. セレクタマネージャー: {
  27. 追加先: '.styles-container'  
  28. },
  29. スタイルマネージャー: {
  30. appendTo: '.styles-container' ,
  31. セクター: [{
  32. 名前: 'ディメンション'
  33. オープン
  34. ビルドプロパティ: [ 'width' , 'min-height' , 'padding' ],
  35. プロパティ: [
  36. {
  37. タイプ: '整数'
  38. 名前: '幅'
  39. プロパティ: 'width'
  40. 単位: [ 'px' , '%' ],
  41. デフォルト: 'auto'
  42. 最小: 0,
  43. }
  44. ]
  45. },{
  46. 名前: 'Extra '
  47. オープン
  48. buildProps: [ 'background-color' , 'box-shadow' , 'custom-prop' ],
  49. プロパティ: [
  50. {
  51. id: 'カスタムプロパティ'
  52. 名前: 「カスタムラベル
  53. プロパティ: 'font-size'
  54. タイプ: '選択'
  55. デフォルト: '32px'
  56. オプション: [
  57. { 値: '12px' 名前: 'Tiny' },
  58. { 値: '18px' 名前: '中' },
  59. { 値: '32px' 名前: '大きい' },
  60. ],
  61. }
  62. ]
  63. }]
  64. },
  65. });
  66.  
  67. // 命令を定義する
  68. editor.Commands.add ( 'show-layers' ,{
  69. getRowEl(editor) { editor.getContainer().closest( '.editor-row' );を返します。 },
  70. getLayersEl(row) { row.querySelector( '.layers-container' )を返す},
  71.  
  72. 実行(編集者、送信者) {
  73. const lmEl = this.getLayersEl(this.getRowEl(エディター));
  74. lmEl.style.display = '' ;
  75. },
  76. stop(編集者、送信者) {
  77. const lmEl = this.getLayersEl(this.getRowEl(エディター));
  78. lmEl.style.display = 'なし' ;
  79. },
  80. });
  81. editor.Commands.add ( 'show-styles' , {
  82. getRowEl(editor) { editor.getContainer().closest( '.editor-row' );を返します。 },
  83. getStyleEl(row) { row.querySelector( '.styles-container' )を返す},
  84.  
  85. 実行(編集者、送信者) {
  86. const smEl = this.getStyleEl(this.getRowEl(エディター));
  87. smEl.style.display = '' ;
  88. },
  89. stop(編集者、送信者) {
  90. const smEl = this.getStyleEl(this.getRowEl(エディター));
  91. smEl.style.display = 'なし' ;
  92. },
  93. });

設定後の効果を見てみましょう。

クロームキャプチャ (5).gif

7. さらなる使用方法のデモンストレーション

上記の機能に加えて、次のことも実現できます。

  • 応答モード(PC、モバイル、iPad)を定義します。
  • データの保存と読み込みのモードを設定します。
  • カスタムテーマ
  • 国際化されたi18nサポート

ここでは詳細には触れませんが、設定後のデモを見てみましょう。

chrome-capture (6).gif

craft.js は、GrapesJS 上に構築されたオープンソースの Web ページ エディターです。

GrapesJSには、探索すべき興味深い機能が数多くあります。次に、GrapesJSの二次ラッパーであるcraft.jsというオープンソースのエディターフレームワークを紹介します。

クロームキャプチャ (7).gif

プラグインを通して独自のエディタを構築できます。以下はReactでの適用例です。

  1. {エディター、フレーム、キャンバス、セレクター}をインポートします  "@craftjs/core" ;
  2. // この記事コンポーネントを定義する
  3. {useNode}インポートする  "@craftjs/core" ;
  4.  
  5. const TextComponent = ({text}) => {
  6. const { コネクタ: {ドラッグ} } = useNode();
  7.  
  8. 戻る
  9. <div ref={ドラッグ}>
  10. <h2>{テキスト}
  11. </div>
  12. }
  13.  
  14. // エディターを初期化する
  15. const App = () => {
  16. 戻る
  17. <div>
  18. <編集者>
  19. // 編集可能な領域
  20. <フレームリゾルバ={TextComponent, Container}>
  21. <キャンバス>
  22. <TextComponent text= "フロントエンド開発についての楽しいトーク - Xu Xiaoxi" />
  23. </キャンバス>
  24. </フレーム>
  25. </編集者>
  26. </div>
  27. }

その他のビジュアルエディタの推奨事項

  • h5-Dooring | H5エディター、モジュール形式でH5ページを構築
  • v6.dooring | ビジュアル大画面セットアップソリューション
  • craft | Reactベースのドラッグアンドドロップページジェネレーター
  • dooringx-lib | ビジュアルドラッグアンドドロッププラットフォームを迅速かつ効率的に構築

やっと

今後、データ可視化とエンジニアリングの分野で、より実用的なオープンソースプロジェクトやフレームワークをリリースしていく予定です。ご質問やご要望がございましたら、お気軽にご連絡ください。

この記事はWeChat公式アカウント「Fun Talk Front-End」から転載したものです。以下のQRコードからフォローできます。転載の許可については、「Fun Talk Front-End」公式アカウントまでお問い合わせください。