基於Next.js腳手架實現仿掘金編輯器

luffyZhou發表於2019-03-04

前言

前面寫了一系列文章都是關於Next.js的,順便還搭建了個腳手架方便使用,反正目前來看可能用Next的人不多,也無所謂啦本來就是自己為了學習才開始寫文章的。以學代練,基礎知識已經準備的差不多了,開始應用了~我對掘金的新建文章編輯文章內容非常喜歡,正好前一段一直在弄文字編輯器相關內容,就寫一個仿掘金編輯器的Demo吧,大家感興趣的看一看,順便給個star我是非常感謝的~

專案地址:next-markdown-editor

截圖:

基於Next.js腳手架實現仿掘金編輯器
基於Next.js腳手架實現仿掘金編輯器
基於Next.js腳手架實現仿掘金編輯器

技術準備

關鍵技術

  • Layout佈局
  • 非同步引入,dynamic(import(`XXX`))
  • markdown轉換

解決的問題

  • Layout佈局以及react-markdown CSS樣式
  // 針對佈局單獨寫了一個editor-markdown.less,在全域性引入了。
  /asserts/editor-markdown.less
複製程式碼
  • 服務端渲染markdown編輯器
    markdown編輯器如果正常倒入是可以被渲染的,但是當進行頁面重新整理的時候,服務端會獲取不到navigator變數,所以合理的辦法是非同步引入markdown-editor
     // SimpleMde.js
     import { Component } from `react`;
     import SimpleMDE from `simplemde`;
     import marked from `marked`;
     import hljs from `highlight.js`;
     import `simplemde/dist/simplemde.min.css`;
     import `highlight.js/styles/github.css`;
     
     class SimpleMDEditor extends Component {
       constructor(props) {
         super(props);
         this.state = { };
         this.smde = null;
       }
     
       componentDidMount() {
         // 編輯器內容點選不彈文字
         document.getElementById(`markdownEditor`)
           .parentNode // 獲取編輯器container
           .addEventListener(`click`, e => e.stopPropagation());
         this.smde = new SimpleMDE({
           element: document.getElementById(`markdownEditor`).childElementCount,
           autofocus: true,
           autosave: true,
           initialValue: ``,
           indentWithTabs: false,
           placeholder: `## 輸入試題內容...`,
           renderingConfig: {
             singleLineBreaks: false,
             codeSyntaxHighlighting: true,
           },
           insertTexts: {
             horizontalRule: ["", "
    
    -----
    
    "],
             image: ["![](http://", ")"],
             link: ["[", "](http://)"],
             table: ["", "
    
    | Column 1 | Column 2 | Column 3 |
    | -------- | -------- | -------- |
    | Text     | Text      | Text     |
    
    "],
           },
           previewRender: function(plainText) {
             return marked(plainText, {
               renderer: new marked.Renderer(),
               gfm: true,
               pedantic: false,
               sanitize: false,
               tables: true,
               breaks: true,
               smartLists: true,
               smartypants: true,
               highlight: function (code) {
                 return hljs.highlightAuto(code).value;
               }
             });
           },
           spellChecker: false
         });
         SimpleMDE.toggleSideBySide(this.smde);
       }
     
       render() {
         return (
           <div id=`editorContaienr`>
             <textarea id=`markdownEditor`></textarea>
           </div>
         );
       }
     }
     
     export default SimpleMDEditor;
     
     // index.js
     const SimpleMDEditor = dynamic(import(`./SimpleMde`), {
       ssr: false
     });
    複製程式碼

關於非同步引入,可以詳見Next.js官網非同步引入元件文件,寫得很詳細。

專案地址

專案長這個樣子:

普通的富文字編輯器

說實話,這個編輯器真心好用,你如果需求非常簡單,只要一個富文字編輯器,不要任何佈局之類的,直接引入就完事了,因為預覽,全屏的工作編輯器已經幫我們做了,非常好用~

編輯器內容:

基於Next.js腳手架實現仿掘金編輯器

預覽內容:

基於Next.js腳手架實現仿掘金編輯器

仿掘金編輯器

這裡要說的就是,其實編輯器已經幫我們做了所有能做的事,至於仿掘金編輯器頁面我們做的就是初始化的時候將編輯器分邊展示即可,然後進行一下Layout佈局,做成掘金的樣子,我這裡就簡單的寫一下,至於底部的內容就不寫了,大家自己發揮想象吧,還挺簡單的~

頁面效果:

基於Next.js腳手架實現仿掘金編輯器

是不是還挺有模有樣的,哈哈?,頁面底部的頁尾內容我沒有繼續寫,container已經流出來了,感興趣的小夥伴自行發揮,關於Layout佈局詳情在專案的CSS裡,大家自行獲取,我就不貼程式碼了~~~

預覽內容

同樣的,其實預覽內容也完全可以使用這個富文字編輯器,只需要進行簡單的預覽佈局就可以~但是秉著學習新東西的理念,我就用react-markdwon做預覽吧。

使用react-markdown做預覽還真是有很多麻煩的地方,首先存在一些不相容的地方,其次,react-markdown沒有任何的樣式,你需要自己對string -> markdwon之後的各種標籤新增相應的樣式才可以~

實現效果:

基於Next.js腳手架實現仿掘金編輯器

結束語

陸續可能還會用這個腳手架搭建更多的應用Demo,目前只做前端Demo,可能後續還會有帶服務端內容的,因為前一個系列文章有小夥伴說想看前後端帶資料庫的完整專案,正在努力寫呢,不過工作之餘寫,時間可能不那麼充足,感興趣的可以留言交流~?

Next-Markdown-Editor ⭐️甩過來

相關文章