初次见面:

project

这个文件用来合并JS中的导出对象:

source.js

例如以上内容会被转化成:

source.js

看上去是不是只是将exports的值做了合并,似乎我们有另外一种方法可行:即将该文件读取并将module.exports的值用对象合并再重新写入文件。

recast

recast的魅力在于它能帮助你拆分代码并改造任意位置和结构的代码,在很多流行框架中均有用到如:webpack、vue-cli这类前端自动化的工具等。

还是以上代码,假如它是这样的:

source.js

我们的任务是修改config.css.modules为false:

  const value = {foo: true}transform(value,source)

transform即开头处的文件主体

简单使用

const recast = require("recast");
const ast = recast.parse(source)recast.types.visit(ast, {visitAssignmentExpression (path) {const { node } = pathconsole.log(node)this.traverse(path)}
})

以上代码展示了查找定义表达式并打印在控制台

this.traverse(path); 必要-用于结束执行

想要加深对recast了解,必须要先熟悉AST(抽象语法树),只有深入AST,你才能用好recast,因为recast就是操作AST的工具,如果你都不知道这个工具是用来干嘛的,你怎么能用好它呢?

关于AST,网上有很多文章,在此就不赘述了。

源码

打开开头部分的源码,相信此时你已经知道这个文件的大概了

module.exports = function extendJSConfig (value, source) {const recast = require('recast')const stringifyJS = require('./stringifyJS')let exportsIdentifier = nullconst ast = recast.parse(source)recast.types.visit(ast, {visitAssignmentExpression (path) {const { node } = pathif (node.left.type === 'MemberExpression' &&node.left.object.name === 'module' &&node.left.property.name === 'exports') {if (node.right.type === 'ObjectExpression') {augmentExports(node.right)} else if (node.right.type === 'Identifier') {// do a second passexportsIdentifier = node.right.name}return false}this.traverse(path)}})......
}

VueCli番外之recast相关推荐

  1. Android开发:第五日番外——过时的函数和被横杠的函数

    零.... 好吧,估计以后每篇都会来个零开头进行吐槽了.话说第五日正番依旧难产中,先把番外给写了.番外嘛都是一些小的知识点,未免遗忘,特此记录.今天发现关于设计模式,本人零概念啊,这是什么概念啊,虽然 ...

  2. 多线程番外之真假*程

    多线程番外之真假*程 //写在之前 "有没有同学心里有疑问的,多线程才涉及那么很浅显的一点,为什么会惊现番外这一说呢,所谓番外,就是对正文做的补充,通常不录入正文,是作者主动在题材中加入的部 ...

  3. java优先队列的入队函数,算法与数据结构番外(1):优先队列

    这是算法与数据结构番外系列的第一篇,这个系列未来的主要内容是补充一些与算法与数据结构相关的知识,这些知识比较零碎,同时也与正传关系密切,往往需要阅读了正传的相关内容以后,才能较好的理解这部分内容.如果 ...

  4. python的类和对象——类的静态字段番外篇

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  5. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

  6. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  7. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81) 之前一直用的原生的centos7的源镜像安装虚拟机,然 ...

  8. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

    1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec  内存限制: 64 MB                                               ...

  9. 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏

    为什么80%的码农都做不了架构师?>>>    转自:http://blog.csdn.net/pongba/archive/2008/09/21/2958094.aspx 数学之美 ...

最新文章

  1. linux 笔记 一
  2. vue实现多个元素或多个组件之间动画效果
  3. 远程办公时,有哪些提高沟通效率的技巧?
  4. arcgis server for flex中文乱码问题(转)
  5. AI发展进入2.0时代!英特尔在落地中总结4大经验、分享7个案例
  6. 【pmcaff】搞清楚产品经理的6大问题,街边卖煎饼也能火
  7. iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码
  8. ECS开放批量创建实例接口RunInstances
  9. GetModuleHandle
  10. RMQ_第一弹_Sparse Table
  11. Linux——常用命令
  12. mongovue mysql_MongoDB 客户端 MongoVue
  13. golang tailf日志组件的基本使用
  14. 腾讯云即时通讯im之获取userSig
  15. 2020 年第一届辽宁省大学生程序设计竞赛
  16. 【毕业设计】基于单片机的手势检测识别系统 - arduino 物联网嵌入式
  17. nginx启动时指定prefix(覆盖编译时的 --prefix)
  18. 【BZOJ 1305】[CQOI2009]dance跳舞
  19. 手机屏幕弹幕纵向滚动,添加弹幕实时滚动html demo
  20. 抖音爆款小游戏《我飞刀玩得贼6》性能优化案例分享

热门文章

  1. 【hexo系列】02.hexo和obsidian实现笔记丝滑
  2. 老年祝福短视频微信小程序源码下载支持流量主
  3. [视频]学打羽毛球41-45
  4. 震惊:广东最破烂学校是什么样?!
  5. 速腾聚创32线雷达雷达,RVIZ显示激光点云
  6. 学生如何掌握学习诀窍?这招很实用
  7. 吓得我抱起了抱着我的小鲤鱼的我(递归思想)C语言
  8. 网吧40台无盘服务器的配置,带80-120台的网咖无盘服务器配置 | 专业网吧维护
  9. Linux 查看目录下的文件数量
  10. protobuf3 import的使用和多proto代码生成和cmake中引用protobuf