公司目前在線上運行著一款小程序,為了能監控小程序的運行情況,自行開發了一個參數搜集的SDK,名稱為 shin.js,放置在 utils 目錄中。
  目前只搜集了打印、通信和錯誤,其中打印不是 console.log() 而是 shin.log()。
  在小程序的管理后臺,開發管理中,目前也有一個錯誤日志列表,其中也有比較詳盡的錯誤信息,可配合監控系統使用。
:-: 
## 一、SDK
**1)log**
  在 Shin 類的構造函數中,聲明了 log() 方法,主要就是將傳入的數據解析成JSON格式的字符串,然后傳遞給后臺。
  options 是可配置的參數,包括參數的發送地址,以及項目 token。injectApp() 方法修改了原生的 App 方法并且注入了監控邏輯,具體會在后面講解。
~~~
class Shin {
constructor(options) {
this.options = options;
this.injectApp();
// 將打印的日志推送到監控后臺
['log'].forEach((type) => {
this[type] = msg => {
this.send({
category: 'console',
data: {
type,
desc: JSON.stringify(msg)
}
})
};
});
}
}
~~~
  為了與之前的數據結構兼容,需要整理成指定的格式后,再發送。
**2)發送**
  send() 方法用于發送,其中 identity 是一個身份標識,存在于全局對象 globalData 中,而它是通過 getIdentity() 方法生成的。
~~~
getIdentity() {
return Number(Math.random().toString().substr(3, 3) + Date.now()).toString(36);
}
send(params) {
//日志通用數據配置
params.identity = getApp().globalData.identity;
params.token = this.options.token;
params.data = Object.assign(params.data, {
network: this.network,
url: this.getActivePage().route
});
//錯誤日志還需要記錄設備信息
if(params.category == 'error') {
params.data.system = this.system;
}
wx.request({
url: this.options.src,
method: "GET",
data: {
m: JSON.stringify(params)
}
});
}
~~~
  代碼中的?getActivePage()?用于讀取當前頁面,調用了[getCurrentPages()](https://developers.weixin.qq.com/miniprogram/dev/reference/api/getCurrentPages.html);[getNetworkType()](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.getNetworkType.html)讀取當前網絡類型;[getSystemInfo()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/system-info/wx.getSystemInfo.html)讀取當前設備信息。
~~~
getActivePage() {
// 獲取當前頁面棧
const curPages = getCurrentPages();
if (curPages.length) {
return curPages[curPages.length - 1];
}
return {};
}
getNetworkType() {
wx.getNetworkType({
success: (res) => {
this.network = res.networkType;
},
});
}
getSystemInfo() {
wx.getSystemInfo({
success: (res) => {
this.system = res;
},
});
}
~~~
**3)錯誤**
  在構造函數中調用了 injectApp() 方法,為 App 注入自定義的監控行為。
  在觸發[onLaunch](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html)事件時記錄網絡類型和設備信息,在觸發 onError 事件時將具體的錯誤信息發送到后臺。
~~~
injectApp() {
const originApp = App;
const self = this;
App = function (app) {
['onLaunch', 'onError'].forEach((methodName) => {
const customMethod = app[methodName]; //暫存自定義的方法
if (methodName === 'onLaunch') {
self.getNetworkType(); //記錄網絡
self.getSystemInfo(); //記錄設備信息
}
app[methodName] = function (options) {
if(methodName === 'onError') {
const params = {
category: 'error',
data: {
type: 'mini',
desc: options, //錯誤信息
}
};
self.send(params); //錯誤上報
}
return customMethod && customMethod.call(this, options);
};
});
return originApp(app);
};
}
~~~
**4)通信**
  我們自己封裝了一個通信庫,為了操作簡便,就定義了一個方法,在通信完成時調用此方法。
~~~
formatRequest({ res, url, method, data }) {
// 響應
const ajax = {
type: method,
status: res.statusCode,
url,
data
}
// 過濾掉數據量大的響應
if(JSON.stringify(res.data).length <= 300) {
ajax.response = res.data;
}
const params = {};
if(res.statusCode >= 400) {
params.category = 'error';
params.data = {
type: 'promise',
desc: ajax
};
}else {
params.category = 'ajax'
params.data = ajax;
}
this.send(params);
}
~~~
  它接收的參數包括 res(響應數據),url(請求地址),method(請求方法),data(請求參數)。
  其中 res 包括狀態碼和響應內容,狀態碼囊括了4XX和5XX。
**5)初始化**
  在啟動文件 app.js 引入 shin.js文件,并初始化,在 globalData 中添加 shin 和 identity。
~~~
import Shin from './utils/shin';
const shin = new Shin({
src: 'https://127.0.0.1:3000/ma.gif',
token: 'mini'
});
globalData: {
shin,
identity: shin.getIdentity(),
}
~~~
**6)監控后臺**
  參數搜集的 api 不需要做任何修改,在監控后臺的頁面中也只是加幾個過濾選項即可,而這些選項都已經寫成了常量,修改起來很方便,例如:
