本文首發於於個人博客,可做爲 prerender-spa-plugin
預渲染失敗的參考javascript
想着在年前把博客更新升級一下,因而順手修復了一些已知的BUG,優化了留言模塊,升級了nginx,更是爲了利於SEO,在webpack的編譯中加入了prerender-spa-plugin
預渲染模塊。經本地window主機測試後,一切OK。這便着手在線上Linux主機中配置,nginx, node, mongod 等的升級一切順利,但就是在項目中 npm install
的時候卡住了,並且這一卡就是一天多!難道是我安裝姿式不對,須要起來重睡? 查看npm
報錯緣由,就出如今本文的主角phantomjs
上。關於phantomjs
,不管是在以前的項目中寫單元測試,錄製UIrecorder
測試用例時都遇到過,但僅僅也是遇到而已,只覺得僅僅是一個依賴模塊,照着文檔npm install
一下,對其甚至連基本的瞭解都沒有,因而問題就出現了。html
在項目中執行npm install
安裝依賴時,發生以下錯誤:前端
#... Removing /XXX/node_modules/phantomjs-prebuilt/lib/phantom Copying extracted folder /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1496325965675/phantomjs-2.1.1-linux-x86_64 -> /XXX/node_modules/phantomjs-prebuilt/lib/phantom Phantom installation failed { Error: EACCES: permission denied, link '/tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1496325965675/phantomjs-2.1.1-linux-x86_64' -> '/XXX/node_modules/phantomjs-prebuilt/lib/phantom' at Error (native) errno: -13, code: 'EACCES', syscall: 'link', path: '/tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1496325965675/phantomjs-2.1.1-linux-x86_64', dest: '/XXX/node_modules/phantomjs-prebuilt/lib/phantom' } Error: EACCES: permission denied, link '/tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1496325965675/phantomjs-2.1.1-linux-x86_64' -> '/XXX/node_modules/phantomjs-prebuilt/lib/phantom' at Error (native) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! phantomjs-prebuilt@2.1.14 install: `node install.js` npm ERR! Exit status 1 #...
權限問題?瞅了眼終端,root
啊,懵逼了~因而去查看官方文檔,在文檔中有以下描述:java
我沒有執行權限?搞笑了,雖然linux我是個渣渣,可是root用戶我想應該和我理解的沒有區別吧~; 用 npm clean
來修復 npm
緩存權限,這個應該有可能,照着執行 npm clean --force
後繼續 npm install
,問題依舊;
谷歌後發現這個問題很廣泛,也在https://github.com/Medium/phantomjs/issues/707這裏找到了解決方式,在命令後面加參數 --unsafe-perm
就好了,因而 rm -rf ./node_modules
後再次執行 npm install --unsafe-perm
, 此次除了一些警告外,算是安裝成功了。接着執行 npm run build
, 因而第二個問題來了。node
/XXX/node_modules/prerender-spa-plugin/lib/compile-to-html.js:82 if (error) throw stdout ^ error Command failed with exit code 1.
這個問題以前有遇到過,是prerender-spa-plugin
預渲染過程當中出錯了。覺得是本身代碼中有什麼問題,仔仔細細的檢查了打包模塊,沒有問題,又在開發環境(Windows)中打包重試,仍是沒有問題。那麼問題就仍是出在phantomjs
上了,由於prerender-spa-plugin
是依賴phantomjs
的。linux
也就是說問題仍是沒有解決,只能繼續谷歌,繼續嘗試,繼續失敗~webpack
phantomjs
是什麼?不懂就問!nginx
PhantomJS是一個基於WebKit的服務器端JavaScript API,它基於 BSD開源協議發佈。PhantomJS無需瀏覽器的支持便可實現對Web的支持,且原生支持各類Web標準,如DOM 處理、JavaScript、CSS選擇器、JSON、Canvas和可縮放矢量圖形SVG。
phantomjs
的使用場景Mocha
,UIrecorder
等無需瀏覽器的狀況下進行快速測試 (這個有使用瞭解)簡單能夠總結爲一個<mark>很牛逼的虛擬瀏覽器</mark>?git
很遺憾,上面的使用場景,只有第一條 "Mocha
,UIrecorder
等無需瀏覽器的狀況下進行快速測試" 中咱們有過嘗試,並且項目 UIrecorder
的測試用例 在linux中的自動化運行依然沒有解決,難道仍是和phantomjs
有關係?github
嘗試到大半夜,玩了玩跳一跳後,靈感來了。能夠先在系統中全局預安裝phantomjs
做爲系統服務啊。如下命令執行後真的成功了,喜極而泣~
#... #下載 wget https://npm.taobao.org/mirrors/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 #加入環境變量 vim /etc/profile #末尾加入 export PATH=$PATH:/usr/local/phantomjs-2.1.1-linux-x86_64/bin source /etc/profile
回到項目目錄後, rm -rf ./node_modules
後再次執行 npm install --unsafe-perm
:
rm -rf ./node_modules npm install --unsafe-perm npm run build
哈哈哈,終於看到了我熟悉的結果:
以上即是此次升級中遇到的最大問題,最終也只是以 知其結果而不知其因此然
的方式解決了問題。
在之後的學習道路上,應該對package
的依賴包有所瞭解,至少應該去瀏覽下其文檔,瞭解其用處。對linux知識也要更深刻的學習,不要由於前端的職位而只是膚淺的將知識層面停留在大學時的課本上;對前端的自動化知識(包括測試)也要跟上步伐,說不定哪天就解決了項目中在Linux上自動跑UIrecorder
測試用例的遺留問題。
本文首發於個人博客