能否用 JS 实现一个 CSS 解释器?

技术分享  / 倒序浏览   ©

#楼主# 2020-2-29

跳转到指定楼层

马上注册,分享更多源码,享用更多功能,让你轻松玩转云大陆。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
既然 js 都能解释 js 自身了,那是否可以用 js 来解释 css 呢?(然后就不用依赖浏览器自身对新标准的支持了)
分享淘帖
回复

使用道具

万胜 发表于 2020-2-29 14:00:46
首先JavaScript能解释执行JavaScript自身并不稀奇,但纯粹的解释执行总是需要在别的现成的JavaScript引擎上运行,这不够爽。要注意的是用JavaScript实现JavaScript自身其实不一定要“解释执行”——其实“编译后执行”也是完全可行的,这样就可以实现自举,从而能用纯JavaScript实现可独立运行(不需要在别的JavaScript引擎上运行)的JavaScript。
传送门:
    JavaScript的功能是不是都是靠C或者C++这种编译语言提供的? - RednaxelaFX 的回答
    有没有js的js引擎? - RednaxelaFX 的回答

关键点在于潜在的实用性:能自举的实现会更容易被接受为“实用的”,而JavaScript是有能力做到这点的。

其次,与其问“能否用JavaScript解释CSS”,题主更想问的应该是能否用JavaScript来实现支持CSS的排版引擎——“理解CSS的语义”是一回事,在此基础上实现实际的排版并且与更底下的渲染引擎交互又是另一层面的事情了。
这个当然也可以做到。Facebook出的CSSLayout项目已经实现了CSS的一个子集。要实现比它更完整的CSS支持并不是不可能的——只是谁会投入资源会做这种项目,对他带来的好处又有哪些的问题。
Google还有一个Blink-in-JavaScript项目,尽可能把Blink渲染引擎里的DOM API的高层功能从C++转为用JavaScript实现。这也跟题主所想像的场景是相关的。看,这样的项目已经实际存在了对不对?

Blink-in-JavaScript的精神跟V8的一部分用JavaScript实现其实是很类似的。V8这个JavaScript引擎中,大部分JavaScript标准库都是直接用JavaScript来实现的,只把其中一些复杂的功能通过intrinsics调用V8的C++部分来实现。这样实现更简便,升级更简单,而且可以促使(迫使)JavaScript引擎尽可能做优化来满足标准库的性能需求。感觉题主想要的就是顺着这样的思路实现的浏览器,而我这里举的例子就是想说明这样的思路是可行而且已经有人在尝试的。

要说用JavaScript实现有趣的基础设施,Mozilla用JavaScript实现了很多有趣的东西,例如说
    PDF.js用JavaScript实现了PDF的渲染(于是FireFox里可以不需要native插件就可以渲染PDF文件)Shumway用JavaScript实现了Flash的渲染(于是FireFox里可以不需要native插件就渲染SWF文件,虽然这个项目还没有很完善)PluotSorbet用JavaScript实现了一个兼容J2ME的运行时环境
这些项目很多都是由FireFox OS的需求所驱动的。既然FireFox浏览器是FireFox OS的核心组成部分,尝试用JavaScript来实现尽量多的功能是很直观的思路——直接就能在FireFox OS上运行了。
回复

使用道具 举报

123456881 发表于 2020-2-29 14:36:30
你是要实现什么,是要做到绘图那一步,还是只做到 getComputedStyle 那个水平?后者并不难,前者嘛……先写一个正确的阿拉伯文排版吧。
回复

使用道具 举报

Gordon520 发表于 2020-2-29 14:44:42
抛开性能不说,这东西可以实现,也确实有实类似的实现,react angular2 polymer都有类似的实现,只是类似。
而为什么没有一个独立的框架在做这个事情?
因为一旦要做出这个东西,生产的代码必然是纯js或者CSS+js。而这些js就需要像jq一样附着到Dom上。
而不巧的是,CSS3出现的这个时代,正好是MV*框架到来的时代,以上我提到的那react和angular2,我有说:类似的实现。而不是独立的实现,因为他们引入了组件的概念,同时就会有一个生命周期的概念在里头,这也就是jq这类的库无法和以上的框架快乐的配合的原因。同样的CSS2JS如果要有,那么必须和生命周期契合,所以这些框架内置了CSS2JS。

回头看,那些想用新鲜技术的前端开发人员想必不会为了一个CSS2JS而放弃MV*框架。毕竟前者可以用手写JS替代啊。
回复

使用道具 举报

宇宙无限 发表于 2020-2-29 15:44:51
当然可以。你把css换个标签,就可以用js自己下载,然后随便你怎么弄都行
回复

使用道具 举报

王俊杰2017 发表于 2020-2-29 17:00:15
就算可以实现,性能和功能上跟在网页上引入less、然后用js来编译没什么区别吧。
还不如直接用less算了。
回复

使用道具 举报

风吹吹蛋蛋疼风w 发表于 2020-2-29 18:28:33
当然可以,比如 fb 的 yoga 布局引擎,虽然是 c 写的,但是也提供了由 c 编译的 js 版本,如果闲着无聊也可以移植个 js 版的。
回复

使用道具 举报

李志敏 发表于 2020-2-29 19:45:06
Houdini.
回复

使用道具 举报

啤酒瓶空了缓 发表于 2020-2-29 20:10:47
你甚至可以用canvas自己把整个页面画出来
回复

使用道具 举报

井底燕雀傥 发表于 2020-2-29 21:02:14
看到你这个问题,我第一想法是jquery中的Sizzle,但是仔细一想,Sizzle只是一个纯javascript实现的CSS选择器引擎,如果是想实现全部的css的功能,应该是可以做到的~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

haiyuezhihun

新手猿

  • 主题

    7

  • 帖子

    7

  • 关注者

    0

Archiver|手机版|小黑屋|云大陆 | 赣ICP备18008958号-4|网站地图
Powered by vrarz.com!  © 2019-2020版权所有云大陆