Skip to content

Integrate Google analytics with Wechat Mini Program via Measurement Protocol

License

Notifications You must be signed in to change notification settings

LRENZ/Wechat-Mini-Program-GA-SDK

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Wechat Mini Program GA SDK

Build Status

一个基于mearsurement protocol 封装的微信小程序 SDK. 支持以下特性

  • Axios-like API, 支持config, transferRequest, transferReponse, Interceptor, API 灵活简单
  • 内置 Logger 功能, 方便调试和检查数据发送状态
  • 内置一系列工具函数,例如regex table. 参数验证等
  • 基于 webpack 开发,易于拓展
  • 同时支持小程序和浏览器

在使用此 SDK 前需要您对 Measurement Protocol 和 GA 有一定了解. 如果您不清楚,以下示例发送的参数代表 GA 的对应指标,请参考以下链接

Install

安装 SDK 最简单的方式是直接下载对应的 js文件 并在小程序引入,例如

Const GA = require('./GA/ga.js').default;

或者通过 npm 安装

npm install wechat-mini-program-ga-sdk

手动编译

手动编译需要先安装以下library

yarn add webpack webpack-cli webpack-dev-server babel-loader @babel/core @babel/preset-env

执行 build

yarn build

特别注意, 小程序和浏览器的打包规范是不一样的.小程序需要打包成commonjs, 浏览器则需要打包成umd. 手动打包需要特别修改webpack.config.js 文件的 libraryTarget. 手动编译后再重新在项目中引入

如需在浏览器中调试,请将 webpack.config.js 文件的 libraryTarget 改写成 umd 后执行

yarn start

Getting Start

引入打包文件后, 实例会挂载在default 下.

  • 设置config 并实例化对象,config 在同一个实例会保持一致.
  • 将声明对象并挂载在APP下方便后续使用.
  • 最佳做法是只在 config 中加入所有公用的数据和配置项. 对于需要在特定页面单独发送的数据,则在后续用 get 或者 post 手动添加
var GA = require('./GA/ga.js').default;

const config = {
  data: {  //common request payload
    v: 1,
    cid: 1234556,   //clientId
    tid: "UA-71412438-1",   //ga property ID
    dp: "/not_set",    // document path
    dh:'www.test.com',
    ds: "wechat",    //  data source
    t:"pageview",  //  track type
  },
  maxLogLength:10,
  enableLogger: true,
  proxyURL : "YOUR_PROXY_URL" // Wechat mini program is not allowed to send to GA server directly, you will require a middle server to forward the hits
}

const GA = new GA(config)

为了方便在小程序中使用,可以把对象挂载到 APP 对象中,或者是挂载到 wx 对象中

App({
  ...
  GA
  ...
})

// or
wx.ga = GA

Track Pageview 追踪 pageview 需要在页面 出现的时候传入相应的参数.

GA.post({
  dp: '/home'
})

Track Event 追踪 Event 需要在事件触发的时候传入相应的参数.

GA.post({
  t:'event',
  dp: '/pdp',
  ec:'action',
  ea:"add to cart"
})

如果在之后 post 或者 get 中添加的参数与 config 中有重合,则config 中的相应字段会被覆盖.需要注意得是这个覆盖是一次性的.如果之后没有手动传相应得字段,则会从 config 中继续读取默认字段.

另外一种做法是声明两个对象, 一个实例专门用于追踪Pageview, 另外一个用于追踪 Event. 每个实例互不干扰.

const config = {
  data: {  //common request payload
    v: 1,
    cid: 1234556,   //clientId
    tid: "UA-71412438-1",   //ga property ID
    dp: "not_set",    // document path
    dh:'www.test.com',
    ds: "wechat",    //  data source
    t:"pageview",  //  track type
  },
  maxLogLength:10,
  enableLogger: true,
  LoggerName: 'pvLog',
  proxyURL : "YOUR_PROXY_URL" // Wechat mini program is not allowed to send to GA server directly, you will require a middle server to forward the hits
}

const GAPvTracker = new GA(config)

const Eventconfig = {
  data: {  //common request payload
    v: 1,
    cid: 1234556,   //clientId
    tid: "UA-71412438-1",   //ga property ID
    dp: "not_set",    // document path
    dh:'www.test.com',
    ds: "wechat",    //  data source
    t:"event",  //  track type
  },
  maxLogLength:10,
  enableLogger: true,
  LoggerName: 'Event',  // Logger Name to store the log locally
  proxyURL : "YOUR_PROXY_URL" // Wechat mini program is not allowed to send to GA server directly, you will require a middle server to forward the hits
}

