ساختیم
ksimonsKevin Simons
Kitemaker (https://kitemaker.co)ساخت یک ویرایشگر عالی برای برنامه وب مبتنی بر React خود به هیچ وجه آسان نیست. اما با SlateJS کارها بسیار راحت تر می شوند. حتی با کمک Slate ، ساخت یک ویرایشگر با امکانات کامل بیشتر از آن است که بتوانیم در یک پست وبلاگ آن را پوشش دهیم ، بنابراین این پست تصویر بزرگی به شما می دهد و پست های بعدی به جزئیات کثیف فرو می روند. < p class = "paragraf"> توجه: این پست بر اساس بحث اخیر در نشست جاوا اسکریپت NYC است. می توانید ویدئو را در اینجا تماشا کنید:
[محتوای جاسازی شده]
SlateJS
ما در حال ساخت Kitemaker هستیم ، جدید ، سریع و گزینه ای بسیار مشارکتی برای انتشار ردیاب هایی مانند Jira ، Trello و Clubhouse. ما معتقد به کارهای از راه دور و به ویژه کار غیرهمزمان هستیم تا اعضای تیم زمان طولانی و بدون وقفه ای برای انجام کار داشته باشند. نکته اصلی در حمایت از این نوع کارها داشتن یک ویرایشگر بسیار عالی است تا تیم ها از همکاری در زمینه مسائل و اطمینان از هم ترازی الهام بگیرند. و ما فکر می کنیم بهترین ویرایشگر را در اختیار داریم:
کلید های میانبر نشانه دار، بلوک های کد با نحو برجسته، تصاویر ، جاسازی طرح ها از Figma ، عبارات ریاضی با LaTex ، نمودارهای MermaidJS و البته شکلک ها ♥. همه کارها کاملاً با Slate انجام شده است.
پس چرا اولاً تصمیم گرفتیم که با Slate همراه شویم؟ این قطعاً تنها چارچوب ویرایشگر موجود نیست. برای ما ، مواردی که ما را به سمت تخته سنگ سوق داد:
- درباره چگونگی ساختار سند شما نظر ندارد و این انعطاف پذیری لازم را به ما می دهد
- این کار هر نوار ابزار داخلی یا سایر تصاویر را به شما تحمیل نکنید
- با در نظر گرفتن React ساخته شده است و تفاوت زیادی در هنگام ارائه اسناد پیچیده ایجاد می کند
- این اساس همکاری را ایجاد می کند ویرایش که چیزی است که به اعتقاد ما برای Kitemaker مهم است
- ما فلسفه موجود در آن را واقعاً دوست داریم
- این یک جامعه پر رونق است ، به ویژه در Slack
چگونه Slate اسناد را نمایندگی می کند
یکی از بهترین قسمت های Slate این است که چگونه نظرات کمی درباره نحوه ساختار اسناد ارائه می دهد. این فقط چند مفهوم دارد:
- ویرایشگر – ظرف سطح بالای سند شما
- عناصر سطح بلوک – “بخش” های خاص دامنه که اسناد شما را تشکیل می دهند ، مانند پاراگراف ها ، بلوک های کد و لیست ها. اینها مواردی است که می توانید در سند خود بین آنها خطوط افقی بکشید
- عناصر درون خطی – عناصر ویژه ای که متناسب با متن سند شما جریان دارند ، مانند پیوندها
- گره های متنی – اینها حاوی متن واقعی در سند
- علائم – حاشیه نویسی هایی که روی متن قرار می گیرند ، مانند علامت گذاری متن به صورت پررنگ یا مورب
خوانندگان تیزبین متوجه می شوند که این ساختار آن بسیار شبیه به DOM است و متن ، بلوک و خطوط داخلی Slate بسیار شبیه به همتایان خود در DOM رفتار می کنند. بصری:
تخته سنگ از قالب JSON بسیار ساده ای برای نمایش اسناد استفاده می کند و سند بالا به این شکل است من n نمایندگی تخته سنگ:
]
همانطور که قبلاً گفتیم ، اسلیت در مورد نحوه ساختار اسناد واقعاً نظری ندارد در لکه JSON در بالا ، تنها موردی که Slate به آن اهمیت می دهد این است که آرایه ای از عناصر بلوک با خاصیت کودکان بدست می آورد و این کودکان یا عناصر بلوک دیگری هستند یا مخلوطی از گره های متنی و عناصر درون خطی هستند. خودشه. Slate به نوع ، url یا مشخصات پررنگ اهمیت نمی دهد و همچنین به نحوه ارائه این گره های مختلف اهمیتی نمی دهد. این کار کار با آن را واقعاً انعطاف پذیر و قدرتمند می کند.
سلام ویراستار جهان
پس زمینه کافی. بیایید چند کد را بررسی کنیم! بیایید ببینیم یک م Sلفه ویرایشگر ساده با استفاده از Slate به نظر می رسد:
}
- و همین. این یک م componentلفه کاملاً مفید با Slate است!
- ما از createEditor () برای ایجاد ویرایشگر استفاده می کنیم (فعلا نگران نباشید withReact () – این یک افزونه است که در زیر به آن خواهیم پرداخت)
- ما یک یک آرایه ساده از گره ها برای ذخیره سند (دقیقاً همانطور که در بالا نگاه کردیم)
- ما یک م <لفه
را ارائه می دهیم که به عنوان یک ارائه دهنده زمینه عمل می کند ، ویرایشگر ایجاد شده در بالا را برای تمام اجزای زیر آن ارائه می دهیم . این واقعاً جالب است زیرا به عنوان مثال می توانید در زیر م toolلفه نوار ابزار و سایر م componentsلفه ها را اضافه کنید که می تواند ویرایشگر را گرفته و سند را با آن دستکاری کند. ما همچنین مقدار و ویژگی های onChange را سیم کشی می کنیم ، شبیه هر ورودی در React - ما یک م <لفه
اضافه می کنیم که ویرایشگر واقعی است که کاربر با آن در صفحه ارتباط برقرار می کند
خسته کننده است. چگونه کارها را گسترش دهیم؟
بنابراین ، در حالی که نوشتن آن مثال قبلی پیش پا افتاده بود ، ما هنوز فقط یک ویرایشگر داریم که در مورد آن کار می کند و همچنین
خوشبختانه Slate مکانیزمی را برای جالب تر کردن همه چیز فراهم می کند: p>
- پلاگین ها: strong> پلاگین ها به ما اجازه می دهد تا نادیده بگیریم رفتار اصلی ویراستار. آنها مربوط به رندر نیستند ، فقط مهم این است که آنچه هنگام وارد شدن متن یا افتادن یک تصویر اتفاق می افتد li>
- گردانندگان رویداد: به ما امکان می دهد مواردی مانند با فشار دادن کلید ، بنابراین می توانیم کلیدهای میانبر را اضافه کنیم یا اجازه دهید “tab” را فشار دهید تا یک لیست گلوله ای ایجاد شود. li>
- ارائه سفارشی با React: با Slate می توان دقیقاً نحوه ایجاد هر گره را تعیین کرد سند ما باید با استفاده از React
ارائه شود بیایید نگاهی سریع به هر یک از اینها بیندازیم. p>
پلاگین ها h2>
پلاگین ها مفهومی فریبنده و ساده ، قدرتمند در Slate هستند. به طور کلی افزونه ها چیزی شبیه به این دارند: p>
طبق قرارداد ، نام آنها با p> با شروع می شود. آنها یک ویرایشگر Slate می گیرند ، هر عملکردی را که برای لغو نیاز دارند لغو می کنند و ویرایشگر اصلاح شده را به عقب برمی گردانند. اغلب اوقات ، آنها در برخی از این عملکردها موارد کمی را کنترل می کنند و برای بقیه به حالت پیش فرض برمی گردند. هشدار تخریب: strong> حدود 80٪ اضافه کردن قابلیت ها به ویرایشگر Slate انجام تطبیق رشته در این توابع پلاگین است و سپس سند را با استفاده از API غنی Slate دستکاری می کنید.
توابع بیشتری وجود دارد شما می توانید بیش از مواردی که در بالا نشان داده شده است ، لغو کنید ، اما اینها رایج ترین آنها هستند. می توانید همه اطلاعات مربوط به افزونه ها را در مستندات Slate بخوانید. p>
یکی از قدرتمندترین قسمت های پلاگین های Slate این است که می توانند با هم ترکیب شوند. هر پلاگین می تواند به دنبال چیزهایی باشد که برای آن مهم است و همه موارد دیگر را بدون تغییر منتقل می کند. سپس می توانید چندین افزونه را با هم بسازید و حتی یک ویرایشگر قدرتمندتر نیز بدست آورید: p>
}
گردانندگان رویدادها h2>
مانند بسیاری از اجزای ورودی React ، م لفه p>
با مدیریت این رویداد ، می توانیم انواع کارهای قدرتمند را در ویرایشگر ما ، مانند اضافه کردن کلیدهای میانبر به عنوان مثال: p>
/>
ما از وقایع کلیدی پایین در همه مکان Kitemaker استفاده می کنیم: p>
- هنگام فشار دادن برگه ، لانه سازی و از بین بردن لانه ها li>
- خروج از لیست ها و بلوک های کد هنگام ورود (یا در بعضی موارد backspace) فشار داده می شود li>
- تقسیم بلوک ها (به عنوان مثال عناوین) با فشار دادن enter در وسط یک بلوک li>
- و بسیاری بسیاری دیگر
ارائه سفارشی با React
Slate هیچ نظری در مورد نحوه دیدن بلوک ها و خطوط داخلی شما روی صفحه ندارد. به طور پیش فرض ، این فقط تمام بلوک ها را به عناصر ساده p>
برای غلبه بر رفتار پیش فرض Slate ، تمام آنچه که ما نیاز داریم برای انجام این کار ، انتقال یک تابع به خاصیت renderElement مpلفه p>
/>
تمام آنچه این کد انجام می دهد این است که به دنبال ویژگی p> نوع یک گره و انتخاب مسیر ارائه متفاوت بر اساس آن است. به یاد داشته باشید ، همانطور که قبلاً گفتیم ، Slate به این خواص اهمیتی نمی دهد ، فقط ما هستیم. بنابراین در حالی که قرارداد استفاده از type برای نشان دادن نوع گره است ، اما هیچ چیزی شما را مجبور به انجام این کار نمی کند. همچنین می توانید انواع خصوصیات دیگری را که به ارائه کمک می کنند به اجزای خود اضافه کنید (مانند ویژگی url که در پیوندهای بالا مشاهده کردیم).
مواردی که از p> renderElement برگردانده شده اند فقط باید باشند واکنش به م componentsلفه ها. شکل ظاهری آنها و پیچیدگی آنها کاملاً به خود شما بستگی دارد. در اینجا ما در حال بازگرداندن یک عنصر
ساده برای نشان دادن یک بلوک کد هستیم ، اما هیچ چیزی مانع بازگشت یک کامپوننت کامل که از برجسته سازی نحو پشتیبانی می کند (مانند آنچه در Kitemaker می کنیم) نیست.
فقط یک نکته مهم است که باید هنگام اجرای رندر خود به خاطر بسپارید - همیشه پارامتر p> ویژگی ها را به عنوان خصوصیات در بالاترین م you'reلفه ای که باز می گردانید ، گسترش دهید. اگر این کار را نکنید ، Slate نمی تواند حسابداری داخلی خود را انجام دهد و کارها برای شما بسیار بد پیش می رود.
این یک معرفی سریع سریع برای ارائه سفارشی بوده است ، بنابراین این کار را نکنید اگر هنوز آن را کاملاً درک نکرده اید نگران باشید. p>
چه چیزی در Slate مشکل دارد؟ h2>
شما اکنون برخی از اصول Slate را دیده اید ، بنابراین " برای شروع آزمایش آماده هستم ما فکر کردیم که کمی در مورد برخی از مشکلات و بخشهای مشکل کار با Slate به شما هشدار می دهیم تا شاهد آمدن آنها باشید و دلسرد نشوید: p>
- کپی و جایگذاری: strong> کپی و چسباندن در وب یک خرابکاری است. ما یک پست کامل را به نحوه مدیریت این موضوع در Kitemaker اختصاص خواهیم داد. نسخه کوتاه این است که برای آزمایش "منطق چسباندن" خود ، ما یک سند تا حدودی پیچیده در مجموعه ویرایشگران وب محبوب Google Docs ، Notion ، Dropbox Paper ، Quip و غیره ساخته ایم. li>
- تاریخچه : به طور پیش فرض ، Slate از لغو / انجام مجدد پشتیبانی نمی کند. با این وجود افزونه ای به نام useHistory () ارائه می شود که این قابلیت را فراهم می کند. با این حال ، متوجه شده ایم که این تجربه کاربری دقیق مورد نظر ما را فراهم نمی کند و بنابراین مجبور شده ایم خود آن را تمدید کنیم li>
- شناورها / منوهای شناور: strong> سر و کار داشتن با مواردی که ظاهر می شوند و باید به درستی موقعیت یابی شوند (مانند آنچه در ویرایشگر Kitemaker در بالا هنگام تایپ "/" برای درج بلوک یا "@" برای ذکر کاربر تایپ می شود) می تواند بسیار حیله گر باشد li >
- دست زدن به کلید: strong> Kitemaker محصولی با تعداد زیادی کلید میانبر برای همه چیز است (ما می خواهیم کاربران ما بتوانند بدون برداشتن دست از روی کلیدها از آن استفاده کنند) اما بعضی اوقات چالش های مربوط به کنترل کلید در "مبارزه" Slate با کلیدهای میانبر ما li>
- سطح API بزرگ: API Slate کاملا گسترده است و ما حتی در این پست شروع به لمس آن نکرده ایم . بسیاری از توابع برای دستکاری سند وجود دارد (افزودن گره ها ، از بین بردن گره ها ، تقسیم گره ها ، پیچیدن گره ها ، افزودن متن ، حذف کلمات و غیره) و همیشه کاملاً مشخص نیست که کدام API را در کدام شرایط استفاده کنید li> < li> برخی از مزیت ها با strong> روش های ورودی مانند نوار لمسی Macbook Pro: ما از کاربران با استفاده از MBP و همچنین مواردی مانند ورودی های قلم برای نوشتن ژاپنی شکایت داشته ایم. برای رفع برخی از رفتارهای عجیب و غریب PR وجود دارد که امیدوارم به زودی برطرف شود ?
برخی از این موضوعات پیشرفته را در پست های بعدی خود پوشش خواهیم داد. p>
و یک کلمه کوتاه اخطار h2>
در حالی که ما تاکنون از Slate بسیار راضی بوده ایم ، چند اخطار وجود دارد که هر تیمی برای ساخت ویرایشگر خود اقدام کند از این موارد آگاه باشید: p>
- مانند هر پروژه منبع باز ، پیشرفت در Slate موج می زند. در حالی که سال گذشته بازنویسی عظیمی صورت گرفت و اوضاع خیلی سریع پیش رفت ، اکنون پیشرفت به میزان قابل توجهی کند شده است. بسیاری از مسائل باز و روابط عمومی آزاد وجود دارد. ما امیدواریم که بتوانیم سهم خود را در جهت بهبود این کار انجام دهیم ، اما انجمن می تواند از پشتیبانی بیشتری استفاده کند li>
- پس از بازنویسی در سال گذشته ، اسناد و مدارک به استاندارد قبل از بازنویسی نرسیده است. مقدار قابل توجهی از اسناد اصلی وجود دارد که جزئیات مورد نیاز توسعه دهندگانی را که تازه شروع به کار پروژه کرده اند ، ندارد. ما برای بهبود این مورد تغییراتی ارائه داده ایم ، اما کار بیشتری لازم است li>
- Slate در Android به درستی پشتیبانی نمی شود. خوشبختانه یک پروژه Kickstarter برای رفع این مشکل تأمین اعتبار شد. عالی! ?
کارهای دیگری در انتظار شما خواهد بود! h2>
امیدواریم که این یک مقدمه سطح عالی Slate برای شما باشد و برخی از اطلاعات شما را به شما ارائه دهد در مورد اینکه آیا شما سعی کنید Slate را امتحان کنید یا نه. راهی وجود دارد که می تواند مطالب بیش از حد در یک پست را پوشش دهد ، اما تعدادی پست وجود دارد که به دنبال برخی موضوعات پیچیده تر می روند. p>
با تشکر برای خواندن ! آیا این مقاله را مفید دانستید؟ اگر می خواهید مطالب بیشتری مانند این را مشاهده کنید ، ksimons و KitemakerHQ را در توییتر دنبال کنید. p>
کوین سیمونز مدیر CTO است Kitemaker ، ردیاب شماره گیری فوق العاده سریع که به تیم های توزیع شده ابرقدرت می دهد p>
قبلاً در https://blog.kitemaker.co/building-a-rich-text-editor-in- منتشر شده است react-with-slatejs