江辰

博客

如何搭建前端异常监控系统

发布于 # 异常监控

什么是异常 是指用户在使用应用时,无法得到预期的结果。不同的异常带来的后果程度不同,轻则引起用户使用不悦,重则导致产品无法使用,从而使用户丧失对产品的认可。 为什么要处理异常 增强用户体验 远程定位问题 无法复现问题,特别是移动端,各种原因,可能是系统版本,机型等等 前端有哪些异常 异常 频率 JavaScript 异常(语法错误、代码错误) 经常 静态资源加载异常(img、js、css) 偶尔 Ajax 请求异常 偶尔 promise 异常 较少 iframe 异常 较少 如何捕获异常 try-catch try-catch 只能捕获同步运行错误,对语法和异步错误却捕获不到。 1、同步运行错误 try { kill; } catch(err) { console.error('try: ', err); } 结果:try: Ref

如何基于tristana项目模板,打造一个基本列表展示

发布于 # Tristana

基于 tristana 这套项目模板,引导大家如何创建列表展示,搜索,自动处理 loading 状态等。全部代码在仓库下。 最终效果: 网站效果预览:https://order.downfuture.com 开始之前 确保 node 版本是 8.4 或以上 用 cnpm 或 yarn 能节约你安装依赖的时间 Step 1. 安装 tristana 并创建项目 $ git clone https://github.com/Cherry-Team/tristana.git $ cd tristana $ cnpm i $ npm start 浏览器会自动开启,并打开 http://localhost:8080 Step 2. 生成 Dashboard 路由 我们要新增路由,新建页面文件和在 routeConfig 引入该文件即可。 新建 src/pages/Dashboard/inde

基于 Taro 实现签字,轨迹回放

发布于 # Taro

前言 最近公司要在小程序上实现签字笔迹追踪,看了下网上关于 Taro 如何实现的文章,代码都很乱,很杂,所以,想记录下自己是如何实现的,并附上源码。 效果演示 源码 index.js import Taro, { Component } from '@tarojs/taro'; import { View, Canvas } from '@tarojs/components'; import './index.less'; // 图片url(或filepath)转base64 const fileTobase64 = path => { return 'data:image/jpeg;base64,' + Taro.getFileSystemManager().readFileSync(path, 'base64'); }; // 签字轨迹 const historyT

Webpack 如何配置热更新

发布于 # Webpack

什么是 HMR 是指 Hot Module Replacement,缩写为 HMR。对于你需要更新的模块,进行一个"热"替换,所谓的热替换是指在不需要刷新页面的情况下,对某个改动进行无缝更新。如果你没有配置 HMR,那么你每次改动,都需要刷新页面,才能看到改动之后的结果,对于调试来说,非常麻烦,而且效率不高,最关键的是,你在界面上修改的数据,随着刷新页面会丢失,而如果有类似 Webpack 热更新的机制存在,那么,则是修改了代码,不会导致刷新,而是保留现有的数据状态,只将模块进行更新替换。也就是说,既保留了现有的数据状态,又能看到代码修改后的变化。 总结: 加载页面时保存应用程序状态 只更新改变的内容,节省调试时间 修改样式更快,几乎等同于在浏览器中更改样式 安装依赖 $ npm install webpack webpack-dev-server --save-dev packag

微信小程序 Canvas 签字

发布于 # 微信小程序

最近迫于签字结果返回太慢,所以需要把旋转图片由原先后端处理改为前端处理,查阅文档,研究一番,发现小程序上旋转,主要是通过 canvas 的 translate、rotate 完成。 Canvas 坐标系统,由上图可得,Canvas 2D 环境中坐标系统和 Web 的坐标系统是一致的,有以下几个特点: 坐标原点 (0,0) 在左上角 X 坐标向右方增长 Y 坐标向下方延伸 伪代码 wx.canvasToTempFilePath({ x: 0, y: 0, canvasId: 'myCanvas', success: (res) => { wx.getImageInfo({ src: res.tempFilePath, success: (imageRes) => {