const GAEventTracker = new GA(Eventconfig)

Custom Dimension & Custom Metrics

  • Custom Dimension / Custom Metrics

要设置 custom dimension 最简单的方式, 就是定义在 config 中或者 手动传入, 例如

const config = {
  data: {  //common request payload
    v: 1,
    cid: 1234556,   //clientId
    tid: "UA-71412438-1",   //ga property ID
    dp: "/not_set",    // document path
    dh:'www.test.com',
    ds: "wechat",    //  data source
    t:"pageview",  //  track type,
	cd1: "custom dimension 1",
	cd2: "custom dimension 2",
	cm1: "5.00"

  },
  maxLogLength:10,
  enableLogger: true,
  LoggerName: 'pvLog',
  debug:true,
}

const GAPvTracker = new GA(config)

或者是后续手动传入

GA.post({
  t:'event',
  dp: '/pdp',
  ec:'action',
  ea:"add to cart",
  cd1: "custom dimension 1",
  cd2: "custom dimension 2",
  cm1: "5.00"
})
  • Product Scope Custom Dimension

对于 hit 或者是 user scope 的 dimension / metric 可以用以上的方法传入. 对于 product scope 的 dimension 和 metric 则要通过以下的方式进行定义. Product Scope CD 只能通过以下的方式手动传入,不支持在 config 中提前定义.

GA.post({
    dp: "/wechat",
    t: 'event',
    ec: "test",
    ea: "wechatSDK",
    pa: "detail",

    "products": [{
        "id": "bc823",
        "name": "Fuelworks T-Shirt",
        "price": "92.00",
        "brand": "Fuelworks",
        "category": "T-Shirts",
        "position": "4"
    }, ],
    productScopeCD: {
        '3': 'custom dimension3',  // cd Index : cd Value
        '4': "custom dimension3"
    },
    productScopeCM: {
        '2': 100,  // cm Index : cm Value
    }
})

Enhance Ecommerce Tracking

Enhance Ecommerce 的功能也是遵循 Mearseurement protocol 的规范实现的. SDK 在此基础上增加了对 products/impressions/promotions 的支持, 以提高易用性. 请注意, 不要把products 相关的信息定义到 config 里, 最佳做法是在特定页面把 products/impressions/promotions 相关数据手动传入.

  • Details 追踪 Enhance Ecommerce details 需要定义参数 pa 和对应的 products
GA.post({
    dp: "/pdp",
    pa: "detail",
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }]
})
  • Add to cart 追踪 Enhance Ecommerce Add to cart 需要定义参数 pa 和对应的 products
GA.post({
    dp: "/cart",
    pa: "add",
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }]
})
  • Remove from cart

追踪 Enhance Ecommerce Remove from cart 需要定义参数 pa 和对应的 products

GA.post({
    dp: "/cart",
    pa: "remove",
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }]
})
  • Checkout 追踪 Enhance Ecommerce Checkout 需要定义参数 pa 和对应的 products 以及 cos (checkout step)
GA.post({
    dp: "/cart",
    pa: "checkout",
	cos:"1", //checkout step
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }]
})
  • Checkout option 追踪 Enhance Ecommerce Checkout option 需要定义参数 pa 和对应的 cos 值
GA.post({
     t: "event",
	 ec: "Checkout options",
	 ea: "shipping"
    dp: "/cart",
    pa: "checkout_option",
	cos:"顺丰",
})
  • Transaction 追踪 Enhance Ecommerce Checkout option 需要定义参数 ti ,tt, 以及对应的结账 products
GA.post({
    dp: "/thankyou",
    pa: "purchase",
	ti: "cd2ad00b-acc9-45ab-b1e0-f4720375d2f0",
	ta: "Online Store",
	tr: 118,
	tt: 5.00,
	ts: 5.00,
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }]
})
  • Refund 追踪 Enhance Ecommerce Checkout option 需要定义参数 ti ,tt, 以及对应的结账 products
GA.post({
    dp: "/refund",
    pa: "refund",
	ti: "cd2ad00b-acc9-45ab-b1e0-f4720375d2f0",
	ta: "Online Store",
	tr: 118,
	tt: 5.00,
	ts: 5.00,
})
  • Impression

