16 个版本
0.7.0-alpha.2 | 2023 年 6 月 20 日 |
---|---|
0.6.0-alpha.4 | 2022 年 2 月 2 日 |
0.5.1 | 2021 年 8 月 25 日 |
0.5.0 | 2021 年 4 月 28 日 |
0.2.2 | 2019 年 3 月 4 日 |
#8 in #parts
120KB
3K SLoC
RESW
一个实验性的 crate,用于从 RESSA crate 提供的 AST 中编写 JS。
由于 RESSA 的主要目的是让开发者能够用 Rust 编写他们的 JS 开发工具,因此这是该生态系统的重要组成部分。该项目的实验性状态是由于 RESS 和 RESSA 在当前版本中都不稳定,当锁定到本 crate 的 Cargo.toml
中列出的版本时,行为应该是稳定的。
基本用法
以下是如何使用此 crate 的一个简单示例。
// example.js
function thing() {
return 'stuff'
}
使用上面的示例,我们可以创建一个只会鹦鹉学舌输入的程序。
use resw::Writer;
use ressa::Parser;
use srd::fs::{read_to_string, File);
fn main() {
let js = read_to_string("example.js").expect("failed to read example.js");
let p = Parser::new(&js).expect("failed to create parser");
let f = File::create("example.out.js");
let mut w = Writer::new(f);
for part in p {
w.write_part(part).expect(&format!("failed to write part {:?}", part));
}
}
如果我们运行上面的程序,假设 example.js
存在,它会在 example.out.js
中写入以下内容。
// example.js
function thing() {
return 'stuff';
}
不是很令人兴奋,但我确实说过示例将是简单的。查看示例目录以获取更多稍微不那么简单的示例。
说明
运行示例
cargo run --example snippet_writer
期望一个 脚本,除非你传递一个如 cargo run --example snippet_writer -- module
的 "module" 参数。
这就像你的观点...伙计
目前,我已为生成的输出做出了一些个人风格选择。我对这个 crate 的最终愿景是允许配置大量这些决策,但直到 RESSA 有机会添加一些所需的功能,它们将不可配置。以下是我目前能想到的一些事情。
- 注释永远不会包含在输出中
- 空函数体是同一行上的两个花括号,由一个空格分隔
- 空 if、try 和 loop 体是两个花括号,由一个空行分隔
- 新行总是用
\n
表示。 - 函数或函数标识符前面没有空格,写作
(
- 函数参数列表不加空格包围。
- 数组和对象字面量后面有逗号。
- 对象字面量每行只包含一个属性。
建立在不稳定的基础上
对于下一年的RESS/RESSA,我有一些雄心勃勃的计划,这些变化最终会打破这个crate所能做到的事情,但随着时间的推移,这些变化将极大地增强这个crate的功能。正在进行的一些值得注意的事情
RESS
- 实现了新的无分配版本的
Scanner
,但需要测试 - 我想添加TypeScript支持
RESSA
- 已经开始工作,包括所有节点项的位置
- 这将允许RESW提高生成的JS的可靠性
贡献
如果您有兴趣提供帮助,将不胜感激。在此阶段,我鼓励您在尝试在这里提供贡献之前先改进RESS或RESSA。如果您有贡献,请在深入挖掘之前请打开一个issue,这样我们就可以保持一致。
一些需要帮助的地方
- 示例
- 我的想象力有限,即使是关于可能需要作者(不是babel克隆或js压缩器)的开发工具的想法也会很棒
- 如果您想构建一个JS压缩器,我会感到非常荣幸
- 尽管目前还没有机制来排除换行符
依赖关系
~1MB
~17K SLoC