前端工程化:有效地进行拼写检查

简介: 前端工程化:有效地进行拼写检查

拼写错误导致的问题


在项目开发过程中,即使我们再细心,也难免忙中出错,犯下很多低级的错误。

比如这样:

image.png

我们错把 field 拼写成 filed,这样打印出来的是 undefined,而不是预期的 name。


ESLint 的基本介绍


但是幸运的是,有一些 Lint 工具会在这方面提供一些帮助。

比如在 TypeScript 中,会有一个错误提示。虽然这个提示提供的消息并不是我们需要的。

image.png

当然我们可以选择一些更专业的 Linter 来完成这项工作。

目前来说,最流行的 JavaScript Linter 是 ESLint。

如果配合 VSCode 这个编辑器使用的话,可以安装 vscode-eslint 这个插件。

然后在项目的根目录下创建 .eslintrc.js 文件,编写一些配置。


/** @type {import('eslint').Linter.Config} */
module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
  },
  rules: {
    "no-undef": ["error"],
  },
};

env 属性指定项目的运行环境。

rules 是具体的规则。

no-undef 这条规则的意思是不可以使用未定义的变量。

no-undef 属性的值是一个数组,数组的第一个元素是这条规则的级别。

ESLint 中的所有规则都有 3 个等级,off 表示关闭,wran 表示开启和 error 表示错误。

你可以根据自己对代码要求的严格程度自定义规则等级。

当我们配置好了这条规则之后,编辑器的错误提示就会发生变化。

image.png

ESlint 会给我们提示 filed 这个变量没有被定义,而被直接使用了。

这样就可以帮助我们发现这个问题,从而更早的解决掉这个问题。

这是一种比较容易发现的问题。


声明变量时的单词拼写错误


另一个更加隐秘晦涩的错误是,我们在定义变量时就把变量的单词拼写错了。

比如下面这样:

image.png

这种问题 ESLint 是没有办法检测到的,而且真正运行起来也不会有什么问题。

最大的问题在于维护。

假设这段代码的维护者换成了别人,他很难一眼看出这段代码究竟在表达什么意思。

filed?是文件的过去式,表达的意思是归档吗?

他压根就不可能会朝 field,也就是字段的含义上去考虑。

这会让接下来的整个逻辑流程阅读起来变得非常费解。

这种问题属于根源性的问题。


人工解决方案


解决办法当然存在,建立业务术语表,然后经过人工代码审查(CodeReview)。

但是,人在真正意义上是不靠谱的。

即使再强大、再细致的人,也会有焦急、疲倦、松懈的时候。所以即使是通过人工代码审查后的代码,也未必不会存在上面提到的这种问题。


机器解决方案


那么能够有一种更好的方式来避免这类问题呢?

比如能否依靠在真正意义上靠谱的机器来协助人类做这件事情?

当然是可以的。

ESLint 有一套插件机制,可以通过插件来扩展 ESLint 原本的功能。

其中有一个比较常用的插件,eslint-plugin-spellcheck。

这个插件的作用是帮助我们检查单词的拼写错误。

安装也非常简单。


npm install eslint-plugin-spellcheck

之后需要更新 ESLint 的配置。


/** @type {import('eslint').Linter.Config} */
module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
  },
  plugins: [
    "spellcheck",
  ],
  rules: {
    "no-undef": ["error"],
    "spellcheck/spell-checker": ['warn']
  },
};

这样就可以对代码中单词拼写错误的。


拼写错误与意图表达错误


但是,讲了这么多,像上面提到的反例,spell-checker 仍然是无能为力的。

为什么呢?因为上面提到的反例,表面上看只有一个错误,但无形之中还存在另一个错误。

  1. 拼写错误,field 拼写成了 filed。
  2. filed 仍然是个正确的单词。如果将 filed 认为是一个正确的单词,那么第二个错误将是意图表达错误

机器只能解决拼写错误,但是意图表达错误这类问题明显超越了机器目前的能力边界。

所以我们可以把反例稍微改一下。

image.png

filde 不是一个合法单词,所以就得到 spell-checker 的警告提示。


spell-checker 的实现原理


spell-checker 的实现原理就是罗列出超过 4 万个英文单词进行匹配,如果不在这个范围内的英文单词就认为是拼写错误。

当然我们也可以扩展这个单词列表。

ESLinter 的 rules 中属性值都是一个数组。第一个元素是规则级别,第二个元素就是一个对象,表示这个规则对应的配置项。

spell-checker 的配置项中有一个 skipWords,表示可以跳过一些单词。