追踪 Enhance Ecommerce Checkout option 需要传入对应的的展示商品

GA.post({
    dp: "/top10Tshirt",
    impresstions: [{
            "id": "b55da",
            "name": "Flexigen T-Shirt",
            "price": "16.00",
            "brand": "Flexigen",
            "category": "T-Shirts",
            "position": 0,
            "list": "top10"
        },
        {
            "id": "f6be8",
            "name": "Comverges T-Shirt",
            "price": "33.00",
            "brand": "Comverges",
            "category": "T-Shirts",
            "position": 1,
            "list": "top10"
        }
    ]
})
  • Impression click

追踪 Enhance Ecommerce Checkout 需要定义参数 pa 和对应的 products

GA.post({
    dp: "/top10Tshirt",
    pa: "click",
	pal:"top10", // 对应 impressions 中 的list
	products: [{
      "id": "b55da",
      "name": "Flexigen T-Shirt",
      "price": "16.00",
      "brand": "Flexigen",
      "category": "T-Shirts",
      "position": 1,
    }]
})
  • Promotion 追踪 Enhance Ecommerce Checkout 需要定义对应的 promotions
GA.post({
    dp: "/top10Tshirt",
     promotions: [{
        "id": "bts",
        "name": "Back To School",
        "creative": "PRODUCT banner",
        "position": "right sidebar"
      }]
})
  • Promotion click

追踪 Enhance Ecommerce Checkout 需要定义对应的被点击的 promotions 和参数 promoa

GA.post({
    dp: "/top10Tshirt",
	promoa: "click",
     promotions: [{
        "id": "bts",
        "name": "Back To School",
        "creative": "PRODUCT banner",
        "position": "right sidebar"
      }]
})

请注意, SDK 只对 products/impressions/promotions 相关进行了相应的简化处理, 其余参数依旧遵循了 Mearseurement protocol 的规范. 参数对应的值,请参阅 Mearseurement protocol 的规范. 当然你可以直接不使用以上语法糖进行products 参数的转换,手动将自行转换好的参数,传入并发送. 例如

GA.post({
    dp: "/top10Tshirt",
	promoa: "click",
   promo1id: "bts",
   promo1nm: "Back To School",
   promo1cr: "PRODUCT banner",
   promo1ps: "right sidebar",
   promoa: "click"
})

impression 和 promo 同样也可以跟着其他类型一起发送

GA.post({
    dp: "/pdp",
    pa: "detail",
    products: [{
        id: "b55da",
        name: "Flexigen T-Shirt",
        price: "16.00",
        brand: "Flexigen",
        category: "T-Shirts",
    }],
    promotions: [{
        "id": "bts",
        "name": "Back To School",
        "creative": "PRODUCT banner",
        "position": "right sidebar"
    }],
    impresstions: [{
            "id": "b55da",
            "name": "Flexigen T-Shirt",
            "price": "16.00",
            "brand": "Flexigen",
            "category": "T-Shirts",
            "position": 0,
            "list": "top10"
        },
        {
            "id": "f6be8",
            "name": "Comverges T-Shirt",
            "price": "33.00",
            "brand": "Comverges",
            "category": "T-Shirts",
            "position": 1,
            "list": "top10"
        }
    ]
})

Media Tracking

对于 GA UTM tracking, 同样需要提前定义相关参数,例如以下示例.

var config = {
    data: { //common request payload
        v: 1,
        cid: 1234556,
        tid: "UA-71412438-1",
        dp: "/not_set",
        ds: "wechat",
        t: "pageview",
    },
    debug: true,
    validateHit: true, // will send to the vvalidation endpoint(optional)
    maxLogLength: 10,
    enableLogger: true,
}

App({
    onShow: function(options) {
        let utm = {
            cs: "wechat",  // utm_source
            cm: options.scene, // utm_medium
            cn: "Campaign Name", // utm_campaign
            cc: "content", // utm_campaign
        }
        config.data = {
            ...config.data,
            ...utm
        }
        var GA = new GA(config)
        GA.post({
            dp: "/App_launch"
        })
    },
})

场景值 (Scene Value) 是 微信小程序提供用来描述用户进入小程序的路径. 场景值通常可用于展现不同的入口带来的流量. 以上示例 将场景值放在 medium 中来区别从不同入口进入小程序的流量

对于扫描二维码进去小程序的场景,则需要将相应的 UTM 参数加入到 二维码中,当用户扫描二维码进入的时候读取相应的 source/medium/campaign/content 相应值, 并发送到 GA

