跳到主要内容
Deno 2.4 版本发布,带来了 deno bundle、字节/文本导入、OTel 稳定版等新功能
了解更多

发布 lint 规则,赢取奖品

更新 2025年3月5日:Lint 规则竞赛已结束!

我们收到了许多出色的提交(还有一些俏皮的提交让我们会心一笑)!你们的 Lint 插件涵盖了从解决个人需求到移植 ESLint 规则等各种用途。其中一些值得提及的包括

还有更多!

再次感谢大家,我们将很快寄出贴纸!


Deno 2.2 中,我们新增了通过新的插件系统扩展 deno lint 的能力。尽管 deno lint 目前已有 123 条内置规则,但新的插件系统意味着任何人都可以创建新的 Lint 规则。(相比之下,ESLint 有 310 条规则。)

为了鼓励更多 deno lint 规则的出现,我们正在举办一场竞赛,邀请大家在太平洋时间 3 月 4 日星期二下午 6 点之前编写新 Lint 规则并发布到 JSR。作为对您努力的奖励,每位参与者都将获得一套免费的随机 Deno 贴纸!

继续阅读,了解如何参与

编写新 Lint 规则

为了向您展示如何编写新的 Lint 规则,我们将创建一个插件,它会在您将变量命名为 foo 时报告错误

deno.json
{
  "lint": {
    "plugins": ["./my-plugin.ts"]
  }
}
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;
main.js
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 的选择器来定位特定节点。让我们使用选择器语法重写上述规则。

my-plugin.ts
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 指向您的插件

deno.json
{
  "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.jsonlint.plugins 中使用指定符

deno.json
{
  "lint": {
    "plugins": [
      "./my-plugin.ts",
      "jsr:@my-scope/lint-plugin",
      "npm:@my-scope/other-plugin"
    ]
  }
}

奖品及提交方式

任何向 JSR 提交 deno lint 规则的人都将赢得一套免费的 Deno 贴纸!

Picture of assorted Deno stickers

为了获得贴纸的资格,请填写此表格,提供您的 Lint 规则关键信息和收货地址。

我们将接受提交,截止日期为太平洋时间 3 月 4 日星期二下午 6 点。

更多资源

如果您想参与但没有想法,欢迎加入我们的 Discord,我们将在那里讨论 Lint 规则的想法、回答您的问题,并帮助您开始编写 Lint 规则!

我们期待看到您创建的 Lint 规则!

TwitterDiscordBlueSkyMastodon 上获取技术支持、分享您的项目或打个招呼。