罗马:JavaScript和打字的Linter

2020-08-09 12:15:49

我们很高兴地宣布第一个测试版和罗马Linter的JavaScript和打字版全面上市。

这是一整套工具的开始。罗马不仅是Linter,而且是JavaScript、TypeScript、HTML、JSON、Markdown和CSS的编译器、绑定器、测试运行器等等。我们的目标是统一整个前端开发工具链。

ROMIN是一个整体工具,包含传统上作为前端生态系统中独立工具的功能。我们称之为工具链。它不是现有工具的集合,而是完全自定义的,基本上是从头开始构建的,完全包含在单个包和代码库中。

我们已经为大多数组件提供了重要的实现,包括编译、捆绑和测试,所有这些组件都使用相同的核心抽象和内部库。罗马甚至是自我托管的,我们用它们来建设和发展罗马本身!一旦Linter的使用情况稳定下来,我们将继续研究未发布的特性,以准备并推广它们以供公众使用。

Linting是我们成熟和验证共享功能(如编辑器集成、配置、并行化、缓存、解析和依赖分析)的一种极好的低风险方式。它不在开发的关键构建路径中,因此采用起来相对简单和安全。

$Roman check src/app.jsx:12:3 lint/jsx-a11y/altText━━✖在使用img、Area、Input type=';image';和Object元素时提供Alt文本。10│Return<;=";应用";>;11│<;=";应用标题";>;>;12│<;={徽标2}=";应用徽标";/>;│^^^13│<;>;14│编辑ℹ有意义的元素替代文本可帮助依赖屏幕阅读器的用户了解页面中内容的用途。Src/app.jsx:12:13 lint/js/no未声明变量━━✖未声明的10│返回<;=";应用程序";>;11│<;=";应用程序标题&34;>;>;12│<;={logo2}=";App-LOGO";/>;│^13│<;>;14│编辑ℹ您是指LOGO吗?-LOGO 2+徽标源/App.jsx:2:7 lint/js/noUnusedVariables━━✖导入变量LOGO未使用。1│//@jsx>;2│导入徽标来自";./logo.svg";;│^3│导入";./app.css";;未使用的变量是死码,通常是不完整的refactoring.━━━━ℹ✖发现3个问题的结果。

尽管这是一个测试版,但我们支持100多条皮棉规则,包括使用TypeScript和Reaction时需要的最常见规则。查看完整的规则列表。您可以期待功能齐全的体验,但仍可能会遇到错误。随着大部分功能开发的取消,我们将主要关注稳定性。

我们的大多数规则都是从它们的ESLint等价物中获得灵感的。这需要完全重写,以利用与现有工具有很大不同的罗马API。如果没有ESLint团队和社区建立这些推荐模式的出色工作,我们就不可能做到这一点。有关直接参考,请参阅皮带规则文档。

自从开源以来,在今年年初,我们已经收到了来自70多个贡献者的贡献和600个拉请求。我们有一个既定的团队、正式的治理模式和行为准则执行政策。这确保了项目决策、适度和方向的透明度。

您可以在我们的文档中阅读有关罗马的更多信息,包括如何入门。如果您想参与进来,请查看我们的投稿说明。如果您有兴趣阅读更多关于该项目的历史和基本原理,您可以继续阅读下面的内容。

我在2014年创建了6to5(现在称为Babel),这是一个JavaScript代码转换程序,将新的ES6代码编译成ES5,可以在任何浏览器上运行。当时我并没有试图解决任何特定的问题,我只是在构建和试验现有的库,并自学新的概念。然而,随着时间的推移,随着项目的流行,项目的范围和任务也随之增加。

我们将6to5重命名为Babel,以承担执行静态JavaScript转换的通用平台的新角色。这意味着一个插件系统和支持未来JavaScript标准和提议功能的新承诺。

我们还计划通过使用共享的公共库将Babel扩展为其他JavaScript语言工具的基础。摘自杰米·凯尔(Jamie Kyle)发布的巴别塔(Babel)博客文章“6.0.0发布”:

但我们认为我们可以走得更远。Babel应该能够支持迷你程序、内联程序、格式化程序、语法高光器、代码补全工具、类型检查器、代码解调工具,以及其他所有使用相同基础的工具,以便比以往任何时候都能更好地完成他们的工作。

2016年,我离开了这个项目,这些计划从未实现。随着时间的推移,我了解到巴别塔无论如何都不能成功地适应执行这个愿景。插件的解决方案是“公开所有的内部”,这是一个非常大的API表面积,需要维护并限制您进行任何更改的能力。

对巴别塔进行必要的修改,以使其成为其他工具的可靠基础,绝对需要对所有内容进行更改。该体系结构与我在2014年做出的初始设计选择有关,当时我正在学习解析器、AST和编译器。

没有办法提供向后兼容性,而且已经设定了预期,项目的任何重大变化都会带来极高的生态系统扰动。

在对特修斯之船的颂歌中,如果一个物体的所有部件都被更换了,那么它是不是同一个物体?与彻底改变已经广泛使用的东西相比,发布全新的东西要少得多的困惑和摩擦。我已经离开了这个项目,所以任何进化都是不可能的,需要完全一致的愿景。

即使我没有参与到Babel中,我仍然在开发工具生态系统中保持了一席之地。我最终开发了其他工具,如Yarn,并参与了Prepak和Flipper等项目。这项工作继续发展了最终成为罗马的想法,并塑造了我关于开发人员体验的哲学。关注优秀的错误、整洁的用户界面和最低限度的配置。

巴别塔背后的最初想法一直坚定不移。如果一个工具可以做不止一件事,那么会有什么样的功能呢?这种哲学在JavaScript生态系统中似乎一直很陌生,在那里微包和任意的关注点分离是规范。这些独立的工具从来没有提供过大多数对单一工具持怀疑态度的人所宣称的那种用户自主性和效率。

语言工具维护人员在相同的事情上花费了如此多的时间。处理源代码,无论是在像Babel这样的代码转换程序中,在ESLint中编译,还是在webpack中捆绑,本质上都是职责重叠和技术实现重叠的问题。

JavaScript生态系统中的Linter与编译器完全相同。它们都使用代码,然后生成编译后的代码和错误。编译后的代码内容各不相同。在Linter的情况下,编译后的代码是应用了自动修复的格式化源代码。编译基础设施越强大,理论上Linter就可能越强大。这些共性几乎扩展到任何涉及语言处理的东西。我们可以使用易于修改的共享库来构建更强大的工具。

我一直在维护私人回购,在那里我会试验想法,但后来成为罗马的原始代码是在2017年初开始的,当时我在空闲时间为Facebook工作。我继续对这个想法进行迭代和实验,并构建出所有不同的部分,直到2019年,我有机会在Facebook全职工作和探索使用它。

我最终离开了Facebook,这个项目在2020年2月成为开源项目,在那里我将把它作为一个独立的社区驱动的项目继续下去。

罗马是巴别塔的精神继承者。我吸取了我学到的教训,改进了任务。我们不是公开一个大型公共API来构建其他工具,而是将它们都构建在一个地方,其中包括电池。我很高兴能尝试一些JavaScript和网络生态系统从未见过的新东西。