vue網(wǎng)站SEO優(yōu)化持續(xù)踩坑(PhantomJS)

事情是這樣的

最近公司需要做一個(gè)網(wǎng)頁導(dǎo)航 集成文章功能的網(wǎng)站,不想重復(fù)造輪子,于是乎就在gitee上扒了一個(gè)開源的項(xiàng)目來改造。項(xiàng)目前端架構(gòu)是vue+elementui钦听。
千辛萬苦在項(xiàng)目收尾階段,老板突然說網(wǎng)站要做SEO倍奢。到時(shí)沒多想朴上,就覺的不就是seo嘛,加上關(guān)鍵字卒煞、描述標(biāo)題不就完事了痪宰,然后項(xiàng)目匆匆上線了。過了一陣子才不慌不忙的開始著手seo的事畔裕,當(dāng)我在瀏覽器右鍵查看網(wǎng)站源碼的時(shí)候衣撬,傻眼了,整個(gè)網(wǎng)站的body里只有一個(gè)醒目的div扮饶,如下

<body>
  <div id="app"></div>
</body>

WTF...
才想起來具练,vue頁面是在前端渲染的,果斷度娘了一波甜无,一大片說vue不友好之類的扛点,看完我差點(diǎn)昏厥哥遮。
好在遇到同樣問題的不止我一個(gè),找到了一些vue項(xiàng)目做seo優(yōu)化的解決方案占键,于是乎我順著前人的腳步,一步步開啟了我的seo踩坑之旅元潘。

選方案

網(wǎng)上找到的方案大致分四類畔乙,包括SSR服務(wù)器渲染,靜態(tài)化以及服務(wù)器無頭瀏覽器等翩概,優(yōu)劣不一牲距,各有千秋,筆者綜合考慮自身情況钥庇,選擇最后一種牍鞠,用PhantomJs針對(duì)爬蟲做處理。
詳細(xì)請(qǐng)參考:http://www.fly63.com/article/detial/3960

PhantomJs初使用

Phantomjs是一個(gè)基于webkit內(nèi)核的無頭瀏覽器评姨,即沒有UI界面难述,即它就是一個(gè)瀏覽器,只是其內(nèi)的點(diǎn)擊吐句、翻頁等人為相關(guān)操作需要程序設(shè)計(jì)實(shí)現(xiàn)胁后。這種解決方案其實(shí)是一種旁路機(jī)制,原理就是通過Nginx配置嗦枢,將搜索引擎的爬蟲請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)node server攀芯,再通過PhantomJS來解析完整的HTML。
這里有一個(gè)方案可參考:http://www.reibang.com/p/2bbbc2fcd16d

但是筆者按照上述方案操作的時(shí)候文虏,會(huì)報(bào)一個(gè)Cannot find module 'express'的錯(cuò)誤侣诺,查了一下,是需要安裝express氧秘。
自己當(dāng)時(shí)太菜年鸳,并不知道express是個(gè)什么鬼,所以選了另外一種方法丸相,在github上找了一套別人打包好的vue-seo-phantomjs

按照上述操作阻星,最后執(zhí)行

phantomjs spider.js 'https://wj.qq.com/'

的時(shí)候,成功出現(xiàn)網(wǎng)站的html信息了已添。
但是仔細(xì)一看妥箕,發(fā)現(xiàn)還是沒有渲染的頁面,報(bào)錯(cuò)信息是

phantonjs ReferenceError: Can't find variable: Promise

Promise的坑

老辦法更舞,找度娘...
筆者在這一塊卡了一上午時(shí)間畦幢,踩了很多坑,甚至硬著頭皮查閱了老外的討論和筆記https://github.com/ariya/phantomjs/issues/12401
最后大概了解缆蝉,應(yīng)該是還差一個(gè)Promise的依賴宇葱。
解決辦法:在你的vscode(就是你的開發(fā)工具)的終端輸入

npm install es6-promise --save

然后在你項(xiàng)目的js中加入一串代碼

import Promise from 'es6-promise'
Promise.polyfill()

筆者是加在項(xiàng)目的main.js里瘦真,然后重新打包,部署黍瞧,最后終于看見了渲染后的頁面诸尽,激動(dòng)的眼眶都紅了

