惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
F
Fortinet All Blogs
B
Blog
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
The Register - Security
The Register - Security
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
B
Blog RSS Feed
WordPress大学
WordPress大学
Recorded Future
Recorded Future
Recent Announcements
Recent Announcements
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Secure Thoughts
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Webroot Blog
Webroot Blog
AWS News Blog
AWS News Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
O
OpenAI News
月光博客
月光博客
H
Hacker News: Front Page
S
Security Affairs
W
WeLiveSecurity
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Help Net Security
Help Net Security
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
TaoSecurity Blog
TaoSecurity Blog
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
A
About on SuperTechFans

Surmon.me

一人有限集团 你就是不敢 创造力是温柔的谎言 人类正在退出人类 AI 代替不了这样的你 脉冲点火背后的架构设计 基于 Cloudflare 生态的 AI Agent 实现 NodePress 支持用户登录了 从统计学习到通用智能 2025 投资报告:走慢的路 无依之地 会杀人的菩萨 无我不是共识 文化的积重与偏见 当下即安 科学的尽头是态度 无我不是 Egoless 信仰不因恐惧而存在 世间无解的矛与盾 先别急着做些什么 佛不需要你的皈依 真理的幻觉 两扇大门 造心里的浮屠 自胜者强 逻辑与智慧 真的相 快乐的秘密 只需愿意 是名体验 最深沉的梦 森林里倒下的树 现象与相 庸人自扰 React 与 Vue 的完美融合 开心就好吗 与原生家庭和解 两支毒箭 怎么自净其意 一尘不染 一片白云 让风穿膛而过 喝下去,然后闭嘴 活在当下 当纠结发生时 唯「我」独尊 一场把戏(时间) 一场把戏(二元对立) “我” 和 “我” 谁是众生? 船里没有人 玫瑰不需要说话 没有人能渡任何人 你我为轮,使之不再 当我们在谈论独立时 自我约束就是最好的自我接纳 从善与恶的表象出发 佛法不是心理学 别人眼中的你并不是你 高高山上走 祝你心想事成 祝你的噩梦早日发生 道是无情却有情 裙子只为自己而穿 不要盲目地评估自己 先别急着 “爱自己” 让生命欣然舞动 你无法复制乔布斯 符号不是目的 如果一件事发生了 每当我起心动念时 爱出者爱返 理解不是尊重的基础 在没有解决自己的问题之前 “知足常乐” 不是比较 逻辑是无法成为信仰的 买不到的自由 成为诵经者 伤口听不懂大道理 是立场让你不自由 - Unfreedom 天雨大不润无根之草 做自己的神 当心诱惑本身 牛洞冥思录 修罗启示录 让大脑自举 我更喜欢叫它无梦寺 存在主义也许不是解药 出南洋记 2022 的所有答复 没意义的表达 思考的记录 故宫暂行之幻想 极端的比较 解构的终极 舍利子是如何炼成的 心要野 佛教的偏见 文艺青年 我是动物
一点都不低成本的转码器
Surmon · 2017-08-03 · via Surmon.me

一点都不低成本的转码器

一个低成本兼容现有业务系统的 Vue & PHP 直出方案,然而此刻发现它不是那么的实用,因为这个方案的出发点就很浑浊。

为什么

基本上是纯粹的工作需要,需要重构公司 X 项目,老项目 jQuery vue.js Vue2 鱼龙混杂,由于历史和实际原因,无法在生产环境上 Node.js,所以需要探索一套方案,满足下面需求:

  • 保证以 vue-cli 初始化的 Webpack 项目作为基本开发方式
  • 满足服务端渲染的需求
  • 保证服务端稳定、高可用

做什么

实际上业务中的需求有这些:

  • 路由由服务端管理,也意味着客户端一般都是以单页面应用为单位
  • 仅需要服务端渲染关键性数据,可以循环渐进地实现转换
  • 有可能需要转换出多语言版本的模板,所以工具需要可配置

