前言
基于上篇 消息推送到微信:给我的npm插件加上消息推送 - 掘金 (juejin.cn) 实现了我的npm
插件添加了消息推送功能,之后在项目打包使用时,可以将打包消息推送到微信,目前对于我来说体验还是不错的;于是我决定现在进一步实现我个人工作中的其他需求!
然后我就闭上眼睛开始想了想,我每天上班有那些必须做的事情呢?写代码?喝水?摸鱼?
好像没发现啥痛点问题啊!然后我突然想起来我每天是要打卡的、还有就是每周要写周报的,于是我有了想法:
每天推送下班打卡消息提醒
虽然企业微信是有下班打卡提醒的,但提醒时间好像也是不准,也不知道是我的手机问题,还是网络问题,时有时无,有时还不能准时准点推送;所以我就想要一个下班时间准点推送消息到我的微信,提醒我该打卡了!毕竟拿手机看微信的时候是比较多的。每周推送填写周报消息提醒
每周一次周报填写,虽然我基本上没忘记过! 但不排除有事请假、一堆事忙的时候,万一忘记了就会被负责统计的同事截图发大群里通知,@谁谁谁没填写周报,属实尴尬。
所以这两点就是我个人工作中的痛点也可以说是需求,其实也是非常的简单的需求,无疑是开启2个定时任务,到点执行而已。激动的心颤抖的手,那就快点开始吧!
需求关键点
消息推送服务api
可以使用现成的别人写好的服务、当然你也可以使用node自己实现一个消息推送服务服务器
因为我们写好代码,最终是要将其部署到服务器上的,执行脚本必然是需要一台服务器来运行的 如果你说拿自己的电脑跑定时任务也可以,但是避免不了电脑关机等一系列问题导致服务中断; 经过学习我了解到GitHub
可以免费给开发者提供用于运行脚本的服务器资源,也就是GitHub actions
,那我熟悉呀,之前可是用它实现了我的博客自动部署的,于是我就先尝试了 github来实现我的需求!
环境搭建
很简单,因为是基于github actons
, 所以必须把代码托管在github
了,因为源码想的使用 ts
编写,所以就安装了 ts
、 ts-node
等,但是刚开始就遇到了问题
环境依赖:
"scripts": {
"dev1": "node --loader ts-node/esm ./src/index.ts",
"dev2": "ts-node ./src/index.ts",
"dev": "tsx ./src/index.ts"
},
"dependencies": {
"ts-node": "^10.9.2",
"tsx": "^4.7.2",
"typescript": "^5.4.5"
}
运行.ts文件时报错问题
1、ReferenceError: exports is not defined in ES module scope
执行pnpm dev2
报错: 导出未在ES模块范围中定义
原因:tsc --init
初始的 tsconfig.json
文件默认 "module": "commonjs"
,需要改成 "module": "ES6"
2、TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension “.ts”
执行pnpm dev2
报错: 未知的文件扩展名“.ts”
解决方案1
使用命令node --loader ts-node/esm ./src/index.ts"
解决方案2
tsconfig中配置:"ts-node": { "esm": true }
3、CustomError: Cannot find module xxx
解决完问题2后,此时执行pnpm dev1
、 pnpm dev2
都会报错 CustomError: Cannot find module
看到这篇资料 :node.js - node-ts 使用 esm 模块构建,引入第三方包 ERR_MODULE_NOT_FOUND - SegmentFault 思否
说是 ts-node
本身就存在这个问题!!!好坑,不费劲了直接选择别的方案。
4、使用 tsx 替代 ts-node
tsx
可以说是简单好用,安装: pnpm i tsx
,使用:tsx xxx
直接成功,报错消失。
github actions 定时任务的时区、执行时间延迟问题
时区问题
github actions
中设定的 schedule 是UCT,时间 08:00(也就是北京时间的16:00),因为时区的问题北京时间需要 + 8小时,但实际运行的时间为北京时间17:00、17:20 不等任务执行时间延迟、不准
因为github
使用的人比较多,在准点高峰时间段,他只能排队延迟执行任务,所以如果定时任务要求准时准点的执行的话 github 就不能满足了。
网上资料 github actions
的定时任务延迟、不准问题需要设置虚拟执行环境的时区也是不能解决的!!!
最终我只能放弃,然后通过学习了解知道了云函数,然后使用云函数替代了 github actions
,实现了我的需求。
什么是云函数
云函数(Cloud Function)提供了一种直接在云上运行,无状态的、短暂的、由事件触发的代码的能力。云函数是无服务器(Serverless)执行环境,用户在无需购买和管理服务器的情况下运行代码,只需使用云平台支持的语言编写代码并设置代码运行的条件,即可在云上运行代码,是实时文件处理和数据处理等场景下的理想计算平台。
简单来说就是:如果你对服务器相关知识不了解,那现在也不需要知道了;你可以用你趁手的语言写个函数(如nodejs),函数即是服务(接口),写好后直接就可以在任何地方触发调用了,其它服务器配置什么的都不需要关心。
云函数能干什么
理论上传统后端能干的事儿云函数都能干,但术业有专攻,根据云函数的特性和当下的主流环境,建议用云函数来搭建小型web应用后端、公众号/小程序、工具型接口等。
事实上小程序推的云开发就是基于腾讯云的 serverless
的,包括了云函数、云数据库和云存储。
提供云函数的公有云厂商
亚马逊的AWS、微软的Azure、Google Cloud
、IBM Cloud
、阿里云、腾讯云、百度云等都提供云函数服务。
有云 | 请求次数 | 运行时间 | 网络流量 | 免费数据库 | 东南亚区域 | 备注 |
| ———— | ——- | ———————– | ——— | —– | ———— | —— |
| AWS | 100万 | 400,000 GB-秒 | 1GB | 有 | 香港、东京、新加坡 | |
| Azure | 100万 | 400,000 GB-秒 | 5GB | 有 | 香港、韩国、日本、新加坡 | 存储帐户收费 |
| Google Cloud | 200万 | 400,000 GB-秒+200,000GHz | 5GB | 有 | 香港、台湾 | 国内无法访问 |
| IBM Cloud | 无限 | 400,000 GB-秒 | 不明 | 有 | 东京 | |
| 阿里云 | 100万 | 400,000 CU-秒 | 无 | 无 | 中国、香港、东京、新加坡 | |
| 腾讯云 | 10万 | 20,000 GB-秒 | 0.5GB | 无 | 中国、香港、新加坡 | 不再免费 |
| 百度云 | 100万 | 400,000 GB-秒 | 1GB | 无 | 中国 | 前三个月免费 | |
| 华为云 | 100万 | 400,000 GB-秒 | 不明 | 无 | 中国、香港、泰国 | |
| LeanCloud | 无限 | 18小时/天 | 1GB | 有 | 中国
这里我选择使用华为云,因为它是免费!!!对于我自己的需求来说,完全够用!真的太棒了,这里要给华为点赞!
函数创建使用
直接参考官网的用户指南,写的也是非常详细: 创建程序包_函数工作流 FunctionGraph_用户指南_构建函数 (huaweicloud.com)
zip上传代码
上传zip包需要注意的是,zip包里的入口文件名称以及导出的 执行函数要与 云函数设置中对于字段配置保持一致,不然会执行失败!
- 配置测试事件
因为我们的需求很简单,这里可以直接选择空白模板就行
点击测试后右边就会出现测试结果
项目打包zip
由于我之前实现了一个 打包zip的npm插件,正好可以拿过来使用,简直美滋滋!
安装:pnpm i plugin-zip-pack -D
使用:
plugins: [
pluginZipPackRollup({
optZipName: 'dist',
isPackagingTime: false
}),
]
打包成功后直接将zip包上传到 华为云函数即可(需要注意函数入口函数对应文件、名称,如果不对应会报错,执行失败)
云函数设置触发器
设置、触发器,选择定时触发器,然后根据自己的需求选择 触发规则即可。
效果截图
总结
通过学习我用了一天的时间从0到1的完成了自己的定时任务消息推送的需求;学会了云函数的使用也解决了我的日常中的需求,虽然内容简单但是这个过程中收获不少。