抽象语法树(AST)相信很多从事后端开发的同学都已经很了解了,得益于nodejs这两年的发展,很多前端同学也对AST有所研究,像近两年出现的小程序开发框架wepy mpvue等确实解决了不少前端开发中的实际问题,像mpvue这种框架的原理是什么,其中比较核心的功能就是使用AST来完成js,html,css的编译,趁着年初不忙,对去年一个项目中AST的应用做下简单分享,高手勿喷哈!
先说下需求背景,已经有一些小程序页面,现在产品要求能在pc管理后台可视化预览这些页面,并在后台可视化通过拖拽等操作在线编辑修改这些页面的样式。这里只介绍其中一个简单的功能点就是css部分的重构,来帮助大家入门。
小程序使用mpvue开发,pc后台也是使用vue开发,这样html模板大部分可以复用,只需替换一些组件,css部分小程序使用sass, 里面的尺寸单位都是750rpx,但在pc上预览的时候只有430px,最早使用sass中的一些函数来解决此问题,但发现太费时间,效率不高,最后决定用使用node-sass先将scss转换css文件, 再使用css做ast转换的常用库css-tree把css代码解析成json树,调用csstree.walk对想要重构的尺寸,单位进行修改,修改完后调用csstree.generate再生成css代码,最后部分做成一个命令行工具,对小程序写好的scss文件直接转换为pc端能用的文件。
最小化代码(也可以下载本文末尾附件,安装依赖后执行node app.js)
/** * Created by liujinghao on 2018/12/5. * 基于ast 转换mpvue项目中的scss文件,使其兼容在pc上显示 */ const sass = require('node-sass') const fs= require('fs') const csstree = require('css-tree'); let convertCss= function (scssFilePath) { return new Promise((resolve,reject) => { sass.render({ file: scssFilePath }, function (err, result) { if(err){ reject(err) }else { let css = result.css.toString() resolve(css) fs.writeFile('out.css', css, function () { console.log('scss转换为css后写入到out.css') }) } }) }) } let createCode = async function () { let cssString = await convertCss('diy.scss') let ast = csstree.parse(cssString) let copy = csstree.clone(ast); fs.writeFile('ast.txt', JSON.stringify(ast), function () { console.log('ast分析代码写入到ast.txt') }) csstree.walk(copy, function (node, item, list) { //console.log(node.type,'____', node.value) if (node.type === 'Dimension') { node.value = (node.value / 1.745).toFixed(3) console.log(node) } }); let transCode = csstree.generate(copy)+'' transCode = transCode.replace(/rpx/g,'px') // console.log(transCode) fs.writeFile('transCode.css', transCode, function () { console.log('最终代码写入到transCode.css') }) } createCode()
相关推荐
在Golang中,理解AST可以帮助开发者深入解析和操作代码,这对于代码分析、重构、静态代码检查和自动化工具的开发至关重要。`goast-viewer`是一款基于Web的Golang AST可视化工具,它允许开发者直观地查看Go源代码的...
在小程序反编译时,js-beautify有助于开发者快速理解并分析JavaScript代码。 5. **UglifyJS2**:这是一个JavaScript压缩工具,通常用于减少代码体积以提升加载速度。在反编译场景中,UglifyJS2可能被用于将原始代码...
- **重构**:在大规模代码重构时,自动生成新结构的代码,减轻手动劳动。 3. **核心技术点**: - **模板语言**:如Handlebars、Jinja2、Mustache等,它们提供了一种声明式的方式来描述代码结构。 - **元编程**:...
在Vue组件转换为微信小程序组件时,需要对Vue组件的JavaScript、CSS模块进行操作,利用AST来进行精确的代码定位和转换。 1. **JavaScript模块转换**: - **外层对象**:Vue组件的外层对象包含数据、方法、计算属性...
`rework2ast-loader` 的作用在于,在 Webpack 构建过程中,当遇到使用了 `rework2ast` 的 CSS 文件时,它会自动将 CSS 代码转换为 AST 格式。这样,开发者可以利用 AST 进行诸如自动化样式优化、检查和重构等操作。...
SCSSParse的工作原理是,当你提供一个SCSS文件内容或者字符串给它时,它会使用正则表达式和特定的解析算法将SCSS代码转化为AST。这个AST由节点构成,每个节点代表代码中的一个特定部分,如选择器、属性、值等。通过...
AST允许开发者以结构化的方式处理代码,这在进行代码重构、性能优化或检测潜在问题时非常有用。例如,你可以通过遍历AST来找出未使用的变量、查找特定的函数调用模式或者实现代码压缩。 Assetgraph框架则在此基础上...
- **代码分析工具**:对于自动化测试和性能分析工具,`tree-sitter-css`可以用来解析CSS代码,以便于检查代码质量、查找潜在的性能问题或实现自动化重构。 总的来说,`tree-sitter-css`是一个强大的工具,它使得...
Esprima是一款强大的JavaScript解析器,它能够将源代码转换为抽象语法树(AST,Abstract Syntax Tree),这对于代码分析、静态类型检查、代码转换和自动化重构等任务非常有用。"WEB-SimpleCodeAnalyzer-JS"项目就是...
2. 测试工具:验证CSS代码的正确性,检查浏览器兼容性问题。 3. 自定义渲染引擎:在非浏览器环境中,如桌面应用或服务器端渲染,使用JavaCSS解析器实现CSS样式计算。 4. 动态样式生成:在运行时根据逻辑动态生成或...
例如,你可以用AssetGraph来找出未使用的CSS选择器,删除冗余的JavaScript代码,或者转换ES6到ES5以兼容旧浏览器。AssetGraph与Esprima的结合,意味着它可以利用Esprima的解析能力来处理JavaScript文件,提供更精确...
在JavaScript社区中,"recast"经常被提及,因为它是一个可以解析、修改并重新打印JavaScript代码的库,这对于重构代码非常有用。"master"分支是Git版本控制系统中的默认分支,通常包含最新的、稳定的代码。 基于...
`JSCodemod` 是一个基于 JSDOM 和 AST(抽象语法树)的代码转换工具,它能够自动应用代码转换规则来大规模地重构代码。在 Webpack 配置升级的场景中,JSCodemod 可以帮助开发者快速、准确地应用一系列转换规则,减少...
为了解决这类问题,开发者们创造了许多工具来帮助我们理清代码的脉络。"ntangle-ts.nvim" 就是这样一款针对 Neovim 编辑器的实验性插件,它引入了 Treesitter 解析技术,旨在帮助用户更好地理解和管理纠结的源代码。...
快,是 HBuilderX 的最大优势,通过完整的语法提示和代码输入法、代码块等,大幅提升 HTML、JS、CSS 的开发效率。 免费 Web 应用程序开发工具 HBuilderX 中文版免费 Web 应用程序开发工具 HBuilderX 中文版 ...
COMTOR.org是一个专注于Java源码注释分析的系统,其项目源代码的主页为我们提供了深入理解这个系统的入口。从给出的信息来看,这个...此外,对于想深入研究软件维护、重构或代码质量改进的人来说,这是一个宝贵的资源。
4. **Ref & Reactive**:Vue3中的响应式系统进行了重构,使用了Reactive API,Ref对象可以直接在模板中使用,使得数据绑定更加直观。同时,Vue3还支持深层对象监听,提升了响应式性能。 5. **优化的渲染性能**:Vue...