发布 lint 规则,赢取奖品
更新 2025年3月5日:Lint 规则竞赛已结束!
我们收到了许多出色的提交(还有一些俏皮的提交让我们会心一笑)!你们的 Lint 插件涵盖了从解决个人需求到移植 ESLint 规则等各种用途。其中一些值得提及的包括
@armaanas/no-empty-function
: 一个简单的规则,用于警告任何空函数@sakgoyal/use-nullish
: 强制使用Nullish Coalescing
(空值合并)运算符而不是三元运算符@0fficersally/fresh-island-naming-lint-plugin
: 要求所有 Fresh island 名称都使用“Island”后缀@danteasc4/ban-enum
: 将所有 TypeScriptenum
替换为类型联合(type unions)@aireone/deno-lint-curly
: ESLint 规则 curly 的一个最小化重新实现@tyler/no-this-plugin
: 警告任何this
的使用@prosto/nullish
: 一组 Lint 规则,用于强制以相同方式处理null
和undefined
值
还有更多!
再次感谢大家,我们将很快寄出贴纸!
在 Deno 2.2 中,我们新增了通过新的插件系统扩展 deno lint
的能力。尽管 deno lint
目前已有 123 条内置规则,但新的插件系统意味着任何人都可以创建新的 Lint 规则。(相比之下,ESLint 有 310 条规则。)
为了鼓励更多 deno lint
规则的出现,我们正在举办一场竞赛,邀请大家在太平洋时间 3 月 4 日星期二下午 6 点之前编写新 Lint 规则并发布到 JSR。作为对您努力的奖励,每位参与者都将获得一套免费的随机 Deno 贴纸!
继续阅读,了解如何参与
编写新 Lint 规则
为了向您展示如何编写新的 Lint 规则,我们将创建一个插件,它会在您将变量命名为 foo
时报告错误
{
"lint": {
"plugins": ["./my-plugin.ts"]
}
}
const plugin: Deno.lint.Plugin = {
name: "my-lint-plugin",
rules: {
"my-lint-rule": {
create(context) {
return {
VariableDeclarator(node) {
if (node.id.type === "Identifier" && node.id.name === "foo") {
context.report({
node,
message: "Use more descriptive name than `foo`",
});
}
},
};
},
},
},
};
export default plugin;
const foo = "foo";
console.log(foo);
$ deno lint main.js
error[my-lint-plugin/my-lint-rule]: Use more descriptive name than`foo`
--> /dev/main.js:1:7
|
1 | const foo = "foo";
| ^^^^^^^^^^^
Found 1 problem Checked 1 file
除了基于访问者的 API,您还可以使用 类似 CSS 的选择器来定位特定节点。让我们使用选择器语法重写上述规则。
const plugin: Deno.lint.Plugin = {
name: "my-lint-plugin",
rules: {
"my-lint-rule": {
create(context) {
return {
'VariableDeclarator[id.name="foo"]'(node) {
context.report({
node,
message: "Use more descriptive name than `foo`",
});
},
};
},
},
},
};
export default plugin;
要查看实际效果,请观看这个一分钟的视频演示
欲了解更多信息,请查阅 Deno 文档中关于 deno lint
插件 API 的内容。
不确定要创建什么 Lint 规则?
首先,ESLint 中有许多流行规则尚未在 Deno 中实现
- semi: 强制在语句末尾一致使用分号
- quotes – 强制对字符串一致使用引号(单引号、双引号或反引号)
- curly – 要求所有控制块(如 if/else/for 等)使用大括号
{}
, 即使是可选的 - no-alert – 禁止在代码中使用 alert、confirm 和 prompt
- no-use-before-define – 禁止在定义变量或函数之前使用它们
- consistent-return – 要求函数要么总是返回值,要么从不返回值
- no-shadow – 禁止变量声明遮蔽外部作用域中声明的变量
- no-unused-expressions – 标记未使用的表达式语句(无效果的语句)
- no-empty-function – 禁止空函数体
- no-underscore-dangle – 禁止标识符中使用悬空下划线(前缀或后缀)
- no-implied-eval – 禁止隐式调用 eval() 效果的代码
要查看更多 Lint 规则示例,请查看 ESLint 的 GitHub 仓库。
如需获取尚未存在的 Lint 规则的灵感,请查阅此 GitHub issue(警告:此 issue 可能已有些过时,请谨慎参考)。
另外提醒一下,如果您最终借用了 ESLint 的代码,请务必注明出处并提供许可证!
将您的 Lint 规则发布到 JSR
Lint 插件可以用 TypeScript 编写,Deno 在 Deno.lint
命名空间下开箱即用地提供了完整的类型声明。
要将您的插件发布到 JSR,请更新您的 deno.json
,使其 exports
指向您的插件
{
"lint": {
"plugins": ["./my-plugin.ts"]
},
"name": "@lambtron/andys-lint-rule",
"version": "0.3.0",
"license": "MIT",
"exports": "./my-plugin.ts"
}
然后,运行 deno publish
(或 npx jsr publish
),它就会出现在 JSR 上。
有关完整的端到端示例,请查阅Andy 的 Lint 规则。
从 JSR(或 npm)使用 Lint 插件很简单。您可以直接在 deno.json
的 lint.plugins
中使用指定符
{
"lint": {
"plugins": [
"./my-plugin.ts",
"jsr:@my-scope/lint-plugin",
"npm:@my-scope/other-plugin"
]
}
}
奖品及提交方式
任何向 JSR 提交 deno lint
规则的人都将赢得一套免费的 Deno 贴纸!
为了获得贴纸的资格,请填写此表格,提供您的 Lint 规则关键信息和收货地址。
我们将接受提交,截止日期为太平洋时间 3 月 4 日星期二下午 6 点。
更多资源
如果您想参与但没有想法,欢迎加入我们的 Discord,我们将在那里讨论 Lint 规则的想法、回答您的问题,并帮助您开始编写 Lint 规则!
我们期待看到您创建的 Lint 规则!