Best Practice

  • Regex Table 转换对应的参数

在真正的 tracking 项目中, 经常会需要根据条件来判断和处理对应的值. 通过 SDK 提供的 interceptor 和 regex table, 我们可以轻松完成这种处理,并使代码保持整洁 示例: 根据 regex 来给对应的 dp 进行分组设置, 并设置 Content Grouping

const m = [{
        inputRegex: "index",
        outputName: "'home'"
    },
    {
        inputRegex: "T-shirt|dress|shoes",
        outputName: "'pdp'"
    },
    {
        inputRegex: "myAccount|login|signup",
        outputName: "'account'"
    },
    {
        default: "others"
    }
]
GA.interceptors.request.use(function(config) { // push a handler function before send request
    config.data.cg1 = GA.weUtils.map(m, config.data.dp) // process data before send to GA, set content gronping 1
    return config;
});
  • 利用 logger 来重新发送失败请求

通过 SDK 提供的 interceptor 和 Logger , 也可以轻易的实现错误重试的功能. 以下示例会在每次发送请求前检查存在本地的请求是否失败,并重新发送. 请注意, 如果要加上错误重试功能,请务必加上重试次数,否则有可能造成死循环.

let conf = {
    LoggerName: "retry",
    maxLogLength: 10,
    debug: true,
    data: {
        'ua': "UA-1-1",
        "v": 1
    }
}
var retry = new GA(conf)
GA.interceptors.request.use(function(config) { // push a handler function before send request
    let t = GA.log.find(n => n.type = 'error')
    //console.log(t)
    retry.post(t.data)
    return config;
});
  • 页面劫持自动发送 pageView

小程序有生命周期的概念,在启动过程中有不同的阶段用于不同的处理. pageview应该在 onShow 触发最为合适.

小程序的开发构架是每个页面都有独立的启动阶段,那么对应 pageview 埋点而言, 就要在手动的在每个页面的 onShow 里调用相应的 pageview 代码. 这在页面很多的时候会显得不易维护且相对麻烦. 小程序的 Page 对象 是可以在每个页面共享的, 所以理论上我们可以通过劫持 Page 来实现自动埋点.

const originPage = Page;

Page = (page) => {
  const originMethod = page['onShow'];
  page['onShow'] = function () {
    GA.post({
      dp: this.route,
    })
    return originMethod();
  }
  return originPage(page);
};

以上代码会劫持每个页面的 page 函数,并在之间先执行 pageview 上报,再继续执行原来每个页面的定义的 onShow 函数. 每当每个页面的 Page 渲染的时候便可以实现自动的上报.

但是这个做法也会造成一些问题. 例如, 假设我需要在一些特殊的页面多发几个 CD 呢? 自动上报的并不包含这些 cd. 一个好的解决方案是, 在 config 里定义所需全部变量, 在不同页面,如果有值返回 true, 没有则返回 false. 请求在发送前会将所有为 false 的参数 filter out

var config = {
    data: { //common request payload
        v: 1,
        cid: 1234556,
        tid: "UA-71412438-1",
        dp: getPage(),
        ds: "wechat",
        t: "pageview",
		cd1: getCD1(),
		cd2: getCD2()
    },
    debug: true,
    validateHit: true, // will send to the vvalidation endpoint(optional)
    maxLogLength: 10,
    enableLogger: true,
}

另一种方案是在 onShow 函数传递相应的参数

const originPage = Page;

Page = (page) => {
  const originMethod = page['onShow'];
  page['onShow'] = function (data) {
    GA.post({
      dp: this.route,
	  cd1: data.cd1,
	  cd2: data.cd2,
    })
    return originMethod();
  }
  return originPage(page);
};

如果在页面不多的情况下, 手动埋点依旧是最佳的方式.

API Usage

[GA].post / [GA].get

用于指定发送数据的方式. 我们在这里强烈推荐使用 post 发送数据.

Require Args Expected Value Return Value Comment
object object undefined 传递的参数必须是对象,传递的参数会被统一处理成序列发送
GA.post({
    ua: "UA-1-234567",
    v: "1",
    cid: "123456",
    dp: "/home"
})

如果出于特殊的原因,也可以使用 get 发送请求

GA.get({
    ua: "UA-1-234567",
    v: "1",
    cid: "123456",
    dp: "/home"
})

[GA].validation

