|
@@ -133,6 +133,78 @@ exports.dataUpdate = async (user, [date, active,,, efficiency]) => {
|
|
|
|
|
|
这里主要用的是结构赋值新特性。
|
|
|
|
|
|
+### 计划任务
|
|
|
+
|
|
|
+采用 `Later.js`,类似于 `Crontab`。
|
|
|
+
|
|
|
+```js
|
|
|
+const later = require('later');
|
|
|
+const {users} = require('../config');
|
|
|
+const {random} = require('../lib');
|
|
|
+const {lastClear, historyClear} = require('../model/data');
|
|
|
+const crab = require('./crab');
|
|
|
+const updateCertbot = require('./certbot');
|
|
|
+
|
|
|
+users.forEach(async (x) => {
|
|
|
+ // 每分钟抓取用户数据
|
|
|
+ await crab(x);
|
|
|
+ later.setInterval(async () => {
|
|
|
+ await crab(x);
|
|
|
+ }, later.parse.recur().every(random(50, 70)).second());
|
|
|
+});
|
|
|
+
|
|
|
+// 每天 0:00 清除计时器
|
|
|
+later.setInterval(lastClear, later.parse.cron('0 0 */1 * * ?'));
|
|
|
+
|
|
|
+// 每天 1:00 清除30天前历史数据
|
|
|
+later.setInterval(historyClear, later.parse.cron('0 1 */1 * * ?'));
|
|
|
+
|
|
|
+// 每周一 2:00 更新 certbot 证书
|
|
|
+later.setInterval(updateCertbot, later.parse.cron('0 2 * * 1 ?'));
|
|
|
+```
|
|
|
+
|
|
|
+### 待填的坑
|
|
|
+
|
|
|
+#### 数据采集
|
|
|
+
|
|
|
+从上文计划任务中即可看出,每个用户都会随机产生一条任务,由于用户是写在配置文件中的固定的,所以一旦想要改为动态的(比如开放注册),这套体系就不能支持了。
|
|
|
+
|
|
|
+所以需要一个更好的手段进行数据采集。
|
|
|
+
|
|
|
+> 欢迎提 ISSUE 发表自己的看法和建议。
|
|
|
+
|
|
|
+#### 服务器渲染
|
|
|
+
|
|
|
+项目里写了一个简单的 HTML 模板引擎,可以替换一些简单参数:
|
|
|
+
|
|
|
+```js
|
|
|
+const path = require('path');
|
|
|
+const {readFileSync} = require('fs');
|
|
|
+const {cdn} = require('../../config');
|
|
|
+
|
|
|
+module.exports = (view, params = {}) => {
|
|
|
+ let html = readFileSync(path.join(__dirname, `${view}.html`), 'utf8').replace(/{{cdn}}/g, cdn);
|
|
|
+ Object.keys(params).forEach((key) => {
|
|
|
+ html = html.replace(new RegExp(`{{${key}}}`, 'g'), params[key]);
|
|
|
+ });
|
|
|
+ return html;
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+其中用到了 `readFileSync`,该操作可能会在 I/O 密集发生阻塞。并且每个请求均会产生 IO 操作,可以从很多方面进行进一步优化。
|
|
|
+
|
|
|
+部分优化建议:
|
|
|
+
|
|
|
+1. 可以进行内存缓存(仅适用该项目,因为只有一个页面,根据实际项目情况考虑)
|
|
|
+2. 可以通过反向代理直接访问静态 HTML 文件,参数通过异步请求带入
|
|
|
+
|
|
|
+#### 路由配置
|
|
|
+
|
|
|
+`koa-router` 还是 `koa-route`? 这是个好问题。
|
|
|
+
|
|
|
+该项目中使用的是`koa-route`,原因是当时并不知道有好多种路由中间件,这个是从官方仓库中发现的。
|
|
|
+
|
|
|
+比较了一下源码,个人感觉 `koa-router` 更优美,使用起来也更方便。感兴趣的同学可以尝试一下: <https://github.com/alexmingoia/koa-router>
|
|
|
|
|
|
## 测试
|
|
|
|
|
@@ -145,3 +217,7 @@ pm2 start up.config.js
|
|
|
```
|
|
|
|
|
|
注意 PM2 版本使用大于 2.4,Node 版本大于 7.6.0。
|
|
|
+
|
|
|
+### P.S.
|
|
|
+
|
|
|
+SSL 证书由 `CertBot` 生成。
|