谁做了

总结了下,目前社区能找到的各种方案及我要实现的方案如下:

1. SPA

也就是官方的 SPA 模式,不多赘述。

2. node-ssr-render

也是基于官方提供的 SSR 解决方案,由于一些设计和实现问题,目前运行效率太低,CPU 和 内存一定会牺牲一个参数,基本无法用于生产环境。

3. php-ssr-render

来自 GitHub 的国内开发者可发的 PHP 版本的 Vue 渲染器,简单说就是把 node-ssr-render 的核心渲染机制用 PHP 重新实现一边,但是由于开发跟进和兼容等问题,无法满足稳定高可用的需求。

项目及地址: vue-php

4. node-transfer

也就是我正在做的事,简单说就是写一个 Node.js 解析器,把 .vue 文件转码为 .php 模板文件,拿去给 PHP 渲染输出,同时加载 Vue SPA 项目本身的 Js 脚本,剩下的流程就和 vue ssr render 基本一致了。

最新补充:其实这件事不是想的那么简单,严格说应该是 SSR + Transfer。

怎么做

OK,Js 脚本问题通过 Webpack 本身就可以解决了,剩下的就是解析器怎么做。

首先,将 .vue 文件解析为 .php 可以有三个思路:

1. 正则

.vue 文件的模板模板读取,直接使用正则将不同的指令替换为 PHP 相关语句,如遇到类似组件之类的,则根据配置好的路径对相应组件进行替换,同时需要对 props 进行处理。

此方法可能无法实现完全的转换,如遇到 slot 之类的组件就懵逼了。

2. AST

同样的读取模板,将模板使用工具转换为 AST(抽象语法树),之前尝试了一些开源的解析器去解析,但是目前探索到的最佳方案应该是 Vue 官方提供的 vue-template-compiler

严格说这是一个编译器,能把我们的单文件 Vue 组件编译为 render 函数,同时也支持 AST 模板数据的输出。

抽象为 AST 后,所有的组件就变成一个 JSON 树,我们就可以对这个树进行递归循环处理,最终产出 PHP 代码。

3. VNODE

上图中的 4 种方案里,3 和 4 都是自建了 vDom 环境,将各种组件之间的关系计算完成后输出的 HTML,实际上自建 vDom 就意味着又遇到了上面的 开发跟进、兼容性问题上,而且 vDom 的最终输出可能并不是我们所需要的 “模板”,所以这个方法暂时不考虑。

2017-09-07 补充:

这件事比我想象中的复杂大概有10倍,最终代码大概 1500 行,耗时一个月。

最终使用了一个比较 “复杂” 的方案:

  1. .vue 组件 > vue-template-compiler > ssrRender
  2. ssrRender > esprima > js-ast
  3. js-ast > estraverse(各种替换/解析处理) > result-js-ast
  4. result-js-ast > escodegen > result-ssrRender
  5. result-ssrRender > vue-server-rander > html-php-code
  6. 递归处理 html-php-code 中无法解析的 vnode(component) > html-php-code

其中还涉及针对组件本身的依赖和解析的复杂处理

相关工具:

  • esprima: link (将代码转换为标准 AST)
  • espree: link
  • escodegen: link (将 AST 生成为标准 Code)
  • estraverse: link (遍历并且更新抽象语法树)

相关资料:

AST 三板斧:

  • 通过 esprima 把源码转化为 AST
  • 通过 estraverse 遍历并更新 AST
  • 通过 escodegen 将 AST 重新生成源码

esprima 文档:

  1. http://esprima.readthedocs.io/en/latest/getting-started.html#using-node-js-to-play-with-esprima
  2. http://www.cnblogs.com/ziyunfei/p/3183325.html
  3. http://blog.csdn.net/dear_mr/article/details/72587908

已有实践:

剩下的,我抽时间写一个详细的实现思路。

完。