SDK 内置实现了一个简易的用于验证参数的对象. 可用于自定义检验参数的规则. Mearsurement Protocol 本身不对参数进行校验, 此模块默认不开启. 需要开启此模块,则需要在 config 设置 validateParams 为 true. 通常建议在开发调试阶段使用此模块检验请求参数,在生产环境关闭此模块.

内置默认了以下几个简单检查规则

  • 检查 cid ua cid 是否存在
  • 检查 ua 的格式
  • 检查请求的长度是否超出 GA 限制的 8012KB

提供以下 API 用于自定义检验规则

  • [GA].validation.addRequirelist
Require Args Expected Value Return Value Comment
String "dp", "ua"... object 检验通过则返回检验对象,否则报错

使用以上方法可以增加需要检查的必须参数. 以下例子用于定义了对 dp 是否存在的检查

GA.validation.addRequirelist("dp")
  • [GA].validation.addRegexList
Require Args Expected Value Return Value Comment
Object object object 检验通过则返回检验对象,否则报错. 检验规则必须以对象的方式传入

使用以上方法可以自定义regex 用于检查相应的参数. 以下例子定义了对 regex 对 dh 和 dl 进行检查

GA.validation.addRegexList({
    "dh":"uat|dev|qa.gatest.com",
	"dp" : "[^\/]$"
})
  • [GA].validation.add
Require Args Expected Value Return Value Comment
function function object 检验通过则返回检验对象,否则报错. 检验规则必须以函数的方式传入. 检验通过必须返回检验对象

自定义检验函数, 传入函数会保存在 array 中按顺序执行.可以多次使用此 API 传入多个自定义检验函数. 以下示例用于检查请求参数中是否dp 和 dh 都存在

GA.validation.add((obj) =>{
    if(obj.hasOwnProperty("dp") && obj.hasOwnProperty("dh") ){
	    return obj
	}
	return throw new Error("dp and dh is mandotory!")
	})

[GA].interceptor.request.use

Require Args Expected Value Return Value Comment
function function object 拦截函数必须以函数的方式传入. 必须返回拦截对象

interceptor 用于在请求发出去前拦截对象并做相应处理. interceptor 与 config 中的 transferReponse 的不同是 interceptor 可以设置多个拦截函数. 以下示例展现每次拦截对象并对 dp 进行相应的处理.

GA.interceptors.request.use(function(res) { // push a handler function before send request
      res.data.dp = res.data.dp == 'index'? "home": res.data.dp // process data before send to GA
      return res;
});

[GA].weUtils

内置的小程序工具函数.

-[GA].weUtils.map

内置的 regex table, 可用于对数据进行额外的 regex table 的处理

Require Args Expected Value Return Value Comment
table : object
field : String
table : object
field : "dp"
String 返回对应的输出

以下是一个示例, 用于输出对应的 GA property

let m = [{
        inputRegex: "au|en|fr.gatest.com",
        outputName: "UA-7689450-6"
    },
	{
	    inputRegex: "cn.gatest.com",
        outputName: "UA-7689450-6"
	},
    {
        default: "UA-1-1"
    }
]

let tid = GA.weUtils.map(m,"dl")
console.log(tid)

-[GA].weUtils.mappingSceneToCN

内置工具将场景值转换成中文

Require Args Expected Value Return Value Comment
num : number
table : Object
1089, Object String num 必须, table 如果没有指定将使用内置转换表

以下是一个示例, 用于输出对应的 GA property

App({
    onLaunch: function() {
        console.log('App Launch')
    },
    onShow: function(options) {
        let cm = GA.weUtils.mappingSceneToCN(options.scene)
        console.log(cm)
    }
})

[GA].getLog

Require Args Expected Value Return Value Comment
null null array 返回存在本地的 log
let log = GA.getLog()
console.log(log)

[GA].setLog

Require Args Expected Value Return Value Comment
array array undefined 设置相应的log, 会覆盖当前存在本地的log

以下实例展现了增加一个 log 到本地

let log = GA.getLog()
log.push({
    type:"inset a log",
	data: "test log",
})
GA.setLog(log)
console.log(log)

config

config 用于管理实例的配置, 需要在实例化时传入,不允许为空. 默认有以下配置

  • data: 需要在默认配置中发送到 GA 的数据.需要以对象的格式传入
