范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

使用CSS连接数据库

  本人翻译者系奇舞团前端工程师
  译文地址:https://mp.weixin.qq.com/s/dfmQUPS7_FJZ1sDK8_HS8w
  原文标题:Yes, I can connect to a DB in CSS
  原文作者:Memeloper
  原文地址:https://www.leemeichin.com/posts/yes-i-can-connect-to-a-db-in-css.html
  故事背景
  某公司招聘需求如下:
  我们正在寻求可以 使用CSS连接数据库 的前端伙伴~
  自从我上次开始一个高质量的"发帖"以来,已经有很长一段时间了,事实上,它已经很长一段时间了,那时候我的词汇表中可能还没有"水帖"这个词。
  为此,我受到了一个早期项目的启发,该项目基于区块链初创公司将投资者的脸投影到3D立方体上让我想起了以前的互联网,那时一切都很奇怪。
  好汉不提当年勇。所以今天,我将讨论如何管理我自己的新项目: sqlcss.xyz[1]
  顾名思义,这就是使用CSS连接数据库的方式。不幸的是,它 只能在Chrome中工作 ,但你可以提供任何你喜欢的SQLite数据库,并通过CSS查询它。
  它是如何工作的?
  首先我们需要用到一组被亲切地称为 Houdini[2] 的api,它让你的浏览器能够通过Javascript对象模型来控制CSS。换言之,这意味着您可以定制CSS样式、添加定制属性,等等。
  可能这个作品最大的特性是 CSS Paint Worklet[3] ,它允许你在一个元素上"绘制",就像你知道和喜欢的画布一样,并让浏览器把它当作CSS中的图像。这里有一些例子可以用来演示Houdini[4] 。
  然而,这个工作集只提供了Worker API的一个子集,而且画布上下文本身也被大量剥离。这样做的实际结果是,您的自定义CSS绘制代码提供了一个比您预期的更小的沙盒。
  这意味着什么? 没有网络访问权限,因此可以和fetch和XmlHttpRequest说再见了。在绘制上下文上没有drawText功能。其他各种JS api也消失了,以防你希望解决这些问题。
  不过,不用担心。并非一切都完了。让我们把它分解成几个步骤。   1. 设置数据库
  这必须是第一步,以便理解概念证明是否可行。
  首先我们会借助于 sql.js[5] 。它实际上是一个通过emscripten编译成WebAssembly和老式ASM.js的SQLite版本。不幸的是,我们不能使用WASM版本,因为它必须通过网络获取二进制文件。ASM版本没有这个限制,因为所有的代码都可以在一个模块中使用。
  虽然PaintWorklet限制了worker内部的网络访问,但你仍然可以导入代码,只要它是一个ES6模块。这意味着文件中必须有一个导出语句。不幸的是,sql.js没有ES6的版本,所以我自己修改了sql.js,使其能够顺利的被import进入项目。
  现在到了关键时刻:我可以在我的工作包中建立一个数据库吗?   const SQL = await initSqlJs({   locateFile: file => `./${file}`, });  const DB = new SQL.Database();
  **成功了!**但没有任何数据,所以我们来解决这个问题。   2. 查询数据库
  一开始最简单的方法就是设置一些假数据,sql.js有两个函数可以做到这一点。   DB.run("CREATE TABLE test (name TEXT NOT NULL)") DB.run(   "INSERT INTO test VALUES (?), (?), (?), (?)",   ["A", "B", "C", "D"] )
  我有了测试表,里面有一些值。我应该能够查询这个并获得这些值,尽管我不确定得到什么样的结构化查询结果。   const result = DB.exec("SELECT * FROM test") console.log(result)
  正如预期的那样,结果已经出来了。不过,渲染展示通过CSS查询数据库的结果会更好。   3. 渲染结果,最简单的方法
  我认为这就像在画布上写文本一样。这有多难,对吧?   class SqlDB {   async paint(ctx, geom, properties) {     const result = DB.exec("SELECT * FROM test");     ctx.font = "32px monospace";     ctx.drawText(JSON.stringify(result), 0, 0, geom.width);   } }
  不,那样就太简单了。这里的上下文与画布元素的上下文不同,它只提供了功能的一个子集。
  当然,它仍然可以绘制路径和曲线,所以缺乏方便的API是一个障碍,但这一切都不是问题。   4. 不使用文本API创建文本
  幸运的是,我们可以借助于 opentype.js[6] 所提供的解决方案。它可以解析一个字体文件,然后,给定一个文本字符串,生成每个字符的字母形式。这个操作的实际结果是一个表示字符串的路径对象,然后可以将其呈现到上下文中。
  这次我不必修改opentype库来导入它,因为它已经可以从 JSPM[7] 中获得。所以,如果你给JSPM一个npm包,它会自动生成一个ES6模块,你可以直接导入到你的浏览器中。这是非常棒的,因为我真的不想为了一个有趣的项目而使用打包工具。  import opentype from "https://ga.jspm.io/npm:opentype.js@1.3.4/dist/opentype.module.js"  opentype.load("fonts/firasans.otf")
  但这里有一个问题——它想通过网络加载字体,而我不能这样做!嗨,挫败了!
  ……而且?它还有一个接受数组缓冲区的解析方法。我将用base64编码字体,然后在我的模块中解码它。   import opentype from "https://ga.jspm.io/npm:opentype.js@1.3.4/dist/opentype.module.js" import base64 from "https://ga.jspm.io/npm:base64-js@1.5.1/index.js"  const font = "T1RUTwAKAIAAAwA ... 3 days later ... wAYABkAGgAbABwAIAKM"  export default opentype.parse(base64.toByteArray(font).buffer)
  我告诉过你worklet也没有处理base64字符串的api吗?atob和btoa都没有!我也不得不为此找到一个普通的JS实现。
  我把这段代码放在它自己的文件中,因为它不太符合人体工程学……必须在剩下的代码旁边使用大约200kb的编码字体字符串。
  这就是我为何要滥用ES模块来加载我的字体的原因。   5. 渲染结果,另一种简单的方式
  从现在起,所有繁重的工作都由opentype库来完成,所以我所需要做的就是用一点数学知识来对齐。   import font from "./font.js"  const SQL = await initSqlJs({   locateFile: file => `./${file}`, });  const DB = new SQL.Database();  DB.run("CREATE TABLE test (name TEXT NOT NULL)") DB.run(   "INSERT INTO test VALUES (?), (?), (?), (?)",   ["A", "B", "C", "D"] )  class SqlDB {   async paint(ctx, geom, properties) {     const query = DB.exec("SELECT * FROM test")     const result = query[0].values.join(", ")      const size = 48     const width = font.getAdvanceWidth(queryResults, size)     const point = {       x: (geom.width / 2) - (width / 2),       y: geom.height / 2     }      const path = font.getPath(result, point.x, point.y, size)     path.draw(ctx)   } }  registerPaint("sql-db", SqlDb)
  最好再来一些HTML和CSS看看发生了什么。                           
  成功了!但这里没有足够的CSS,而且查询是硬编码的。 6. 通过CSS查询   如果必须使用CSS来查询数据库,那就更好了。事实上,这是我们可以在Paint Worker的上下文之外与其通信的唯一方式,因为没有与Web worker一样的消息传递API。   为此,需要一个定制的CSS属性。定义inputProperties的好处是可以订阅该属性的更改,因此如果该属性的值发生更改,它将重新呈现。不需要设置任何订阅者自己。 class SqlDb { static get inputProperties() { return [ "--sql-query", ] } async paint(ctx, geom, properties) { // ... const query = DB.exec(String(properties.get("--sql-query"))) } }   这些CSS属性被称为类型化属性,但它们本质上被封装在一个特殊的CSSProperty类中,而这个类本身并不是很有用。因此,你必须手动将其转换为字符串或数字或其他类似的使用它,如上所述。   现在对CSS做一个快速调整。 main { // ... --sql-query: SELECT name FROM test; }   引号在这里被故意省略了,因为否则在将字符串传递给数据库之前,我必须将它们从字符串中删除。也就是说,这很有效!   任务完成!   如果你玩过sqlcss。你会注意到我并没有满足于此。在进行了一些重构之后,又进行了一些更改。 7. 导入数据库文件   硬编码数据库模式和实际数据,有点糟糕。它证明了这个概念,但我们肯定可以做得更好。   如果您可以查询任何您喜欢的数据库,只要您手边有数据库文件,那就太棒了。我只需要读取这个文件并对其进行base64编码,就像我对字体文件所做的那样。 const fileInput = document.getElementById("db-file") fileInput.onchange = () => { const reader = new FileReader() reader.readAsDataURL(fileInput.files[0]) reader.onload = () => { document.documentElement.style.setProperty( "--sql-database", `url("${reader.result}")` ) } }   我为此做了一个额外的CSS属性,在这个属性中,您可以将SQLite数据库作为base64编码的数据URI提供。data URI只是为了显示并确保它对DOM是有效的,我将在Worker层面解析这些东西。   最后一步是使其更易于查询,因为否则您必须进入调试器来操作元素的CSS。 8. 编写查询语句   这可能是项目中最简单的部分。自定义属性对于分号有一点问题,而SQLite并不关心末尾的分号是否被省略,所以最简单的做法是,如果在输入中找到它,就删除它。 const queryInput = document.getElementById("db-query") queryInput.onchange = () => { let query = queryInput.value; if (query.endsWith(";")) { query = query.slice(0, -1) } document.documentElement.style.setProperty( "--sql-query", queryInput.value ) }   从现在开始,您可以使用CSS导入和浏览您自己的数据库了!   我遗漏了一件事,就是所有这些查询结果特别多的时候,如何更好的渲染展示的问题。如果查询结果有很多,他们需要分开到单独的行。这与本文的主题-- 使用CSS连接到数据库 并没有太大关系,所以我认为在这里谈论这个问题并不合适,但如果你想进一步了解这个"荒谬"的概念,git上的代码都是可用的[8] 。 译者补充SQLite是由C语言编写的嵌入式轻量级数据库,广泛用于IOS和Android的App中。若有读者想要在浏览器端应用SQLite,推荐使用SQLite的WebAssembly版--sql.js,基本与SQLite的使用没有太多区别。在实际项目使用中,还需特别注意SQLite的 安全性 问题。 为方便展示,特此截取本文作者所实现的CSS连接SQLite的部分demo如下:   关于文中所提到的jspm,这里引用其官网的介绍如下:jspm为导入映射提供了模块CDN和包管理,允许任何来自NPM的包都可以直接在浏览器中加载,无需进一步的处理。 参考资料   [1]sqlcss.xyz: https://www.sqlcss.xyz   [2]CSS Houdini: https://developer.mozilla.org/en-US/docs/Web/Guide/Houdini   [3]CSS Paint Worklet: https://developer.mozilla.org/en-US/docs/Web/API/PaintWorklet   [4]houdini how: https://houdini.how/   [5]sql.js: https://sql.js.org/#/   [6]opentype.js: https://opentype.js.org/   [7]jspm: https://jspm.org/   [8]sqlcss git: https://git.sr.ht/~mrlee/sqlcss

卡耐基音乐厅CarnegieHall视觉形象升级卡耐基音乐厅(CarnegieHall)位于纽约市第七大道881号,第56大街和第57大街中间,占据第七大道东侧。由慈善家安德鲁卡耐基出资建于1890年,是美国古典音乐与流行音乐界纯素冰淇淋CoconutBliss视觉形象升级CoconutBliss成立于2005年,是美国一个冷冻甜点品牌,由LunaMarcus和LarryKaplowitz共同创办。他们首先将产品销售给俄勒冈州尤金的当地零售商,随后迅新南威尔士州美术馆ArtGalleryofNSW视觉形象升级新南威尔士州美术馆位于澳大利亚新南威尔士州首府悉尼市中心,毗邻悉尼歌剧院与悉尼皇家植物园。该美术馆建于1871年,是澳大利亚三大美术馆之一,陈列着澳洲境内最优秀的艺术作品。在庆祝其慈善机构Mind视觉形象升级Mind成立于1946年,是英格兰和威尔士的一家心理健康慈善机构,致力于通过提供建议和支持,帮助患有心理健康问题的人,并通过开展活动改善服务提高认识和促进理解。作为一种筹集资金的方慈善机构Shelter视觉形象升级Shelter成立于1966年,是英格兰和苏格兰的一家慈善机构,致力于改善无家可归者和居住条件恶劣的人的生活。用他们的话说,我们的存在是为了捍卫拥有安全家园的权利,并与住房危机对人3500到4000最适合打游戏的手机联想拯救者2ro4399的首发价现在只需3699这就是一台为游戏而生的手机骁龙888的处理器12G的运行内存原神最高画质下平均帧率59。7帧半小时最高温度为55温度虽然有点高但都集苹果12能用个56年吗?其实苹果产品的硬件,都还是比较耐用的,我用过的iPhone4siPhone5iPadiPadmini3iPadmini4,硬件都没坏过,最老的iPad,现在也还能用。所以我觉得,从3000到4000最适合打游戏的手机这个价位既想最求游戏体验又能兼顾日常的话我推荐小米11Pro某多上3769就能入手搭载骁龙888的处理器也许是因为小米11的翻车11Pro的发热控制做得很好愿神最高画质下玩半小时最aiPhone12promax和iPhone13真机对比出来了iPhone12promax和iPhone13真机对比出来了外观上iPhone13Promax比12重那么一点点其他基本没什么区别相机比12promax要大一些侧面看起来也厚一点看藏在秦岭山中的净业寺大有来头从山门到寺院需爬山1小时香客稀少位于陕西省西安市长安区终南山北麓沣峪内的净业寺,是中国佛教八宗之一律宗的祖庭,为樊川八大寺之一。净业寺踞处山腰,坐北朝南,北依悬崖,东对青华山,西临沣峪河,南面阔朗。净业寺始建于隋垃圾桶里捡回的红柳枝再次烤肉你能接受吗环保和健康如何双赢每到傍晚,西安的回民街便开始热闹起来,若是逢周末和节假日更是人山人海。红柳烤肉已经是回民街上的一大特色,很多店门前都有一整只羊被高高吊起,小哥卖力从上剔肉,烤炉上一排排的大肉串,在
涨知识新风系统和空气净化器,哪个更好?如今,空气净化器和新风系统已经成为许多家庭购买添置的物品之一。人们在考虑选购空气净化器或新风系统时,是希望其能够净化室内空气。室内空气污染物主要为PM2。5等悬浮颗粒物挥发性有机污Magic3pro和一加9pro小米11uMagic3pro用了一段时间,感觉好像屏幕也能接受了,甚至还觉得看着挺顺眼,是因为适应这个色调了吗?系统其实挺简单的,没有太多花里胡哨的,流畅跟手程度也不错,发热程度控制得可以,买前办公利器,如今吃灰刷剧,浅谈平板电脑的境地平板电脑是一种小型方便携带的个人设备,相信很多人都畅想过拿着平板电脑在高铁上移动办公或者在飞机听歌刷剧,将移动设备物尽其用。但往往理想很丰满现实很骨感,真正将平板电脑买到手的一瞬间8599元起!三星GalaxyZFold3Flip35G折叠手机国行即将发货TechWeb8月11日晚间,三星举办发布会,一口气带来了四款新品,包括GalaxyZFold35GGalaxyZFlip35G折叠屏手机GalaxyBuds2蓝牙耳机Galaxy2500元档平板电脑选购指南前段时间,果子在微信上发了一个狐聊大家目前对平板的主要需求是?不出意外,看视频打游戏看课件盖泡面是大部分用户的主要使用场景。最近,果子在后台也收到不少要平板推荐的用户留言。恰好马上三星新折叠手机曝光,骁龙895芯片5200mAh大电池Tech分析狮8月28日消息,对于折叠手机,大家都知道其价格一般都是非常贵的。更不用说是三星折叠手机了。但其惊艳的外观设计,还是非常吸引人的。而最近曝光的三星GalaxyZFold诗恩无线吹风机让我再一次大开眼界,吹风机还有无线的?说到吹风机,很多人第一时间想到的可能是戴森这类的品牌,不可否认的是戴森的吹风机确实不错,但是这并不代表着其它品牌的吹风机就不好,只是戴森这个品牌做的时间比较长,影响力更大一些。其实苹果iOS14。7。1越狱工具更新说明及Taurine1。1。0正式版已发布苹果iOS14。7。1越狱工具更新说明ios越狱ManticoreJAILBREAK作为开源发布,这是一个非常棒的项目,Taurine1。1。0发布,修复一些新的问题!但是这并不是微星创造者Z16上市首发售价14999元搭载酷睿i711800H处理器GeForceRTX30606G独立显卡(65W)搭配16GDDR43200MHz双通道内存1TBPCIe4。0SSD采用16英寸25601600分辨vivoX70Pro或9月9日发布,光栅后壳E5屏幕120W快充,很给力vivo手机在国内市场真的是比较有市场竞争力的,无论是从工艺设计还是品控上来看,外观设计和做工,vivo确实是做到了业内前端的为止,几乎每一款新机都拥有极致纤薄的机身,还有出众的交据报道AppleWatchSeries7将提供更大的电池和屏幕AppleWatchSeries7的重新设计可能比你想象的更激进。彭博社的MarkGurman声称Series7将采用更大的41毫米和45毫米外壳尺寸(从40毫米和44毫米增加),