跳过特殊单词


比如你在使用 ESModule 的方式来开发应用,其中用到了 Vue 这个库。

我们需要在 .eslintrc.js 中添加一项配置,让 ESLint 的解释器以模块的方式解释代码。


module.exports = {
  // ...
  parserOptions: {
    sourceType: 'module'
  }
}

但是 Vue 并不是一个合法的单词。

image.png

我们就可以通过配置这个配置项来跳过对 Vue 的检测。


module.exports = {
  rules: {
    "spellcheck/spell-checker": [
      "warn",
      {
        skipWords: ["Vue"],
      },
    ],
}

这样代码就不会再出现警告了。

image.png

但是到目前为止,问题还是没有完全解决。

因为一些库中提供的 API 仍然不是合法单词。比如 Teleport。

image.png

我们可以选择手动添加 Teleport 这个单词到 skipWords 中。

但问题是,Vue 中仍然提供了很多 API 不在合法单词范围内,比如 withCtx:

image.png

如果我们碰到哪个单词就朝 skipWords 里面添加哪个单词,在使用的库比较少的时候还可以接受。如果我们的项目中依赖了大量的库,而这些库中又存在了大量的不合法单词 API,这会让我们感到非常的繁琐和痛苦。

另外一个问题就是,Node.js 很多内置模块的 API 同样不是合法单词。比如常用的 fs 和 readdir。

image.png

那有没有什么方法可以解决上面的两个问题呢?

答案是有的。


modules-words


modules-words 是一个获取模块 API 单词的库,通过这个库配合 spell-checker 可以很好的帮助我们跳过很多第三方模块或者 Node.js 内置模块的 API 单词检查。

首先安装这个模块。


npm add modules-words --save-dev

之后修改 .eslintrc.js 配置文件。


const { getWords, getGlobalWords } = require("modules-words");
/** @type {import('eslint').Linter.Config} */
module.exports = {
  // ...
  rules: {
    // ...
    "spellcheck/spell-checker": [
      "warn",
      {
        skipWords: ["", ...getWords("vue"), ...getGlobalWords()],
      },
    ],
  },
};

通过 modules-words 提供的 getWords 和 getGlobalWords 两个函数,成功地将项目中可能使用到的单词过滤出来,让 spell check 能够以更加符合我们预期的方式运行。



相关文章
|
资源调度 前端开发 测试技术
前端工程化实践:从零搭建现代化项目构建流程
【4月更文挑战第6天】本文介绍了前端工程化的概念和重要性,包括模块化、自动化、规范化和CI/CD。接着,讨论了选择合适的工具链,如包管理器、构建工具和测试框架。然后,详细阐述了如何从零开始搭建一个基于React的现代化项目构建流程,涉及初始化、代码规范、测试、CSS处理、代码分割和CI/CD配置。最后,提到了持续优化与迭代的方向,如性能优化、类型检查和微前端。通过这样的实践,开发者可以提升开发效率和代码质量,为项目长远发展奠定基础。
1086 0
|
JavaScript 前端开发 安全
Apollo与TypeScript:强大类型检查在前端开发中的应用
Apollo与TypeScript:强大类型检查在前端开发中的应用
|
前端开发
前端使用正则表达式检查是否为十六进制字符串
前端使用正则表达式检查是否为十六进制字符串
369 6
|
JSON 前端开发 JavaScript
前端工程化:Webpack配置全攻略
【7月更文挑战第14天】
343 6
|
JSON 缓存 前端开发
前端工程化:Webpack配置全攻略
【7月更文挑战第18天】
342 1
|
缓存 前端开发 JavaScript
前端性能优化实践与工程化
前端性能优化实践与工程化
|
资源调度 JavaScript 前端开发
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
|
前端开发 JavaScript 开发者
【专栏】前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup
【4月更文挑战第27天】本文探讨了前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup。Webpack以其灵活性和插件系统适用于复杂SPA项目,建议开发者理解其核心概念并优化性能。Rollup则专注于JavaScript模块打包,生成更小、更快的代码,适合小型至中型项目和库创建,以其Tree-shaking技术减小代码体积。开发者应根据项目需求、团队技术和生态选择合适工具,掌握核心原理以提升开发效率和质量。
281 1
|
Web App开发 JavaScript 前端开发
前端工程化
前端工程化
323 4
|
前端开发 安全 JavaScript
前端工程化实战 - 日程管理
前端工程化实战 - 日程管理
249 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1318
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    602
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    463
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    464
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    582
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    760
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1491
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    339
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1207
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    551