twikoojs / twikoo

💬 一个简洁、安全、免费的静态网站评论系统 | A simple, safe, free comment system.
http://twikoo.js.org
MIT License
1.4k stars 264 forks source link

使twikoo支持Cloudflare worker的兼容性改动 #695

Closed Tao-VanJS closed 1 month ago

Tao-VanJS commented 1 month ago

这个PR包含了所有支持Cloudflare worker的兼容性改动。部署Cloudflare worker的源代码在这里:https://github.com/Tao-VanJS/twikoo-cloudflare ,亲测有效。

根据实测结果,相比Netlify/Vercel + MongoDB的部署,Cloudflare worker的部署把冷启动的页面加载时间从6秒左右降到了小于0.5秒,极大地提升了用户体验。

Tao-VanJS commented 1 month ago

nodemailer发邮件的那部分代码应该是被这个PR改坏了。我现在正在将其修复,同时也会把发送邮件通知的功能加到Cloudflare worker部署里去。

imaegoo commented 1 month ago

如果您能确定cloudflare worker和哪些第三方依赖存在兼容问题,我可以完成其他部署方式的修改和测试。

Tao-VanJS commented 1 month ago

如果您能确定cloudflare worker和哪些第三方依赖存在兼容问题,我可以完成其他部署方式的修改和测试。

目前确认如下模块与Cloudflare worker存在兼容性问题:

参见:https://github.com/Tao-VanJS/twikoo-cloudflare?tab=readme-ov-file#known-limitations

现在这个PR和nodemailer的整合是有一点问题的,我现在正在修复。修好了会合并到这个PR里。

imaegoo commented 1 month ago

考虑一下 #696 这个方案是否能满足您的需求:将lib.js其中的第三方依赖统统包装成get方法:

lib.js

module.exports = {
  getCheerio() {
    const $ = require('cheerio') // jQuery 服务器版
    return $
  },
  getAkismetClient() {
    const { AkismetClient } = require('akismet-api') // 反垃圾 API
    return AkismetClient
  },
  getCryptoJS() {
    const CryptoJS = require('crypto-js') // 编解码
    return CryptoJS
  },
  getFormData() {
    const FormData = require('form-data') // 图片上传
    return FormData
  },
  getAxios() {
    const axios = require('axios') // 发送 REST 请求
    return axios
  },
  getBowser() {
    const bowser = require('bowser') // UserAgent 格式化
    return bowser
  },
  getDomPurify() {
    // 初始化反 XSS
    const { JSDOM } = require('jsdom') // document.window 服务器版
    const createDOMPurify = require('dompurify') // 反 XSS
    const window = new JSDOM('').window
    const DOMPurify = createDOMPurify(window)
    return DOMPurify
  },
  getIpToRegion() {
    const ipToRegion = require('@imaegoo/node-ip2region') // IP 属地查询
    return ipToRegion
  },
  getMarked() {
    const marked = require('marked') // Markdown 解析
    return marked
  },
  getMd5() {
    const md5 = require('blueimp-md5') // MD5 加解密
    return md5
  },
  getNodemailer() {
    const nodemailer = require('nodemailer') // 发送邮件
    return nodemailer
  },
  getPushoo() {
    const pushoo = require('pushoo').default // 即时消息通知
    return pushoo
  },
  getTencentcloud() {
    const tencentcloud = require('tencentcloud-sdk-nodejs') // 腾讯云 API NODEJS SDK
    return tencentcloud
  },
  getXml2js() {
    const xml2js = require('xml2js') // XML 解析
    return xml2js
  }
}

这样,当twikoo-cloudflare依赖lib.js时,就不会因立即加载DOMPurify而报错了

imaegoo commented 1 month ago

image

nodemailer 没问题了,合并中