CoffeeScript 2.5.0 新特性详解:Babel 兼容 AST 输出、数字分隔符、BigInt 与 JSX 命名空间
编程语言编译器【免费下载链接】coffeescriptUnfancy JavaScript项目地址https://gitcode.com/gh_mirrors/co/coffeescript点击查看免费下载本文基于 CoffeeScript 仓库中的 2.5.0 版本说明 撰写并结合 src/coffeescript.coffee、src/command.coffee、src/lexer.coffee、src/nodes.coffee 等源码实现深入讲解 2.5.0 版本引入的ast编译选项、数字字面量增强数字分隔符与 BigInt、三引号字符串输出优化、类计算属性与 JSX 命名空间支持帮助读者理解这些特性的用法、底层实现与生态价值。读完本文你将能够通过命令行与 Node API 获取 CoffeeScript 源码的抽象语法树并掌握 2.5.0 之后合法的数字、字符串、类与 JSX 写法。版本概览CoffeeScript 2.5.0 发布于 2019 年 12 月 31 日是继 2.4.1 之后的一个重要功能版本。本次更新没有引入破坏性语法变更而是围绕「与 JavaScript 生态对齐」与「可集成性」两个方向展开一方面新增了面向工具链的ast输出能力使 ESLint、Prettier 等外部工具可以直接解析 CoffeeScript另一方面补齐了 JavaScript 中已普及的数字分隔符、BigInt 等字面量语法并优化了字符串与 JSX 的编译输出。全新的ast选项向 Babel AST 规范对齐2.5.0 最核心的变更是编译器新增了ast选项可通过命令行参数--ast或 Node API 的ast选项启用。启用后编译器不再输出编译后的 JavaScript而是输出输入源码的抽象语法树——一个 JSON 风格的节点表示。命令行用法在 src/command.coffee 的选项表中可以看到该参数的官方定义[--ast, generate an abstract syntax tree of nodes]用法示例coffee --ast path/to/script.coffee--ast与既有的调试类选项如-n/--nodes打印 parse tree、--tokens打印词法 token定位不同--nodes输出的是面向人阅读的树形文本而--ast输出的是遵循特定规范的、可供机器解析的 JSON 结构。Node API 用法在 Node 环境中可以通过compile方法传入ast选项获取 AST 对象const CoffeeScript require(coffeescript); const ast CoffeeScript.compile(square (x) - x * x, { ast: true }); console.log(JSON.stringify(ast, null, 2));从 src/coffeescript.coffee 的编译流程可以看到当options.ast为真时编译过程会在语法分析parser完成后提前返回跳过后续的代码生成compileToFragments与 source map 构建if options.ast nodes.allCommentTokens helpers.extractAllCommentTokens tokens sourceCodeNumberOfLines (code.match(/\r?\n/g) or ).length 1 sourceCodeLastLine /.*$/.exec(code)[0] ast nodes.ast options range [0, code.length] ast.start ast.program.start range[0] ast.end ast.program.end range[1] ast.range ast.program.range range ast.loc.start ast.program.loc.start {line: 1, column: 0} ast.loc.end.line ast.program.loc.end.line sourceCodeNumberOfLines ast.loc.end.column ast.program.loc.end.column sourceCodeLastLine.length ast.tokens tokens return ast这段代码揭示了 AST 输出的几个关键细节根节点修正由于词法阶段的clean处理可能使根File/Program节点的位置数据与原始源码产生偏移编译器在这里对根节点的start、end、range、loc进行了统一修正确保根节点位置精确对应整段源码。附带tokens返回的 AST 对象上直接挂载了词法分析产生的 token 数组ast.tokens方便需要同时使用 token 流与语法树的工具。附带注释allCommentTokens会被提取并挂载到节点上注释节点也能出现在 AST 中对应 src/nodes.coffee 中comment.ast()的调用。AST 节点结构与 Babel 兼容性AST 的生成逻辑集中在 src/nodes.coffee。源码注释明确说明这是节点的「纯 JavaScript 对象表示可序列化为 JSON」并且尽量遵循 Babel AST 规范以提高与外部工具的互操作性。每个 AST 节点对象包含四类属性见 astNode 方法type节点类型字符串默认取节点类名例如NumberLiteral、Identifier可被子类覆盖如NumberLiteral在 BigInt 时返回BigIntLiteral。位置数据loc、start、end、range字段由 astLocationData 将内部 Jison 位置数据重组为 Babel 规范要求的结构。节点专属属性例如数字字面量的parsedValue、extra.raw等。子节点属性例如函数体的body、表达式的expression等。同时ast 方法 会对处于表达式尾部、存在隐式返回的节点标记returns: yes保证工具能识别 CoffeeScript 的函数隐式返回语义。基类的ast方法被特别标注「不要在子类中覆盖」子类只需按需实现astType、astProperties、astNode等组件方法这保证了整个节点体系生成的 AST 结构一致、可预测。生态集成与稳定性说明原版发布说明提到两个基于该 AST 输出的知名工具是通过 ESLint 对 CoffeeScript 进行 lint 的eslint-plugin-coffee以及通过 Prettier 对 CoffeeScript 源码进行格式化重排的prettier-plugin-coffeescript。它们的工作方式正是调用compile的ast选项拿到符合 Babel 规范的语法树再复用 JavaScript 生态中成熟的 AST 处理管线。需要特别强调的是版本说明中的警告CoffeeScript AST 的结构与属性尚未最终定型可能在不同 CoffeeScript 版本之间发生破坏性变更。因此如果你计划基于该 AST 构建新的集成工具务必为所依赖的 CoffeeScript 版本锁定依赖并关注每个版本的变更记录。数字字面量增强数字分隔符与 BigInt2.5.0 在数字字面量方面同步了 JavaScript 的两项能力数字分隔符numeric separators与 BigInt。数字分隔符数字分隔符允许在数字中插入下划线_以提升可读性语法与 JavaScript 一致largeNumber 1_234_567 binary 0b1010_0001 hex 0xff_ff scientific 1_000.000_1其词法实现在 src/lexer.coffee 的NUMBER正则中二、八、十六进制以及十进制小数、科学计数法分支均支持_分隔NUMBER /// ^ 0b01*n? | # binary ^ 0o0-7*n? | # octal ^ 0x\da-f*n? | # hex ^ \d(?:_\d)*n | # decimal bigint ^ (?:\d(?:_\d)*)? \.? \d(?:_\d)* # decimal (?:e[-]? \d(?:_\d)* )? ///i注意这里的_只允许出现在数字之间\d(?:_\d)*模式不能出现在开头或结尾这与 JavaScript 的规范一致。BigInt 字面量BigInt 通过在整数字面量末尾追加n表示语法与 JavaScript 一致huge 42n max 9007199254740993n # 超过 Number.MAX_SAFE_INTEGER 的整数42n这样的写法在 lexer.coffee 中被识别二/八/十六进制同样支持n后缀随后在 src/nodes.coffee 的NumberLiteral中处理isBigInt通过检测n后缀判定是否为 BigInt在生成 AST 时BigInt 字面量对应的type为BigIntLiteral普通数字为NumericLiteral并且value与extra.rawValue均以字符串形式保存 BigInt 的十进制表示避免精度丢失astType: - if isBigInt() BigIntLiteral else NumericLiteral astProperties: - return value: if isBigInt() parsedValue.toString() else parsedValue extra: rawValue: if isBigInt() parsedValue.toString() else parsedValue raw: value字符串输出优化三引号字符串生成模板字面量2.5.0 优化了三引号字符串与的编译输出。此前多行字符串在编译结果中会使用\n转义序列拼接从本版本开始编译器会直接输出 JavaScript 的模板字面量反引号字符串保留真实换行使生成的 JavaScript 更易读# CoffeeScript 源码 poem Roses are red, Violets are blue. # 2.5.0 之前的编译结果示意使用 \n 转义 poem Roses are red,\nViolets are blue.; # 2.5.0 之后的编译结果示意输出为模板字面量保留真实换行 poem Roses are red, Violets are blue.;该优化同时作用于普通字符串与可插值字符串既提升了输出可读性也不改变字符串的语义值。类中的计算属性2.5.0 允许类定义中出现计算属性名语法与对象字面量的计算属性一致使用方括号包裹表达式class Car [someVar]: - method value [anotherVar]: - static method value其中[someVar]: -定义实例方法、[anotherVar]: -定义静态方法属性名在类定义求值时动态计算。这使得 CoffeeScript 的类语法与 ES2015 类的计算成员能力对齐。JSX 支持 XML 风格命名空间对于启用 JSX 扩展的项目2.5.0 允许 JSX 标签与属性使用 XML 风格的命名空间写法image xlink:hrefdata:image/png / Something:Tag/Something:Tag即标签名或属性名中可以出现:分隔的命名空间前缀。对应地词法层在 src/lexer.coffee 的JSX_ATTRIBUTE正则中支持了JSXNamespacedName形如JSXIdentifier : JSXIdentifier的解析与 JSX 规范中对JSXAttributeName的定义保持一致。Bugfix 汇总2.5.0 同时修复了以下问题冒号后的注释丢失此前写在冒号如对象属性分隔符之后的注释不会出现在编译输出中现已修复保留字被误判为非法 JSX 属性此前class、for等保留字用作 JSX 属性名会被错误拒绝现已允许多行数组中的缩进前置省略号elision形如数组内多行书写且行首存在省略空位elision的情况此前缩进解析异常现已修复source map 位置数据错误修复了某些情况下 source map 中包含无效位置数据的问题。升级与使用建议若你的工具链需要解析 CoffeeScript 源码lint、格式化、重构、代码分析可基于ast选项构建请锁定 CoffeeScript 版本并留意后续版本对 AST 结构的调整。数字分隔符与 BigInt 均为编译期字面量特性目标运行时需支持 ES2020 的 BigIntNode.js 10.4、现代浏览器才能运行包含42n字面量的输出。三引号字符串输出模板字面量后生成的 JS 可读性更高对阅读编译产物、调试 source map 都有帮助。JSX 命名空间支持属于语法层增强实际渲染语义由你所用的 JSX 运行时如 React解释。完整的版本变更脉络可对照 2.4.1 版本说明 与后续的 2.5.1 版本说明若无则参考 2.6.0 版本说明以了解该系列版本的演进方向各特性的源码实现可进一步阅读 src/lexer.coffee、src/nodes.coffee 与 src/coffeescript.coffee。赞分享编程语言编译器【免费下载链接】coffeescriptUnfancy JavaScript项目地址https://gitcode.com/gh_mirrors/co/coffeescript点击查看免费下载相关推荐Cloudflare Docs 兼容性标志解析containers_pid_namespace 与容器 PID 命名空间隔离Cloudflare Docs 兼容性标志解析containers_pid_namespace 与容器 PID 命名空间隔离 本文以 containers p文档Argo Workflows 命名空间字段选择器 与 ! 运算符详解Argo Workflows 命名空间字段选择器 与 ! 运算符详解 导读 本指南讲解 Argo Workflows v4.1.0 引入的命名空间n云原生容器编排工作流自动化任务调度后端iSH命名空间进程隔离与资源命名空间iSH命名空间进程隔离与资源命名空间 在iOS设备上运行完整的Linux shell环境iSH项目通过用户态x86模拟和系统调用转换实现了这一壮举。作为核心操作系统虚拟化CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考