~~~
export const MONITOR_PROJECT = [
{ key: 'backend', value: '管理后臺' },
{ key: 'h5', value: 'H5活動' },
{ key: 'mini', value: '小程序'}
];
~~~
## 二、Source Map
  目前還不能在監控后臺直接通過 SourceMap 自動映射(未來的一個優化點)。
  需要先從小程序后臺下載 SourceMap 文件,下載完后導入小程序開發編輯器中查看映射條件。
  具體過程:
  1)首先小程序開發器的版本必須得是 1.03.2012152 以上。
  2)選擇"設置-通用設置-擴展-調試器插件",進入插件下載頁面,添加sourcemap匹配調試插件。
:-: 
  3)在開發管理中的錯誤日志(參考[教程](https://developers.weixin.qq.com/miniprogram/dev/devtools/sourcemap.html))中,可下載線上版本的 SourceMap 文件或者,或者在上傳完代碼后,會提示你下載該文件。

  4)最后可在控制臺調試器中出現 sourcemap 標簽,在此處加載映射文件以及輸入行號和列號,完成映射。
:-: 
*****
> 原文出處:
[博客園-從零開始搞系列](https://www.cnblogs.com/strick/category/1928903.html)
已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎閱讀。

推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
- ES6
- 1、let和const
- 2、擴展運算符和剩余參數
- 3、解構
- 4、模板字面量
- 5、對象字面量的擴展
- 6、Symbol
- 7、代碼模塊化
- 8、數字
- 9、字符串
- 10、正則表達式
- 11、對象
- 12、數組
- 13、類型化數組
- 14、函數
- 15、箭頭函數和尾調用優化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、類
- 21、類的繼承
- 22、Promise
- 23、Promise的靜態方法和應用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基礎實踐
- 3、WebRTC視頻通話
- 4、Web音視頻基礎
- CSS進階
- 1、CSS基礎拾遺
- 2、偽類和偽元素
- 3、CSS屬性拾遺
- 4、浮動形狀
- 5、漸變
- 6、濾鏡
- 7、合成
- 8、裁剪和遮罩
- 9、網格布局
- 10、CSS方法論
- 11、管理后臺響應式改造
- React
- 1、函數式編程
- 2、JSX
- 3、組件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表單
- 8、樣式
- 9、組件通信
- 10、高階組件
- 11、Redux基礎
- 12、Redux中間件
- 13、React Router
- 14、測試框架
- 15、React Hooks
- 16、React源碼分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基礎
- 4、webpack進階
- 5、Git
- 6、Fiddler
- 7、自制腳手架
- 8、VSCode插件研發
- 9、WebView中的頁面調試方法
- Vue.js
- 1、數據綁定
- 2、指令
- 3、樣式和表單
- 4、組件
- 5、組件通信
- 6、內容分發
- 7、渲染函數和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、數據類型
- 2、接口
- 3、類
- 4、泛型
- 5、類型兼容性
- 6、高級類型
- 7、命名空間
- 8、裝飾器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系統和網絡
- 3、命令行工具
- 4、自建前端監控系統
- 5、定時任務的調試
- 6、自制短鏈系統
- 7、定時任務的進化史
- 8、通用接口
- 9、微前端實踐
- 10、接口日志查詢
- 11、E2E測試
- 12、BFF
- 13、MySQL歸檔
- 14、壓力測試
- 15、活動規則引擎
- 16、活動配置化
- 17、UmiJS版本升級
- 18、半吊子的可視化搭建系統
- 19、KOA源碼分析(上)
- 20、KOA源碼分析(下)
- 21、花10分鐘入門Node.js
- 22、Node環境升級日志
- 23、Worker threads
- 24、低代碼
- 25、Web自動化測試
- 26、接口攔截和頁面回放實驗
- 27、接口管理
- 28、Cypress自動化測試實踐
- 29、基于Electron的開播助手
- Node.js精進
- 1、模塊化
- 2、異步編程
- 3、流
- 4、事件觸發器
- 5、HTTP
- 6、文件
- 7、日志
- 8、錯誤處理
- 9、性能監控(上)
- 10、性能監控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 監控系統
- 1、SDK
- 2、存儲和分析
- 3、性能監控
- 4、內存泄漏
- 5、小程序
- 6、較長的白屏時間
- 7、頁面奔潰
- 8、shin-monitor源碼分析
- 前端性能精進
- 1、優化方法論之測量
- 2、優化方法論之分析
- 3、瀏覽器之圖像
- 4、瀏覽器之呈現
- 5、瀏覽器之JavaScript
- 6、網絡
- 7、構建
- 前端體驗優化
- 1、概述
- 2、基建
- 3、后端
- 4、數據
- 5、后臺
- Web優化
- 1、CSS優化
- 2、JavaScript優化
- 3、圖像和網絡
- 4、用戶體驗和工具
- 5、網站優化
- 6、優化閉環實踐
- 數據結構與算法
- 1、鏈表
- 2、棧、隊列、散列表和位運算
- 3、二叉樹
- 4、二分查找
- 5、回溯算法
- 6、貪心算法
- 7、分治算法
- 8、動態規劃
- 程序員之路
- 大學
- 2011年
- 2012年
- 2013年
- 2014年
- 項目反思
- 前端基礎學習分享
- 2015年
- 再一次項目反思
- 然并卵
- PC網站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端學習之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 2024年
- 日志
- 2020