在 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 等而後還有一些處理數據的方法和 一些數據上傳的方法。前端
那麼在什麼狀況下,百度統計 會去觸發上傳的操做?
java
咱們來實驗一下?react
下面: 咱們就將待驗證的場景實現出來看看,到底會不會觸發。git
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>
);
};
複製代碼
這樣相似一個攔截器同樣,在路由跳轉以前把 百度統計的代碼再次家再一次。github
一樣,Vue-router 的項目也是相似。cookie
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 展現 親測這類數據統計問題,放在不少項目中都是須要解決的。session
總結:React 和 Vue 的方法相似, 在路由跳轉前先作攔截操做。加上須要在頁面中加入的方法和統計代碼便可。react-router
關於 單頁應用數據統計 的文章就介紹到這裏了,歡迎一塊兒來論道~測試
GitHub 地址:(歡迎 star 、歡迎推薦 : )