`
a19905522
  • 浏览: 99192 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

使用AST快速解决css代码重构问题

阅读更多

抽象语法树(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()

  

 

分享到:
评论

相关推荐

    Go-goast-viewer-基于Web的GolangAST可视化工具

    在Golang中,理解AST可以帮助开发者深入解析和操作代码,这对于代码分析、重构、静态代码检查和自动化工具的开发至关重要。`goast-viewer`是一款基于Web的Golang AST可视化工具,它允许开发者直观地查看Go源代码的...

    小程序反编译需要的6个依赖下载包cssbeautify,csstree,esprima,js-beautify,UglifyJS2,vm2

    在小程序反编译时,js-beautify有助于开发者快速理解并分析JavaScript代码。 5. **UglifyJS2**:这是一个JavaScript压缩工具,通常用于减少代码体积以提升加载速度。在反编译场景中,UglifyJS2可能被用于将原始代码...

    代码生成器

    - **重构**:在大规模代码重构时,自动生成新结构的代码,减轻手动劳动。 3. **核心技术点**: - **模板语言**:如Handlebars、Jinja2、Mustache等,它们提供了一种声明式的方式来描述代码结构。 - **元编程**:...

    VUE 组件转换为微信小程序组件的方法

    在Vue组件转换为微信小程序组件时,需要对Vue组件的JavaScript、CSS模块进行操作,利用AST来进行精确的代码定位和转换。 1. **JavaScript模块转换**: - **外层对象**:Vue组件的外层对象包含数据、方法、计算属性...

    rework2ast-loader:用于 rework2ast 的 webpack 加载器

    `rework2ast-loader` 的作用在于,在 Webpack 构建过程中,当遇到使用了 `rework2ast` 的 CSS 文件时,它会自动将 CSS 代码转换为 AST 格式。这样,开发者可以利用 AST 进行诸如自动化样式优化、检查和重构等操作。...

    scssparse:用 JavaScript 编写的 Sass 的 SCSS 语法的解析器和 AST

    SCSSParse的工作原理是,当你提供一个SCSS文件内容或者字符串给它时,它会使用正则表达式和特定的解析算法将SCSS代码转化为AST。这个AST由节点构成,每个节点代表代码中的一个特定部分,如选择器、属性、值等。通过...

    前端开源库-assetgraph-esprima

    AST允许开发者以结构化的方式处理代码,这在进行代码重构、性能优化或检测潜在问题时非常有用。例如,你可以通过遍历AST来找出未使用的变量、查找特定的函数调用模式或者实现代码压缩。 Assetgraph框架则在此基础上...

    tree-sitter-css:Tree-SitterCSS语法

    - **代码分析工具**:对于自动化测试和性能分析工具,`tree-sitter-css`可以用来解析CSS代码,以便于检查代码质量、查找潜在的性能问题或实现自动化重构。 总的来说,`tree-sitter-css`是一个强大的工具,它使得...

    WEB-SimpleCodeAnalyzer-JS:使用 Esprima 的简单代码分析器

    Esprima是一款强大的JavaScript解析器,它能够将源代码转换为抽象语法树(AST,Abstract Syntax Tree),这对于代码分析、静态类型检查、代码转换和自动化重构等任务非常有用。"WEB-SimpleCodeAnalyzer-JS"项目就是...

    JCss:尝试创建基于JavaCSS解析器

    2. 测试工具:验证CSS代码的正确性,检查浏览器兼容性问题。 3. 自定义渲染引擎:在非浏览器环境中,如桌面应用或服务器端渲染,使用JavaCSS解析器实现CSS样式计算。 4. 动态样式生成:在运行时根据逻辑动态生成或...

    前端开源库-assetgraph-esprima.zip

    例如,你可以用AssetGraph来找出未使用的CSS选择器,删除冗余的JavaScript代码,或者转换ES6到ES5以兼容旧浏览器。AssetGraph与Esprima的结合,意味着它可以利用Esprima的解析能力来处理JavaScript文件,提供更精确...

    重铸

    在JavaScript社区中,"recast"经常被提及,因为它是一个可以解析、修改并重新打印JavaScript代码的库,这对于重构代码非常有用。"master"分支是Git版本控制系统中的默认分支,通常包含最新的、稳定的代码。 基于...

    JSCodemod自动将webpack配置从v1转换为v2

    `JSCodemod` 是一个基于 JSDOM 和 AST(抽象语法树)的代码转换工具,它能够自动应用代码转换规则来大规模地重构代码。在 Webpack 配置升级的场景中,JSCodemod 可以帮助开发者快速、准确地应用一系列转换规则,减少...

    ntangle-ts.nvim:缠结+保镖

    为了解决这类问题,开发者们创造了许多工具来帮助我们理清代码的脉络。"ntangle-ts.nvim" 就是这样一款针对 Neovim 编辑器的实验性插件,它引入了 Treesitter 解析技术,旨在帮助用户更好地理解和管理纠结的源代码。...

    免费 Web 应用程序开发工具 HBuilderX 2.9.8.20201110 中文版.zip

    快,是 HBuilderX 的最大优势,通过完整的语法提示和代码输入法、代码块等,大幅提升 HTML、JS、CSS 的开发效率。 免费 Web 应用程序开发工具 HBuilderX 中文版免费 Web 应用程序开发工具 HBuilderX 中文版 ...

    comtor:Java源码注释分析系统COMTOR.org的(以前)项目的源代码主页。-java project source code

    COMTOR.org是一个专注于Java源码注释分析的系统,其项目源代码的主页为我们提供了深入理解这个系统的入口。从给出的信息来看,这个...此外,对于想深入研究软件维护、重构或代码质量改进的人来说,这是一个宝贵的资源。

    vue3-jd-h5-vue-next.zip

    4. **Ref & Reactive**:Vue3中的响应式系统进行了重构,使用了Reactive API,Ref对象可以直接在模板中使用,使得数据绑定更加直观。同时,Vue3还支持深层对象监听,提升了响应式性能。 5. **优化的渲染性能**:Vue...

Global site tag (gtag.js) - Google Analytics