tech share
  • tech-share
  • Engineering
    • 登录鉴权
    • SSR 页面路由
    • npm 版本号
    • 缓存
    • 数据库容灾
    • 动态效果导出 gif
    • Chrome-devtools
    • C 端 H5 性能优化
    • Docker
    • Monorepo 最佳实践
    • 技术架构演化
    • 项目规范最佳实践
    • snowpack
    • 静态资源重试
    • 前端页面渲染分析
    • Git
    • 前端重构
    • 微前端
    • 项目依赖分析
    • 前端监控原理
    • webpack
    • BS 架构与 CS 架构
    • HTTPS
    • package-lock.json 生成逻辑
    • SVN(Subversion)
    • 数据库分类
    • gulp
    • 前端架构
    • Bundle & Bundless
    • 控制反转 IoC
  • JavaScript
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • ES6 解构赋值
    • 前端离线化
    • Proxy
    • Object.defineProperty()简介
    • TypeScript
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • PyTorch优化器
    • 隐马尔可夫模型2
    • Shapley Value 算法
    • Embarassingly Autoencoder算法
    • AutoRec算法及其后续发展
    • 深度学习常用激活函数
    • 序列预测ConvTran算法
    • 联邦学习
    • 深度学习推荐系统算法整理
    • 隐马尔可夫模型
    • 黎曼优化方法
    • FM算法
    • 机器学习常见评价指标
    • VAE算法
    • Adam优化器详解
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 图嵌入
    • 集成学习算法
    • RecBole开源框架
    • NCE-PLRec
    • 深度学习初始化方法
    • RNN循环神经网络
    • PyTorch数据处理
    • PyTorch安装和基本操作
    • XGBoost算法
    • NCF算法与简单MF的对比
    • 计算最佳传输
  • CSS
    • 什么是BFC
    • 纯CSS实现可拖动布局
    • 滚动穿透解决方案
  • React
    • React 生命周期
    • React Ref
    • React Hooks
    • SWR
    • React 数据流
    • React 函数式组件和类组件的区别
  • 可视化
    • OffscreenCanvas
    • Echarts 平滑曲线端点为什么不平滑
    • 颜色空间
    • 词云布局解析
    • 3D 数学基础
    • Canvas 图片处理
    • GLGL ES
    • WebGL 中绘制直线
    • Graphics API
    • 现代计算机图形学基础
    • Canvas 灰度
  • Vue
    • Vue2.x全局挂载整理
    • Vue2.6.x源码阅读
      • Vue2.6.x源码阅读 - 2.目录结构分析
      • Vue2.6.x源码阅读 - 4.源码阅读-platform
      • Vue2.6.x源码阅读 - 1.准备工作
      • Vue2.6.x源码阅读 - 5.源码阅读-core-Vue构造函数
      • Vue2.6.x源码阅读 - 7.源码阅读-core-响应式原理
      • Vue2.6.x源码阅读 - 3.源码阅读-shared
      • Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载
    • Vue + TypeScript Web应用实践
    • Vue2.x指令
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • Electron-Vue + Python 桌面应用实践
    • Vite
    • Vue组件通信整理
    • 记录一个问题的探索过程
  • Linux
    • memcg
  • GameDev
    • 游戏中的几种投影视图
    • 从零开始写软渲染器06
    • 从零开始写软渲染器05
    • 从零开始写软渲染器04
    • 从零开始写软渲染器03
    • 从零开始写软渲染器02
    • 从零开始写软渲染器01
    • 从零开始写软渲染器00
    • 现代游戏常用的几种寻路方案(一)
  • Node
    • NPM Dependency
    • Node 优势
    • Node Stream
    • Node 模块系统
  • HTML
    • html5语义与结构元素
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • 项目创建
  • VSCode插件添加
  • Prettier配置
  • ESLint配置
  • stylelint配置
  • Lint-staged配置
  • lint-staged tsc

这有帮助吗?

  1. Vue

Vue + TypeScript Web应用实践

上一页Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载下一页Vue2.x指令

最后更新于4年前

这有帮助吗?

项目各类代码规范作用详见小白一文

项目创建

使用@vue/cli脚手架的vue-ui创建项目。

  • 创建过程中需要注意的点:

    • 开启TypeScript,关闭class-style component syntax,开启该功能会引入vue-property-decorator依赖,在vue-ts项目中,通过使用@Component等装饰器来简化书写。习惯于使用装饰器等语法可选择使用。

    • 使用dart-sass作为CSS与处理器

    • 不使用脚手架提供的自动配置eslint,后续手工添加配置

    • 开启PWA Support

VSCode插件添加

  • Prettier、ESLint、stylelint、Vetur

Prettier配置

  • 配置.prettierrc以规范代码风格,配置内容如下。配置完成后,vscode开启配置,通过Prettier插件在保存文件时,自动完成代码格式化。

    {
      "tabWidth": 2, // 缩进空格为2,
      "useTabs": false, // 不使用Tab作为缩进
      "printWidth": 100, // 单行代码最多字符数,将vscode单屏可视部分作为最大长度即可
      "semi": true, // 使用分号
      "singleQuote": true, // 字符串单引号
      "arrowParens": "avoid", // 单入参箭头函数可不带括号
      "trailingComma": "all", // 对象属性后添加逗号
      "bracketSpacing": true, // 括号前后增加括号
      "jsxSingleQuote": true,
      "jsxBracketSameLine": false,
      "insertPragma": false,
      "ignorePath": ".prettierignore" // ignore文件对应路径
    }