等等,還沒結(jié)束呢印颤。到這一步您机,可能大部分朋友已經(jīng)OK,但是可能部分小朋友的項(xiàng)目的代碼寫的不規(guī)范年局,或者濫用組件的原因际看,導(dǎo)致用phantomjs渲染的時(shí)候報(bào)錯(cuò),這時(shí)矢否,就要根據(jù)報(bào)錯(cuò)信息逐個(gè)解決仲闽,一般報(bào)錯(cuò)信息是在你執(zhí)行 phantomjs spider.js '你的url' 之后會(huì)打印出來。
在此筆者會(huì)列出自己遇到的問題

URLSearchParams 坑

報(bào)錯(cuò)信息:

[root@VM-0-10-centos phantomjs]# phantomjs spider.js 'http://106.52.91.112:9527/#/info?blogUid=fc654f40718341ef01edf13ce71f1fea'
[Vue warn]: Error in created hook: "ReferenceError: Can't find variable: URLSearchParams"

found in

---> <Info>
       <Index>
         <App>
           <Root>

  https://cdn.bootcdn.net/ajax/libs/vue/2.5.17/vue.js:597 in warn
ReferenceError: Can't find variable: URLSearchParams
解決辦法1

棄用URLSearchParams僵朗。在vue項(xiàng)目中赖欣,注釋所有URLSearchParams相關(guān)用法,采用直接傳匿名對(duì)象

          // var params = new URLSearchParams();
          // params.append("uid", this.blogUid);
          getBlogByUid({uid: this.blogUid}).then(response => {
            if (response.code == this.$ECode.SUCCESS) {
              this.blogData = response.data;
            }
            setTimeout(()=>{
              that.blogContent = response.data.content
              that.loadingInstance.close();
            }, 200)
          });

Nginx配置

upstream spider_server {
    server localhost:8081;
}
server {
    listen       80;
    server_name  www.lidh.vip;
    
    location / {
      proxy_set_header  Host            $host:$proxy_port;
      proxy_set_header  X-Real-IP       $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

      if ($http_user_agent ~* "Baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|bingbot|Sosospider|Sogou Pic Spider|Googlebot|360Spider") {
        proxy_pass  http://spider_server;
      }
      
      # vue項(xiàng)目路徑
      root   /opt/proj/kehai/goxp_nav/vue_web/dist;
      index  index.html index.htm;
    }
}

結(jié)束語

小菜鳥筆者的踩坑日常验庙,讓大佬見笑了畏鼓,本文旨在幫助那些遇到同樣問題的人能避免入坑,因?yàn)樽约涸谶@個(gè)坑花了太久時(shí)間壶谒,然后網(wǎng)上也沒有找到很好方法云矫,故希望此文能幫到需要的人

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市汗菜,隨后出現(xiàn)的幾起案子让禀,更是在濱河造成了極大的恐慌,老刑警劉巖陨界,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡揍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菌瘪,警方通過查閱死者的電腦和手機(jī)腮敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俏扩,“玉大人糜工,你說我怎么就攤上這事÷嫉” “怎么了捌木?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嫉戚。 經(jīng)常有香客問我刨裆,道長(zhǎng)澈圈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任帆啃,我火速辦了婚禮瞬女,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘努潘。我一直安慰自己诽偷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布慈俯。 她就那樣靜靜地躺著渤刃,像睡著了一般拥峦。 火紅的嫁衣襯著肌膚如雪贴膘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天略号,我揣著相機(jī)與錄音刑峡,去河邊找鬼。 笑死玄柠,一個(gè)胖子當(dāng)著我的面吹牛突梦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羽利,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宫患,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了这弧?” 一聲冷哼從身側(cè)響起娃闲,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匾浪,沒想到半個(gè)月后皇帮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛋辈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年属拾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冷溶。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渐白,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞频,到底是詐尸還是另有隱情礼预,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布虏劲,位于F島的核電站托酸,受9級(jí)特大地震影響褒颈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜励堡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一谷丸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧应结,春花似錦刨疼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扮休,卻和暖如春迎卤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玷坠。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工蜗搔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人八堡。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓樟凄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親兄渺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缝龄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355