目前正在開發自己的網站,技術上使用Angular JS + Express JS + Mongo DB。由於網站會有文章發布,因此需要有評論功能。評論功能也可以自己開發,但由於現在社會化評論插件很多,因此沒有必要多花精力,使用專業的就好。
1. 什么是社會化評論插件?都有哪些常用的插件?
社會化評論插件,指的就是無需自己開發評論功能,在自己網頁上使用第三方的評論框,發出的評論將被保存在第三方的服務器上。使用時要在插件提供方官網上注冊,注冊好之后可獲取實現功能的JS代碼,以及將來可在官網上管理自己網站的評論。
實現的原理,一般都是插件網站提供給你一段JS代碼,你插入到需要評論的網頁上即可。
目前常用的評論插件有:
A. Disqus
這個應該是最老的,在國外使用最多的第三方評論插件。優點是老牌專業,通過JS代碼可發現,國內很多網站的功能實現應該是參考了它。但缺點同樣明顯,就是國內的網站使用,訪問速度個人感覺往往不好,加載有些慢。另外對國內的社交網站支持不好,僅支持Facebook,Twitter等,不支持微博等,這對訪客的評論帶來不便。
並且i18n對中文的支持不好,網站上提供了中文版選項(它是依賴網友們的貢獻提供多語言版本),但是我試了發現不能起作用。
因此考慮到以上缺點,我放棄了它。
B. 多說
它和有言應該是國內使用較多的評論插件。優點是使用很方便,支持微博等國內社交網站賬戶登錄。但缺點是使用過程中我感覺它的Bug還是不少,同時在其網站討論版中,可以看到,提出問題的網友很多也很活躍。比如我發現了一個嚴重的問題,也有一些網友提出,就是有時候必須手動再刷新一次頁面,才能顯示評論框。這個問題后來采用了它的動態加載方式才得以解決。
經過對比,比較,我最后選擇的就是多說。
C. 有言
和多說很像,我沒有使用它的原因是,發現在使用時它會拋出Javascript error,導致評論框不能顯示。因此多次調試沒有解決問題后,我選擇了放棄。
2. 如何在Angular JS中正確使用評論插件?
這里我還有一個需求,就是每篇文章都能講評論區分開,也就是每篇文章顯示自己的評論,評論不能串,或都顯示一樣。針對這個功能,其實每種插件都會提供線程Thread的概念,這個功能是指針對不同Thread ID的頁面加載不同的評論。
以多說為例。
這里使用的是多說插件的動態加載方式,標准代碼可參見官網:http://dev.duoshuo.com/docs/50b344447f32d30066000147。
在標准代碼中,有一個通用的Javascript方法,如果我有多個頁面,那么這段代碼就需要復制多次。但在Angular JS中沒有必要,Angular JS提供了Directive,即自定義標簽的功能,可定義一個directive,在每個頁面引用即可。
directive.js
1 myApp.directive("comment", function() { 2 return { 3 restrict: 'A', 4 link: function(scope){ 5 // get the variable from controller 6 var article_id = scope.article_id; 7 8 var data_thread_key = 'article_' + article_id; 9 var data_url = 'article_' + article_id; 10 var data_author_key = 'http://blogtest.com/#!/article.html/' + article_id; 11 12 // dynamic load the duoshuo comment box 13 var el = document.createElement('div');//該div不需要設置class="ds-thread" 14 el.setAttribute('data-thread-key', data_thread_key);//必選參數 15 el.setAttribute('data-url', data_url);//必選參數 16 el.setAttribute('data-author-key', data_author_key);//可選參數 17 DUOSHUO.EmbedThread(el); 18 jQuery('#comment-box').append(el); 19 } 20 }; 21 });
在這里我用每篇文章的article id來做評論插件的thread id,保證每篇文章的評論都分開。同時使用Directive的另一個好處是,directive里的JS方法,可以訪問controller中的scope變量,如果你是和我一樣在controller動態獲取文章,那么就很方便在directive中拿到文章ID。
page.html
1 <div id="comment-box"></div> 2 <div comment></div>
在html頁面中兩行代碼就足夠了。comment就是指我們自定義的Directive插件。
由此可以看到評論插件的效果如下:
3. 小結
在使用與選擇各種評論插件的過程中,自己走了很多坑。總結如下:
1. 不同插件的產品質量不同,需要測試來發現與選擇,有的知名產品但對你來說,效果很差,當然可能有你的問題。
2. 不同插件對不同頁面不同評論的支持不同,有的支持好,有的支持不好。像disqus,和多說支持就較好。
3. Angular JS和插件組合使用時可能也有坑。在解決問題過程中,也可以加深對Angular JS的理解。
希望對你有幫助。謝謝。
我已經將自己的小網站開源,完整代碼可參見:https://github.com/kevinsong1990/nodejs-blog
- Kevin Song
2015年8月2日