在 SPA 的前端項目中 數據統計,每每就是一個比較麻煩的事情,React 和 Vue 也是同樣。
在 發現問題以前,咱們得來思考下 百度統計的統計原理
是什麼?javascript
var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?xxx"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
經過 JSONP 加載了一個 百度統計的 JS 文件,這個 JS 文件,相對仍是比較大的
粗略的看了一 hm.js 的 源碼文件, 獲取本地的 cookie、session、url、ua 等而後還有一些處理數據的方法和 一些數據上傳的方法。前端
那麼在什麼狀況下,百度統計 會去觸發上傳的操做?
vue
咱們來實驗一下?java
下面: 咱們就將待驗證的場景實現出來看看,到底會不會觸發。react
const GetBaidu = props => { let children = props.children; let _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?xxx"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); return children; }; const App = () => { return ( <div> <h2>測試百度統計代碼</h2> <h3> <Link to={"/"}>Index</Link> </h3> <h3> <Link to={"/home"}>Home</Link> </h3> <h3> <Link to={"/my"}>my</Link> </h3> <Switch> <GetBaidu> <Route exact path="/" component={Index} /> <Route exact path="/home" component={Home} /> <Route exact path="/my" component={My} /> </GetBaidu> </Switch> </div> ); };
這樣相似一個攔截器同樣,在路由跳轉以前把 百度統計的代碼再次家再一次。git
一樣,Vue-router 的項目也是相似。github
router.afterEach( ( to, from, next ) => { setTimeout(()=>{ var _hmt = _hmt || []; (function() { //每次執行前,先移除上次插入的代碼 document.getElementById('baidu_tj')&&document.getElementById('baidu_tj').remove(); var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?xxxx"; hm.id = "baidu_tj" var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); },0); } );
這裏只是簡單粗暴的進行一個最簡單的 demo 展現
親測這類數據統計問題,放在不少項目中都是須要解決的。vue-router
總結:React 和 Vue 的方法相似, 在路由跳轉前先作攔截操做。加上須要在頁面中加入的方法和統計代碼便可。cookie
關於 單頁應用數據統計 的文章就介紹到這裏了,歡迎一塊兒來論道~session
GitHub 地址:(歡迎 star 、歡迎推薦 : )