1.
Node.js使用QConf踩坑记录(CentOS)
一、安装QConf客户端(如果服务器上已安装可以跳过此步骤)
1、安装CMake (如果已安装可以跳过)
1.1 准备编译环境
1 | yum -y install gcc gcc-c++ |
1.2 获取源码,并解压
1 | wget https://github.com/Kitware/CMake/releases/download/v3.19.1/cmake-3.19.1.tar.gz |
1.3 编译安装
1 | ./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make |
2、安装 QConf
1 | git clone git@github.com:Qihoo360/QConf.git (如果没有权限可以直接去 Github 主页下载 zip 包) |
3、启动
1 | /usr/local/qconf/bin/qconf_agent |
结尾可能出现 Failed to get conf!
是一个 WARNING,可以暂时忽略,已经启动成功了。
二、在 Node.js 调用
1、在项目中安装 node-qconf
首先配置环境变量
1 | export QCONF_INSTALL=/home/work/local/qconf |
安装依赖1
npm install node-qconf
2、调用
1 | // qconf.js |
qconf 的错误处理不太完善,又十分依赖本机环境,容易出现程序直接中断而没有报错的情况。因此需要 try catch (包括 require(‘node-conf’) 语句)
三、常见问题
Q:报错:Error: QConf init failed: 201
A:大概率是因为 QConf 没有启动 (参考 https://github.com/Qihoo360/QConf/issues/22)
Q:npm 安装 node-qconf 报错:
1 | ../qconf.cc:2:19: fatal error: qconf.h: No such file or directory |
A:安装 node-qconf 前,需确保 QConf 已经被正确安装,并配置了 QCONF_INSTALL 环境变量
Q:require('node-qconf')
报错:
1 | Error: libqconf.so: cannot open shared object file: No such file or directory |
A:找不到libqconf.so
文件,需要在/usr/lib或/usr/lib64下创建libqconf的软连接
1 | sudo ln -s /usr/local/qconf/lib/libqconf.so /usr/lib64/libqconf.so |
参考链接:
https://github.com/Qihoo360/QConf
https://github.com/Qihoo360/QConf/blob/master/doc/Qconf%20Node%20Doc.md
Typescript在开发中的体验提升
1. 标记参数和返回值,方便维护
1 | // login |
1 | interface UserConfig { |
2. 代码补全
声明文件 d.ts
其实我们一直在用 ts
VSCode 对 d.ts 的支持
Automatic Type Acquisition
功能,会将自动下载社区中流行的 @types
Webstorm 对 d.ts 的支持
自动
对于自己的库,可以编写自己的 d.ts,发布到 @types/
下
1 | // @types/xxx/index.d.ts |
uniapp微信小程序自动页面埋点和曝光埋点踩坑
基本功能介绍
页面埋点
在页面的 onShow 勾子函数中上传埋点数据
曝光埋点
利用小程序提供的 createIntersectionObserver
API, 监听元素露出屏幕的事件,并触发回调(参数为元素的相关信息),由业务组件在回调中自己上传埋点数据。
1 | export class Exposure { |
由于业务需求,页面埋点和曝光埋点还需要有以下逻辑
1. 进入页面时(用户未操作),立即触发页面埋点和曝光埋点
2. 跳到其他页面再返回时,需要再次触发页面埋点和当前在屏幕露出的元素的埋点
页面埋点很容易处理,而曝光埋点很麻烦,因为 IntersectionObserver
只能监听元素可见性变化,无法静态获取是否露出元素,因此需要在每个页面监听 onHide
和 onShow
事件,在 onHide
时销毁所有监听实例,在 onShow
时重新监听(因为 IntersectionObserver
创建时会默认触发一次事件,即可达到重新触发曝光的目的)
但如果这些逻辑放在业务代码中,非常繁琐且重复,因此使用全局 mixin 处理。
二、 全局 mixin
页面埋点
每次 onShow 时都触发一次页面埋点
曝光埋点
首次 onShow 时初始化曝光埋点(初始化不在此控制,因为加载时机不同,所以放在在业务逻辑中)并将曝光埋点实例存在 exposureObservers 中以备后用;同时标记 isPageFirstLoad 为 false
每次 onHide 时销毁所有曝光埋点
下次 onShow 时,遍历并调用
exposureObservers
中的所有实例的reInit
方法
Mixin代码:
1 | /** |
Exposure修改为:
1 | export class Exposure { |
三、坑:iOS微信bug导致页面和曝光不准
1. 问题描述
iOS版本微信存在一个问题:从一个非TabBar页面A切换到TabBar页面B时,如果TabBar当前不处于目标页面B,会先短暂展示一下当前TabBar所在页面C,然后再切换到B。
结果就是页面C的 onShow
和 onHide
被执行,导致多发送一次页面和一批曝光事件。
除此之外,当二次复现此路径时,还会额外多触发一次B埋点,也就是发送2次B埋点。
相关链接
https://developers.weixin.qq.com/community/develop/doc/000ea812d54ab0cfea3a23eaf51400
2. 解决方案
过滤页面埋点
在调用 switchTab
前,记录全局变量 isSwitchingTab
(表示当前正在切换TAB)1
Vue.prototype.isSwitchingTab = 'pages/shopping-cart'
在全局 mixin 的 onShow 方法中,判断这个变量,如果当前页面路由和 isSwitchingTab
的值相同,才认为当前是真正想跳转的页面,而不是由于 bug 短暂展示的页面。这样就过滤掉了本就不应该触发的C页面的 onShow。
同时,在进入B页面 onShow 后,延迟2s清除 isSwitchingTab ,防止影响下次跳转。
1 | if ( |
此处还有一个点需要注意:在使用 getCurrentPages()
获取的页面栈中,并不包含C页面,只能在 this[__route__]
中读取当前页面的 route 属性。这说明对于微信小程序来说,C页面的意外展示是不被承认的,毕竟它连一个痕迹都木有留下。
过滤重复发送的B埋点
在发送埋点时,判断当前页面是否刚刚发送埋点,如果2s内有发送过,就不再发送
1 | // 防止重复曝光 |
四、最终代码
Mixin代码
1 | import { reportData } from '@/common/report-data' |
Exposure
1 | export class Exposure { |
五、调用方法
页面埋点
在页面组件中定义 pageTrackConfig
属性即可,无需额外处理
支持 String
和 Function
1 | // string |
曝光埋点
1 | // 参数:选择器(支持多个),曝光回调,当前组件实例(即this) |
VSCode中的油猴--powertools插件试用
简介
Power Tools 是一个 VSCode 插件, 可以让用户随时编写自己的脚本, 并能很方便地在 VSCode 中运行, 而且支持 VSCode 扩展的 API.
下面来使用 Power Tools 实现一个半自动 px 转 rpx 的快捷功能.
使用条件
- VSCode
- Power Tools 插件
一、 安装
直接从 ego-digital.vscode-powertools 安装
或在VSCode中搜索
使用AST实现自动配置WebPack接口代理
背景
在开发物料平台的过程中, 为了提升物料开发的效率, 对 api 接口做了约定, 将物料用到的接口都配置到同一个 js 文件内.按照变量名划分.
1 | const mApi = { |
为了减少操作, 打算根据这个文件自动配置代理.