首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

经过一个月的探索,我如何将 AST 操作得跟呼吸一样自然

典型的 DSL 实现,其没有编译产物,而是由独一的编译引擎消费, 如 GraphQL (.graphql)、Prisma (.prisma) 这一类工具库(还有更熟悉一些的,如 HTML、SQL、Lex...TypeScript 的 Compiler API 是绝大部分开放的,足够用于做一些 CodeMod、AST Checker 这一类的工具,如我们使用原生的 Compiler API ,来组装一个函数:...,ts-morph 没有提供创建 IfStatement 这一类语句的 API 或者是相关能力,最方便的方式是直接调用 writeFunction 来直接写入。...很明显,这样的操作是有利有弊的,我们能够在创建 Function、Class、Import 这一类声明时,直接传入其结构即可,但对于函数(类方法)内部的语句,ts-morph 目前的确只提供了这种最简单的能力...作为一个非科班、没学过编译原理、没玩过 Babel 的前端仔,它是我在需要做 AST Checker、CodeMod 时产生的灵感。

1.6K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Es6中的模块化Module,导入(import)导出(export)

    然后在当前目录下新建配置文件.babelrc,注意存储的位置不要带有中文路径,否则使用babel命令时会抛出错误 { "presets":["es2015"] } 在编写好es6代码后通过 babel...,标识符只有在被导出的模块中可以修改(也就是只能在export模块中修改),当导入绑定的模块后,它是无法更改绑定的值的(在import中无法对已导入绑定的变量作修改),from前面的就是绑定的变量对象,...当想尝试更改导入时变量对象的名称时,就会抛出错误 ?...(在导入模块中,修改导入变量对象是会抛出错误的,不允许被修改,想修改,应当滚回导出模块中修改变量对象的值) 如上代码:当调用setName("好好先生")时会回到导出setName()的模块中去执行,并将...,以及在Node中通过babel将es6代码转化为Es5代码在Node中执行,模块的导出(导出数据,函数和类)模块的导入(单个导入,多个导入,导入整个) 模块中在用export关键字导出所要暴露的对象和用

    2.6K20

    大厂都在实践的GraphQL,你了解吗?

    与 REST API 相比,GraphQL 有其自身的优势,例如 只请求所需的内容,而不是所有内容。 防止为获取所需数据而进行的级联调用。 客户端不需要选择 REST 路径来获取不同的资源数据。...接下来开始创建对应类。 定义领域类和存储库 为了简单起见,我们将直接在 GraphQL 接口中使用领域类。...带有@QueryMapping注释的函数将成为查询的处理程序。 查询名称会自动映射到函数名称,或者使用 @QueryMapping接口的value参数(在本例中为person)显式定义它。...GraphiQL 在内部对端点 /graphql 进行 POST 调用以发送查询。因此也可以使用 curl 命令执行此操作。...GraphQL 错误处理 首先看看当我们遇到错误时会发生什么。 为此,我们在调用获取电话字段时,抛出一个异常。

    2.6K40

    GraphQL到底怎么使?看看智联前端团队技术沉淀

    的核心是类,使用装饰器注解的方式复用类生成 Schema 结构,并由 reflect-metadata 将注解信息提取出来。...调用合并:经常提到的与 RESTful 相比较优的一点是,当需要获取多个关联数据时,RESTful 接口往往需要多次调用(并发或串行),而基于 GraphQL 的接口调用则可以将调用顺序体现在结构化的查询中...上面提到的点几乎都是出于调用方的视角,可以看到,作为 GraphQL 服务的调用方是比较舒服的。...服务本身是基础服务,供多方调用,需求不一但对外有统一的输出模型的情况下(如:Github 开放接口,无法确定每个调用者需求是什么),可以使用 GraphQL。...没有 BFF 层时,由于 GraphQL 对于实现数据聚合、字段转换提供了范式,可以考虑使用 GraphQL 服务作为 BFF 层,或者结合1、2点,将部分接口实现为 GraphQL,作为 BFF 层的一部分

    2.3K20

    前端 JS 异常那些事

    如果都没有捕获,会抛出类似 unCaughtError,表示发生了一个异常,未被捕获的异常通常会被打印在控制台上 error 对象 Error本身作为函数直接调用和被 new 调用的效果是一样的 const...URIError – 解析 URI 编码出错 EvalError – 调用 eval 函数错误 InternalError – Javascript 引擎内部错误的异常抛出, “递归太多” Error...即可看到是哪个错误具体产生当前的错误,对于一些调用链路比较深的可可能存在多个异常抛出情况这个特性还是相当好用的,可以准确追踪。...这种由于逻辑缺失容错造成的自动抛出错误应该是要尽最大程度杜绝并防范的 const a = {} a.b.c = 1 手动抛出:直接调用throw 那什么时候应该手动抛出异常呢?...window.onerror则无法捕获静态资源的加载错误 React 中的异常 白屏异常 React 处理阶段的同步代码报错,整个组件树挂了导致卸载掉,页面展示白屏 生命周期函数报错 render

    19110

    React生命周期

    描述 此处描述的是使用class类组件提供的生命周期函数,每个组件都包含自己的生命周期方法,通过重写这些方法,可以在运行过程中特定的阶段执行这些方法,常用的生命周期有constructor()、render...卸载过程 当组件从DOM中移除时,组件更新的生命周期调用顺序如下: componentWillUnmount() 错误处理 当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用如下方法: static...componentWillUnmount() {} static getDerivedStateFromError() 此生命周期会在后代组件抛出错误后被调用,它将抛出的错误作为参数,并返回一个值以更新...,因此允许执行副作用,它应该用于记录错误之类的情况它接收两个参数: error: 抛出的错误。...info: 带有componentStack key的对象,其中包含有关组件引发错误的栈信息。

    2K30

    由 for...of 深入看 Babel 转码的局限

    一种数据结构只要具有 Iterator 接口,我们就可以认为该数据结构是“可遍历的”(iterable)。原生数据结构中具有“可遍历”属性的包括数组、Set、Map、以及字符串之类的类数组对象等。...具体参见 ES6 文档),该属性本身是一个函数,执行该函数会返回一个指针对象。...现在,我们回过头来看 Babel 转换 for…of 循环的代码,其本质上还是通过调用 Iterator 接口(注意第 9 行),将 for…of 转换为传统的 for 循环,并在每次循环中调用遍历器的...如果在循环调用过程中出现错误,遍历器中如含有预定义的 return 函数(参见 ES6 文档中遍历器对象的规范 ),则调用之,否则直接抛出错误。...所以,问题就出现了,即使调用 Babel 对 for…of 循环进行转码,我们实际上还是无法完全摆脱 ES6 的特性——在不支持 Symbol 的环境下,代码仍然会报错。

    89140

    4种主流的API架构风格对比

    (四种 API 架构风格) RPC:调用另一个系统的函数 远程过程调用是一种允许在不同上下文中远程执行函数的规范。RPC 扩展了本地过程调用的概念,并将其放在 HTTP API 的上下文中。...1 RPC 的工作机制 客户端调用一个远程的过程,将参数和附加信息序列化为消息,然后将消息发送到服务端。服务端在接受到消息后,将信息的内容反序列化,执行所请求的操作,然后将结果发送回客户端。...服务端和客户端之间交互的机制归结为调用端点并获得响应。 易于添加新函数。...在 RPC 中,无法对 API 进行检验总结,或者发送请求来开始理解根据需求应该调用哪个函数。 函数爆炸性增长。创建新函数非常容易。...SOAP API 规范允许返回带有错误码及其说明的的 XML 重试消息。 一系列的安全拓展。SOAP 与 ES-Security 集成,因此 SOAP 可满足企业级事务要求。

    2.3K30

    4种主流的API架构风格对比

    四种 API 架构风格 1RPC:调用另一个系统的函数 远程过程调用是一种允许在不同上下文中远程执行函数的规范。RPC 扩展了本地过程调用的概念,并将其放在 HTTP API 的上下文中。...RPC 的工作机制 客户端调用一个远程的过程,将参数和附加信息序列化为消息,然后将消息发送到服务端。服务端在接受到消息后,将信息的内容反序列化,执行所请求的操作,然后将结果发送回客户端。...在 RPC 中,无法对 API 进行检验总结,或者发送请求来开始理解根据需求应该调用哪个函数。 函数爆炸性增长。创建新函数非常容易。...SOAP 在适用于多种场景的传输协议方面是十分灵活的。 内置错误处理。SOAP API 规范允许返回带有错误码及其说明的的 XML 重试消息。 一系列的安全拓展。...详细的错误消息:GraphQL 以类似于 SOAP 的方式提供所发生错误的详细信息。它的错误消息包括所有解析器,并指向确切的发生故障时的查询部分。

    2.3K20

    ES6新特性

    Symbol类型值的key,实质是检测该Symbol是否已创建。...-> 汇编 -> 低级语言(面向过程) -> 高级语言(面向对象) -> 模块 -> 框架 -> API 面向对象: 1.封装性 2.继承性 3.多态性 ---- 类 ES6类的添加可以覆盖之前构造函数传统的方式...,更便捷,更系统 注意的是:以前proto只能访问不能修改,ES6后可修改指向也可访问 关于类的关键字和方法 class 类 constructor 构造函数 extends 继承 super() 替代之前借用构造函数来初始化继承的函数...第二个例子的变量没有对应的同名属性,导致取不到值,最后等于undefined。 6.4 对象的扩展 6.4.1 属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法。...(err) // 把容器的 Pending 状态变为 Rejected // 调用 reject 就相当于调用了 then 方法的第二个参数函数 reject(err

    97210

    vue-cli 脚手架中 webpack 配置基础文件详解

    "babel-helper-vue-jsx-merge-props": "^2.0.3",//预制babel-template函数,提供给vue,jsx等使用 "babel-loader": "^...如果遇到函数,它将执行它们,通过算法运行结果,然后再次将返回的值封装在函数中 }, //engines是引擎,指定node和npm版本 "engines": { "node": ">= 6.0.0...平常我们使用的时候会在里面建立js,css,img,fonts等文件夹,作为静态资源调用 ②、components文件夹:用来存放组件,合理地使用组件可以高效地实现复用等功能,从而更好地开发项目。...具体使用请点击→vue-router传送门 ④、App.vue:作为我们的主组件,可通过使用开放入口让其他的页面组件得以显示。...//如果遇到函数,它将执行它们,通过算法运行结果,然后再次将返回的值封装在函数中.这边将dev和prod进行合并module.exports = merge(prodEnv, { NODE_ENV:

    1.4K31

    一种不错的 BFF Microservice GraphQLREST API 层的开发方式

    运行单元测试 单元测试与要测试的模块或类位于同一目录中 所有单元测试都需要有一个扩展名 \*.spec.ts npm run test 运行集成测试 集成测试与要测试的模块或类位于同一目录中 所有集成测试都需要有一个扩展名...例如,如果 'UUID' 设置为 xxxx-dddd-ssss-wwww-ssss,那么调用 /shop/products API 将生成 { "pid": 13492, "hostname":...Mocks 作为 TDD 的一部分,我们可能需要模拟 graphql 响应,直到我们能够实现解析器为止 该基础结构设置为仅为当前未实现的解析器添加模拟。.../examples api,将导致基于角色的授权失败 GraphQL Directives 这项工作正在进行中。...查询 schema examplesWithAuth: [ExampleType] @auth(requires: ADMIN) 使用 @auth 指令,该指令将拦截具有适当角色的经过身份验证的用户的调用检查

    2.4K10

    前端基础知识整理汇总(下)

    错误处理 当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用如下方法: static getDerivedStateFromError():此生命周期会在后代组件抛出错误后被调用。...它将抛出的错误作为参数,并返回一个值以更新 state componentDidCatch():此生命周期在后代组件抛出错误后被调用,它应该用于记录错误之类的情况。...它接收两个参数: error —— 抛出的错误。 info —— 带有 componentStack key 的对象 生命周期比较 16.0 前生命周期 ? 16.0 后生命周期: ?...参考: 浅析 React v16.3 新生命周期函数 react 16做了哪些更新 react作为一个ui库,将前端编程由传统的命令式编程转变为声明式编程,即所谓的数据驱动视图。...Babel Plugin与preset区别 Babel是代码转换器,比如将ES6转成ES5,或者将JSX转成JS等。借助Babel,开发者可以提前用上新的JS特性。

    1.1K10

    Java面试系列9

    ClosedSelectorException 试图在已关闭的选择器上调用 I/O 操作时抛出的未经检查的异常。...IllegalBlockingModeException 当以错误的阻塞模式调用特定于某个阻塞模式的操作时,抛出此未经检查的异常。...TypeNotPresentException 当应用程序试图使用表示类型名称的字符串对类型进行访问,但无法找到带有指定名称的类型定义时,抛出该异常 TypeConstraintException 此异常指示已检测到存在违反动态检查的类型约束的情况...),且该异常不可分配给该方法的throws子局声明的任何异常类,则由代理实例上的方法调用抛出此异常。...抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 ✎四、List, Set, Map是否继承自Collection接口?

    2K40

    ES6 + Babel + React低版本浏览器采坑记录

    ,重写了子类原型来实现继承,并将constructor指回subClass // 在es3中可以借助寄生式继承的方式,以避免经典原型链继承的缺点(多执行一遍父类的构造函数以及子类原型上冗余父类的实例属性...结合下面的$0 // 为了子类能够继承父类的静态属性和方法 // 由于IE9,10会执行__proto__,因此下面的$0根本无法调用到父类构造函数,因此无法继承父类的实例属性 if (superClass...inherits(App, _React$component); function App(props) { _classCallCheck(this, App); // 注意这里是直接调用了父类的构造函数...而IMUI作为一个UI组件库供别人使用,正需要使用这个插件,避免污染全局的polyfill。...babel-runtime的编译结果依赖corejs里会带有这样的代码: // babel-runtime/helpers/inherits var _setPrototypeOf = require(

    1.3K20

    ES6 + Babel + React低版本浏览器采坑记录

    ,重写了子类原型来实现继承,并将constructor指回subClass // 在es3中可以借助寄生式继承的方式,以避免经典原型链继承的缺点(多执行一遍父类的构造函数以及子类原型上冗余父类的实例属性...结合下面的$0 // 为了子类能够继承父类的静态属性和方法 // 由于IE9,10会执行__proto__,因此下面的$0根本无法调用到父类构造函数,因此无法继承父类的实例属性 if (superClass...inherits(App, _React$component); function App(props) { _classCallCheck(this, App); // 注意这里是直接调用了父类的构造函数...而IMUI作为一个UI组件库供别人使用,正需要使用这个插件,避免污染全局的polyfill。...babel-runtime的编译结果依赖corejs里会带有这样的代码: // babel-runtime/helpers/inherits var _setPrototypeOf = require(

    1.8K90

    创建 React 应用的 7 种方式,你用过几种?

    babel-loader babel: 可以将 es6 代码转变为 es5, @babel/preset-react: 让 babel 支持 react 的预设 babel-loader:是让 webpack...支持 babel 的加载器 在项目更目录新建一个 babel.config.js 文件,将安装的 babel 写入这个文件,babel 会在运行前读取这份配置文件。...运行 graphql 语言查询 比如创建一个博客列表,可以在代码中直接导出一个 graphql 查询语言,然后在函数中使用查询的数据进行渲染。...ISR – 增量静态再生,可以再次从 API 获取数据,并且生成静态页面,最适合常见的资讯类、新闻类网站。...六:UmiJS Umi 作为一个可扩展的企业级前端应用框架,在蚂蚁集团内部已经已直接或间接地服务了 10000+ 应用,它提供了路由、状态管理、插件体系等功能。

    7.4K10
    领券