• home > OMD > codeGuide >

    vue2老项目添加typescript与eslint支持(不用TSlint)

    Author:zhoulujun Date:

    vue-cli不加typescript 与加上typescript的规则,代码风格还是不一样的。之前的vue项目是不加分号的,对象尾项不加逗号的。跟着公司分格走又会产生一系列的问题,需要调整的不能一言尽言之。

    写了三四年年多的TS了,接手vue2.0的项目一个大的可视化项目,才越发觉得TS的珍贵的。

    之前java转到前端,一直对JavaScript不是不是很有好感,总觉得写java舒服些。但是有了Typescript后,java的感觉又回来的。感觉没有typescript的日子,就如生活没有甜呀。

    vue-cli不加typescript 与加上typescript的规则,代码风格还是不一样的。之前的vue项目是不加分号的,对象尾项不加逗号的。

    当然公司项目,得跟着公司分格走。这里面就会产生一系列的问题,需要调整,不能一言尽言之。

    在代码规范化方面,先回顾下这个五个概念:

    • EditorConfig不同编辑器和IDE之间定义和维护一致的代码风格;.editorconfig。可以帮助开发者在不同的编辑器和 IDE 之间定义和维护一致的代码风格。像我这种intellij老用户,是不会绝不会轻易放弃的。《intellij前端代码格式化优化设置—为Vue推荐标准需要做的修改》之前需要共享配置,现在可以通过.editorconfig规范化。目前大部分的编辑器都支持。

    • ESlint:代码检查工具; .eslintrc.js。帮助我们规范代码质量,提高团队开发效率。《Eslint静态代码检查——参数配置详细说明》,其实也没有啥好说的。

    • prettier:一个 Opinionated 的代码格式化工具; .prettierrc 。能够统一团队编码风格,极大的提高团队执行效率——统一的编码风格能很好的保证代码的可读性。《治愈代码洁癖prettier药到病除

    • husky[ˈhʌski] -狗头:一个让配置 git hooks 变得更简单的工具  .huskyrc。为了防止一些不规范的代码commit 并push到远端,我们可以在git命令执行前用一些钩子来检测并阻止。

    • lint-staged:只对 git 中变更的文件进行 lint 操作;.lintstagedrc。针对暂存的 git 文件运行 linters,杜绝不符合规则的代码溜进代码库

    这写基础性东西,这里就不再赘述了。本文默认都了解这些东西,所以,值概括下基本操作流程。

    vue-cli 添加typescript

    对于vue2的老项目,如果原来的项目是vue-cli创建的。先直接升级vue-cli4。

    然后直接原来的项目的父目录,执行 vue create 项目名称。选择合并。 

    Vue CLI v4.5.9
    ? Target directory /Users/andyzhou/www/test/vue-type-script already exists. Pick
     an action: (Use arrow keys)
    ❯ Overwrite 
      Merge 
      Cancel

    就会跳出如下图界面,选择手工选择功能项。

    vue-cli 创建新项目

    按照自己的所需,选择相关配置。最后在代码检查一步,选择ESlint+pretier

    ? Pick a linter / formatter config: 
      ESLint with error prevention only 
      ESLint + Airbnb config 
      ESLint + Standard config 
    ❯ ESLint + Prettier 
      TSLint (deprecated)

    个人推荐使用eslint

    ESLint和TSLint为什么推荐eslint

    TSLint仅针对TS代码,因此如果采用TSLint规范TS代码,JS代码需要采用其他工具。而ESLint不仅能规范js代码,通过配置解析器,也能规范TS代码。此外由于性能问题,TypeScript 官方决定全面采用ESLint

    TypeScript 有强大的 类型系统 和 对ES6+ 的支持。 在编译过程中已经可以检测出很多问题。为什么不使用呢?

    因为TypeScript 关注的是类型的匹配,而不是代码风格

    ESLint 在 TypeScript 团队发布全面采用 ESLint 之后,发布typescript-eslint 项目,以集中解决TypeScript 与 ESLint兼容性问题。而ESLint不再维护typescript-eslint-parser,也不会在npm 上做任何发布。TypeScript 解析器转移至Github 的 typescript-eslint/parser。

    webpack添加typescript

    这方面,官方文档其实写的非常清楚:https://webpack.js.org/configuration/configuration-languages/#typescript。网上的教程也特别多。所以就略过。顺手安利下 我厂的 配置库:https://github.com/AlloyTeam/eslint-config-alloy

    接入eslint 接入typescript后,且按照eslint fixed(个人推荐用IDE 格式 eslint 格式化代码)后。或者使用prettier。

    IED配置Prettier

    在代码编辑器上配置Pretier,写代码的时候,配置自动保存,自动格式化代码。就轻松了许多。

    像jetbrain系列的编辑器都有自动保存 自动格式化的功能,但是无法与elsint 配合。而prettier恰好可解决这个痛点。其他编辑器情况应该类似。

    Webstorm/intellij配置

    首先WebStorm 配置 ESLint 即时检查,这个之前已经记录过:《老项目如何使用VScode或者webstorm格式化eslint/prettier规则

    VScode 配置

    首先需要安装Eslint、Prettier、Vetur插件,看了下可以直接工作,当然,我是不使用VScode的。

    具体配置,参考同类文章:

    使用ESLint+Prettier规范React+Typescript项目    https://zhuanlan.zhihu.com/p/62401626

    Vue项目接入Eslint+Prettier+Husky格式化代码 https://zhuanlan.zhihu.com/p/159729783

    vscode + vetur + eslint + prettier 实现团队代码风格统一 https://trainspott.in/2018/12/07/vscode+vetur+eslint+prettier实现团队代码风格统一/

    Eslint和Prettier冲突了怎么办?

    • Eslint的主要功能包含代码格式的校验,代码质量的校验,JS规范,如用===而不是==判断相等、用驼峰命名变量而不是用下划线。

    • Prettier 是美丽的意思,只是代码格式的校验(并格式化代码),不会对代码质量进行校验,如单行代码长度、tab 长度、空格、逗号表达式等问题。

    在实际项目中:

    • eslint可以检测出代码问题,并标红,但是并不会自动格式化,需要手动格式化

    • Prettier可以进行自动化,配置(需要分webstorm和vscode)。

    但是需要考虑到的是,prettier和eslint的规则有可能冲突,因此需要考虑到当冲突时,需要解决冲突,得以prettier为准。

    工程优化配置

    一顿操作下来,新工程肯定没有啥问题。对于老项目,会出现一堆的error,直接歇菜。项目无法启动,哈怎么开发?

    首先eslint,把error项目,先warning,先上车再说,后面再慢慢优化,这是痛苦的过程,格式化无法解决问题,只有人肉。

    第二个,是typescript配置方面,也改为warning,特别注意的是,要兼容JavaScript,以兼容老项目!不可能一下子完全迁移到TS上来。

    {
      "defaultSeverity": "warning",
      "compilerOptions": {
          "allowJs": true,
     }
    }

    还是那句话,先让项目跑起来,再慢慢改

    第三个,原来老项目的不规范,需要处理一些全局变量和typescript的全局变量声明

    eslint:

    globals: {
        // 全局变量提取
    }

    对于TS,一些error解决

    // shims-tsx.d.ts 
    declare global {
      interface Window {
        gVue:any,
      }
    }
    //  shims-vue.d.ts
    declare module 'js-cookie'
    // 等等

    既然换上了TS,还是尽量少用any。对于值类型,尽量精准。比如之前

    const localeMessageDict: { [language: string]: 'enMessage' | 'cnMessage'  } = {
      en: 'enMessage',
      'zh-cn': 'cnMessage',
      cn: 'cnMessage',
    };
    const getRules = function (locale: 'cn'|'en'|'zh-cn'): Rules {
      const language: 'enMessage' | 'cnMessage'  = localeMessageDict[locale];
      const validatorRules: Rules = {};
      Object.keys(rules).forEach((key: string) => {
        const rule: Rule = rules[key];
        const message: string = rule[language];
        validatorRules[key] = {
          message,
          computesRequired: rule.computesRequired,
          validate: rule.validate,
        };
      });
      return validatorRules;
    };

    如果是,增加ru 、fr呢?这些,稍后再开一个专题。

    今天回家早点。不写了。文章,随意写的,看回馈在优化吧。我觉得这里面其实一路操作下来,感觉没有什么高精尖的技术。就提取几个点 扫一扫。




    转载本站文章《vue2老项目添加typescript与eslint支持(不用TSlint)》,
    请注明出处:https://www.zhoulujun.cn/html/Operation/codeGuide/8602.html