使用CSS连接数据库的方式_第1页
使用CSS连接数据库的方式_第2页
使用CSS连接数据库的方式_第3页
使用CSS连接数据库的方式_第4页
使用CSS连接数据库的方式_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第使用CSS连接数据库的方式某公司招聘需求如下:

我们正在寻求可以使用CSS连接数据库的前端伙伴~

自从我上次开始一个高质量的发帖以来,已经有很长一段时间了,事实上,它已经很长一段时间了,那时候我的词汇表中可能还没有水帖这个词。

为此,我受到了一个早期项目的启发,该项目基于区块链初创公司将投资者的脸投影到3D立方体上让我想起了以前的互联网,那时一切都很奇怪。

好汉不提当年勇。所以今天,我将讨论如何管理我自己的新项目:sqlcss.xyz[1]

顾名思义,这就是使用CSS连接数据库的方式。不幸的是,它只能在Chrome中工作,但你可以提供任何你喜欢的SQLite数据库,并通过CSS查询它。

它是如何工作的

首先我们需要用到一组被亲切地称为Houdini[2]的api,它让你的浏览器能够通过Javascript对象模型来控制CSS。换言之,这意味着您可以定制CSS样式、添加定制属性,等等。

可能这个作品最大的特性是CSSPaintWorklet[3],它允许你在一个元素上绘制,就像你知道和喜欢的画布一样,并让浏览器把它当作CSS中的图像。这里有一些例子可以用来演示Houdini[4]。

然而,这个工作集只提供了WorkerAPI的一个子集,而且画布上下文本身也被大量剥离。这样做的实际结果是,您的自定义CSS绘制代码提供了一个比您预期的更小的沙盒。

这意味着什么没有网络访问权限,因此可以和fetch和XmlHttpRequest说再见了。在绘制上下文上没有drawText功能。其他各种JSapi也消失了,以防你希望解决这些问题。

不过,不用担心。并非一切都完了。让我们把它分解成几个步骤。

1.设置数据库

这必须是第一步,以便理解概念证明是否可行。

首先我们会借助于sql.js[5]。它实际上是一个通过emscripten编译成WebAssembly和老式ASM.js的SQLite版本。不幸的是,我们不能使用WASM版本,因为它必须通过网络获取二进制文件。ASM版本没有这个限制,因为所有的代码都可以在一个模块中使用。

虽然PaintWorklet限制了worker内部的网络访问,但你仍然可以导入代码,只要它是一个ES6模块。这意味着文件中必须有一个导出语句。不幸的是,sql.js没有ES6的版本,所以我自己修改了sql.js,使其能够顺利的被import进入项目。

现在到了关键时刻:我可以在我的工作包中建立一个数据库吗