Params Type defalut Value Expected Value Comment
data Object empty object 比如以对象按照键值传入
  • proxyURL: 微信小程序不能直接发数据到 GA 的 endpoint, 因为需要一个转发服务器用于转发相应的请求到 GA 的服务器. 这个参数在生产环境的时候是必须要设置的
Params Type defalut Value Expected Value Comment
ProxyURL String empty https://www.yourProxyURL.com/collect 需要替换成自己实际的转发域名
  • debug: 参数用与决定实例是否开启调试模式. 主要用户在开发阶段验证参数是否可以直接被 GA 收到. 当没有 制定 proxyURL 并且 debug 为 true 的时候, 默认发送的 endpoint 为 https://www.google-analytics.com/collect
Params Type defalut Value Expected Value Comment
debug boolean false true,false 主要用于决定发送数据的 endpoint
Params Type defalut Value Expected Value Comment
validateHit boolean false true,false 主要用于决定发送数据的 endpoint
  • **enableLogger ** : 此参数用于决定是否开启 Logger 用于记录发送的请求. 发送的请求的会存在 localStorage (web) 或者是 Storage (wechat)
Params Type defalut Value Expected Value Comment
enableLogger boolean true true,false 是否启用 Logger
  • **LoggerName ** : 此参数用于决定存在 localStorage (web) 或者 Storage (wechat) 的键值. 如果有多个实例, 建议为每个实例设置不同 LoggerName
Params Type defalut Value Expected Value Comment
LoggerName String gaLog "PageViewLog", "EventLog" 命名存在本地的Logger
  • wxRequestTimeout : 此参数用于请求的 微信小程序 timeout 间隔.
Params Type defalut Value Expected Value Comment
wxRequestTimeout Number 2000 3000,4000 单位是毫秒
  • transaferRequest : 在发送 Request 之前进行额外的处理.
Params Type defalut Value Expected Value Comment
transaferRequest(config:object) empty function function transaferRequest 默认的参数是整个对象的配置
发送到 的数据存在 config.data
必须返回 config (object)
  • transferResponse : 在收到 Response 之后进行额外的处理.
Params Type defalut Value Expected Value Comment
transferResponse(res:object) empty function function transferResponse 默认的参数是返回的reponse (object)
  • onSuccess : 发送成功之后的回调函数
Params Type defalut Value Expected Value Comment
onSuccess(options:object,res:object) empty function function onSuccess 默认的参数
options请求的对象
res:返回的请求
  • onError : 发送失败之后的回调函数.
Params Type defalut Value Expected Value Comment
onError(options:object,res:object) empty function function onError 默认的参数
options: 请求的对象
res:返回的请求

Config 必须在创建实例时传入,以下是一个示例

const config = {
    transferRequest(config) {
        console.log('do something before sending the hit')
        //config.data.dp = "/test"
        return config
    },
    transferResponse(res) {
        console.log("do something for the response")
        return res
    },
    data: { //common request payload
        v: 1,
        cid: 1234556, //clientId
        tid: env == 'dev': "UA-5465464-2": "UA-78546532-1",
        ds: "wechat", //  data source
        t: "pageview", //  track type
        debug: true,
        validateHit: true,
    },
    maxLogLength: 10,
    enableLogger: true,
    LoggerName: 'WechatLog',
    onSuccess(config, res) {
        console.log("success") //your custom success function (options)
    },
    onError(config, res) {
        console.log("Error")
    },
}
const GA = new GA(config)

TODO

  • 移除 web 相关功能
    • 未来将在下一版本中逐渐移除 web 相关的支持, 如果需要在 web 端有相应的场景, 请直接使用 官方 GA SDK 和 GTM. 这里增加 web 的支持只是为了方便调试.
  • 整合微信小程序相关API
    • 将进一步整合微信小程序内置 API, 简化部署方式
  • UTM 参数的自动读取
    • 下一版本会支持自动从 route 中读取 UTM 参数
  • 提高代码健壮程度, 重构代码
    • 移除无用代码, 增加错误验证, 优化报错信息, 重新组织代码

Authors

LRENZ- simple is less - Linkedin

Reference

此 SDK 只是从代码层面提供了一个 API 友好并且功能完善的的解决方案. 对于一个完整的微信的小程序 tracking, 更多的时间也要花在定义需要追踪 KPI 并将这些 KPI 转化到需要发送到 GA 的参数. 因为, 非常建议在使用此 SDK 前先了解 GA 和 Measurement Protocol

License

This project is licensed under the MIT License - see the LICENSE.md file for details