ESLint配置

  • Vue部分正常配置即可,重点关注TypeScript部分的配置

    • 增加以下两个依赖

    $ yarn add -D @typescript-eslint/parser
    $ yarn add -D @typescript-eslint/eslint-plugin
    • 在.eslintrc.js中增加以下配置

      module.export = {
        // ...
        parserOptions: {
          parser: '@typescript-eslint/parser', // TypeScript parser
          ecmaVersion: 8, // ES版本
          project: ['./tsconfig.json'], // tsconfig路径
        },
        plugins: ['@typescript-eslint'], // 启用typescript-eslint插件
        extends: [
          // ...
          'plugin:@typescript-eslint/recommended',
          '@vue/typescript/recommended',
        ],
        rules: {
          // ...
          '@typescript-eslint/no-explicit-any': 'error', // 显式any类型定义报错
          '@typescript-eslint/no-unused-expressions': ['error'], // 未使用变量报错
        },
      }
    • 由于使用@vue/cli构建项目时,已开启TypeScript,直接使用脚手架创建的tsconfig.json即可,但由于项目中同样存在js文件,所以需要增加js配置,来保证typescript-eslint也能够对js文件生效。

      {
        ...
        "include": [
          "*.js", // 增加js配置
          ".eslintrc.js"
        ],
      }
    • vscode安装ESLint插件后,在右下角开启ESLint检测,运行项目后,若有ESLint运行报错,根据报错内容解决即可。若为代码格式报错,保存后即可实现代码自动规范。保存自动规范需要通过配置vscode设置文件setting.json开启。之后ESLint正常开启检测。

      {
        "editor.formatOnPaste": true,
        "editor.formatOnType": true,
        "eslint.codeAction.showDocumentation": {
            "enable": true
        },
        "editor.codeActionsOnSave": {
            "source.fixAll": true
        },
        "[javascript]": {
            "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[vue]": {
            "editor.defaultFormatter": "esbenp.prettier-vscode"
        }
      }

stylelint配置

配置stylelint实现样式代码的规范化。

  • 安装依赖

    • stylelint

      $ yarn -D stylelint stylelint-config-stylelint
    • scss插件

      $ yarn -D stylelint-scss
    • 样式规则排序

      $ yarn -D stylelint-order
  • 增加stylelint配置

    // .stylelintrc.js
    module.exports = {
      extends: 'stylelint-config-standard',
      plugins: [
        'stylelint-order',
        'stylelint-scss',
      ],
      rules: {
        'color-no-invalid-hex': true, // 禁止无效十六进制颜色
        'property-no-unknown': true, // 禁止unknown属性
        'string-no-newline': true, // 禁止字符串类属性换行
        'unit-no-unknown': true, // 禁止unknown样式单位
        'order/order': [
          'declarations',
          'custom-properties',
          'dollar-variables',
          'rules',
          'at-rules'
        ],
        'order/properties-order': [
          // 自定义样式规则顺序
        ]
      }
    }
  • 上述配置中,order/order中的顺序样例

    a {
      /* declaration */
      --width: 10px;
      /* custom-properties */
      $height: 20px;
      /* dollar-variables */
      display: none;
      /* rules */
      span {}
      /* at-rules */
      @media (min-width: 100px) {}
    }
  • stylelint至此已经能够正确生效。

Lint-staged配置

通过lint-staged在代码commit前对代码规范进行检测,防止非规范代码递交。

  • 安装husky

    $ yarn add -D husky
  • husky能够为git增加git hook,使我们可以在对应的钩子下增加我们需要的命令,lint-staged的功能就是在pre-commit这个钩子的阶段,增加对暂存区代码规范性的检测,防止不符合代码规范的代码进行递交。

  • pre-commit配置与验证,package.json增加pre-commit的git-hook

    "husky": {
      "hook": {
        "pre-commit": "echo \"git commit trigger husky pre-commit hook\" "
      }
    }
  • commit本地更新后,pre-commit成功触发

  • 安装lint-staged

    yarn add -D lint-staged
  • package.json增加lint-staged的配置用于检测ts与vue文件,并在pre-commit中增加lint-staged执行命令

    "husky": {
      "hook": {
        "pre-commit": "lint-staged "
      }
    },
  • 新增lint-staged配置文件

    // lint-staged.config.js
    module.exports = {
      'src/**/*.{ts,vue}': filenames => {
        return [
          'eslint --cache --quiet',
          'prettier --write',
          'stylelint src/**/*.{html,vue,css,sass,scss} --fix', // stylelint检测
        ];
      },
    };
  • 对lint-staged功能进行验证。设置vscode,关闭on save时的代码自动格式化,编写一行不符合格式规范的代码,这里使用不带分号的代码进行验证。

    // main.ts
    import Vue from 'vue' // 无分号
  • commit代码触发pre-commit中的lint-staged命令,代码被prettier与eslint自动格式化,原无分号的代码已经自动增加分号

    // main.ts
    import Vue from 'vue';

lint-staged tsc

在lint-staged中增加TypeScript的检测

项目规范最佳实践
husky
lint-staged