constSQL=awaitinitSqlJs({

locateFile:file=`./${file}`,

constDB=newSQL.Database();

**成功了!**但没有任何数据,所以我们来解决这个问题。

2.查询数据库

一开始最简单的方法就是设置一些假数据,sql.js有两个函数可以做到这一点。

DB.run('CREATETABLEtest(nameTEXTNOTNULL)')

DB.run(

'INSERTINTOtestVALUES(),(),(),()',

['A','B','C','D']

)

我有了测试表,里面有一些值。我应该能够查询这个并获得这些值,尽管我不确定得到什么样的结构化查询结果。

constresult=DB.exec('SELECT*FROMtest')

console.log(result)

正如预期的那样,结果已经出来了。不过,渲染展示通过CSS查询数据库的结果会更好。

3.渲染结果,最简单的方法

我认为这就像在画布上写文本一样。这有多难,对吧

classSqlDB{

asyncpaint(ctx,geom,properties){

constresult=DB.exec('SELECT*FROMtest');

ctx.font='32pxmonospace';

ctx.drawText(JSON.stringify(result),0,0,geom.width);

}

不,那样就太简单了。这里的上下文与画布元素的上下文不同,它只提供了功能的一个子集。

当然,它仍然可以绘制路径和曲线,所以缺乏方便的API是一个障碍,但这一切都不是问题。

4.不使用文本API创建文本

幸运的是,我们可以借助于opentype.js[6]所提供的解决方案。它可以解析一个字体文件,然后,给定一个文本字符串,生成每个字符的字母形式。这个操作的实际结果是一个表示字符串的路径对象,然后可以将其呈现到上下文中。

这次我不必修改opentype库来导入它,因为它已经可以从JSPM[7]中获得。所以,如果你给JSPM一个npm包,它会自动生成一个ES6模块,你可以直接导入到你的浏览器中。这是非常棒的,因为我真的不想为了一个有趣的项目而使用打包工具。

importopentypefrom'https://ga.jspm.io/npm:opentype.js@1.3.4/dist/opentype.module.js'

opentype.load('fonts/firasans.otf')

但这里有一个问题它想通过网络加载字体,而我不能这样做!嗨,挫败了!

而且它还有一个接受数组缓冲区的解析方法。我将用base64编码字体,然后在我的模块中解码它。

importopentypefrom'https://ga.jspm.io/npm:opentype.js@1.3.4/dist/opentype.module.js'

importbase64from'https://ga.jspm.io/npm:base64-js@1.5.1/index.js'

constfont='T1RUTwAKAIAAAwA...3dayslater...wAYABkAGgAbABwAIAKM'

exportdefaultopentype.parse(base64.toByteArray(font).buffer)

我告诉过你worklet也没有处理base64字符串的api吗atob和btoa都没有!我也不得不为此找到一个普通的JS实现。

我把这段代码放在它自己的文件中,因为它不太符合人体工程学必须在剩下的代码旁边使用大约200kb的编码字体字符串。

这就是我为何要滥用ES模块来加载我的字体的原因。

5.渲染结果,另一种简单的方式

从现在起,所有繁重的工作都由opentype库来完成,所以我所需要做的就是用一点数学知识来对齐。

importfontfrom'./font.js'

constSQL=awaitinitSqlJs({

locateFile:file=`./${file}`,

constDB=newSQL.Database();

DB.run('CREATETABLEtest(nameTEXTNOTNULL)')

DB.run(

'INSERTINTOtestVALUES(),(),(),()',

['A','B','C','D']

classSqlDB{

asyncpaint(ctx,geom,properties){

constquery=DB.exec('SELECT*FROMtest')

constresult=query[0].values.join(',')

constsize=48

constwidth=font.getAdvanceWidth(queryResults,size)

constpoint={

x:(geom.width/2)-(width/2),

y:geom.height/2

constpath=font.getPath(result,point.x,point.y,size)

path.draw(ctx)

registerPaint('sql-db',SqlDb)

最好再来一些HTML和CSS看看发生了什么。

html

head

script

CSS.paintWorklet.addModule('./cssdb.js')

/script

style

main{

width:100vw;

height:100vh;

background:paint(sql-db);

/style

/head

body

main/main

/body

/html

成功了!但这里没有足够的CSS,而且查询是硬编码的。

6.通过CSS查询

如果必须使用CSS来查询数据库,那就更好了。事实上,这是我们可以在PaintWorker的上下文之外与其通信的唯一方式,因为没有与Webworker一样的消息传递API。

为此,需要一个定制的CSS属性。定义inputProperties的好处是可以订阅该属性的更改,因此如果该属性的值发生更改,它将重新呈现。不需要设置任何订阅者自己。

classSqlDb{

staticgetinputProperties(){

return[

'--sql-query',

asyncpaint(ctx,geom,properties){

//...

constquery=DB.exec(String(properties.get('--sql-query')))

}

这些CSS属性被称为类型化属性,但它们本质上被封装在一个特殊的CSSProperty类中,而这个类本身并不是很有用。因此,你必须手动将其转换为字符串或数字或其他类似的使用它,如上所述。

现在对CSS做一个快速调整。

main{

//...

--sql-query:SELECTnameFROMtest;

}

引号在这里被故意省略了,因为否则在将字符串传递给数据库之前,我必须将它们从字符串中删除。也就是说,这很有效!

任务完成!

如果你玩过sqlcss。你会注意到我并没有满足于此。在进行了一些重构之后,又进行了一些更改。

7.导入数据库文件

硬编码数据库模式和实际数据,有点糟糕。它证明了这个概念,但我们肯定可以做得更好。

如果您可以查询任何您喜欢的数据库,只要您手边有数据库文件,那就太棒了。我只需要读取这个文件并对其进行base64编码,就像我对字体文件所做的那样。

constfileInput=document.getElementById('db-file')

fileInput.onchange=()={

constreader=newFileReader()

reader.readAsDataURL(fileInput.files[0])

reader.onload=()={

document.documentElement.style.setProperty(

'--sql-database',

`url('${reader.result}')`

}

我为此做了一个额外的CSS属性,在这个属性中,您可以将SQLite数据库作为base64编码的数据URI提供。dataURI只是为了显示并确保它对DOM是有效的,我将在Worker层面解析这些东西。

最后一步是使其更易于查询,因为否则您必须进入调试器来操作元素的CSS。

8.编写查询语句

这可能是项目中最简单的部分。自定义属性对于分号有一点问题,而SQLite并不关心末尾的分号是否被省略,所以最简单的做法是,如果在输入中找到它,就删除它。

constqueryInput=document.getElementById('db-query')

queryInput.onchange=()={

letquery=queryInput.value;

if(query.endsWith(';')){

query=query.slice(0,-1)

document.documentElement.style.setProperty(

'--sql-query',

queryInput.value

}

从现在开始,您可以使用CSS导入和浏览您自己的数据库了!

我遗漏了一件事,就是所有这些查询结果特别多的时候,如何更好的渲染展示的问题。如果查询结果有很多,他们需要分开到单独的行。这与本文的主题--使用CSS连接到数据库并没有太大关系,所以我认为在这里谈论这个问题并不合适,但如果你想进一步了解这个荒谬的概念,git上的代码都是可用的[8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论