编辑器支持

工程创建 - Vue Cli

官方推荐使用 Vue Cli 创建 Vue TypeScript 工程。推荐选择ts+eslint+prettier组合,选项配置如下:

插件选择

必选:Babel、TypeScript、Linter / Formatter

image.png

各项配置

Use class-style component syntax?

是否使用 vue-class-component 写法?选择 yes

Use Babel alongside TypeScript for auto-detected polyfills?

是否使用 Babel 做转义?选择 yes

Pick a linter / formatter config:

选择代码格式规范及格式化配置:选择 ESLint + Prettier

Pick additional lint features:

选择lint方式:选择 Lint on save ,保存时格式化

Where do you prefer placing config for Babel, PostCSS, ESLint, etc.?

选择Babel、ESLint等工具的配置存放的位置?选择 In dedicated config files ,在各自的配置文件中。

npm包推荐

  • vue-property-decorator - 使用ts+装饰器+类语法开发Vue项目的基础,它强依赖于Vue官方推出的vue-class-component库。
  • vuex-module-decorators - 本文档中使用该库来进行Vuex的TypeScript化,主要是以装饰器+模块化的方式使用Vuex,可以参考Vuex官方文档着重学习modules和模块动态注册。当然不学也行,本文档中展示的Vuex用法非常的简单易懂。

项目配置推荐

Vue工程配置 - vue.config.js

这一步主要是为了适配 vuex-module-decorators 模块的配置。

  1. // vue.config.js
  2. module.exports = {
  3. // ... your other options
  4. transpileDependencies: ['vuex-module-decorators'],
  5. }

TypeScript编译选项 - tsconfig.json

  1. {
  2. "compilerOptions": {
  3. // 指定编译之后的版本目录
  4. "target": "esnext",
  5. // 指定要使用的模板标准
  6. "module": "esnext",
  7. // 用于指定是否启动所有类型检查
  8. "strict": true,
  9. // 设置解析非相对模块名称的基本目录
  10. "baseUrl": ".",
  11. // allowJs用来指定是否允许编译JS文件,默认false,即不编译JS文件
  12. "allowJs": true,
  13. // 指定jsx代码用于的开发环境:'preserve','react-native',or 'react
  14. "jsx": "preserve",
  15. // 指定是否引入tslib里的复制工具函数
  16. "importHelpers": true,
  17. // 模块解析策略,有"node""classic"两种类型
  18. "moduleResolution": "node",
  19. // 是否启用实验性的装饰器特性
  20. "experimentalDecorators": true,
  21. // 是否跳过所有声明文件的类型检查
  22. "skipLibCheck": false,
  23. // 通过导入内容创建命名空间,实现CommonJSES模块之间的互操作性
  24. "esModuleInterop": true,
  25. // 允许从没有默认导出的模块中默认导入
  26. "allowSyntheticDefaultImports": true,
  27. // 检测是否在函数中没有使用的参数
  28. "noUnusedParameters": true,
  29. // socuceMap用来指定编译时是否生成.map文件
  30. "sourceMap": true,
  31. // 指定需要包含的模块,只有在这里列出的模块的声明文件才会被加载
  32. "types": ["webpack-env"],
  33. // 设置模块名到基于baseUrl的路径映射,可以设置路径别名的语法提示
  34. "paths": {
  35. "@/*": ["src/*"]
  36. },
  37. // lib用于指定要包含在编译中的库文件
  38. "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
  39. },
  40. // 指定待编译的文件
  41. "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
  42. // 指定不编译的文件
  43. "exclude": ["node_modules"]
  44. }

代码编译 - babel.config.js

  1. module.exports = {
  2. presets: ["@vue/cli-plugin-babel/preset"]
  3. };

代码检查 - .eslintrc.js

  1. module.exports = {
  2. // 预置规则,推荐使用vue提供的规则
  3. extends: ['plugin:vue/recommended', '@vue/typescript/recommended'],
  4. // 使用typescript解析器
  5. parserOptions: {
  6. parser: '@typescript-eslint/parser',
  7. ecmaVersion: 2020,
  8. sourceType: 'module',
  9. },
  10. plugins: ['@typescript-eslint'],
  11. rules: {
  12. // override/add rules settings here, such as:
  13. // 是否禁止非空断言
  14. '@typescript-eslint/no-non-null-assertion': ['off'],
  15. // 是否禁止非必要且多余的类型声明
  16. '@typescript-eslint/no-inferrable-types': ['off'],
  17. // 是否禁止require()
  18. '@typescript-eslint/no-var-requires': ['off'],
  19. // interface声明每行是否必须加分号
  20. '@typescript-eslint/member-delimiter-style': ['off'],
  21. // 是否禁止any类型
  22. '@typescript-eslint/no-explicit-any': ['warn'],
  23. // 是否禁止空函数出现
  24. '@typescript-eslint/no-empty-function': ['warn'],
  25. // 是否禁止this赋值别名,仅允许 解构赋值 和 变量名self
  26. '@typescript-eslint/no-this-alias': [
  27. 'error',
  28. {
  29. allowDestructuring: true, // Allow `const { props, state } = this`; false by default
  30. allowedNames: ['self', 'that'], // Allow `const self = this`; `const that = this`; `[]` by default
  31. },
  32. ],
  33. },
  34. }

代码格式化配置 - .prettierrc.js

  1. module.exports = {
  2. printWidth: 100, // 超过最大值换行
  3. tabWidth: 2, // 缩进字节数
  4. useTabs: false, // 缩进不使用tab,使用空格
  5. semi: false, // 句尾添加分号
  6. singleQuote: true, // 使用单引号代替双引号
  7. arrowParens: 'avoid', // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号
  8. bracketSpacing: true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }"
  9. disableLanguages: ['vue'], // 不格式化vue文件,vue文件的格式化单独设置
  10. endOfLine: 'auto', // 结尾是 \n \r \n\r auto
  11. trailingComma: 'es5', // 多行时尽可能打印尾随逗号<none|es5|all>
  12. jsxBracketSameLine: true,
  13. htmlWhitespaceSensitivity: 'css', // 指定HTML文件的全局空格敏感度 <css|strict|ignore>
  14. }

编辑器(VS Code)配置 - .vscode/setting.json

  1. {
  2. "[vue]": {
  3. "editor.defaultFormatter": "octref.vetur"
  4. },
  5. "vetur.validation.template": false,
  6. "vetur.format.defaultFormatter.html": "js-beautify-html",
  7. "vetur.format.options.tabSize": 2,
  8. "vetur.format.defaultFormatterOptions": {
  9. "js-beautify-html": {
  10. // 属性强制折行对齐
  11. "wrap_attributes": "force-expand-multiline"
  12. },
  13. // .vue prettier配置
  14. "prettier": {
  15. "printWidth": 100, // 超过最大值换行
  16. "tabWidth": 2, // 缩进字节数
  17. "useTabs": false, // 缩进不使用tab,使用空格
  18. "semi": false, // 句尾添加分号
  19. "singleQuote": true, // 使用单引号代替双引号
  20. "arrowParens": "avoid", // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号
  21. "bracketSpacing": true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }"
  22. "endOfLine": "auto", // 结尾是 \n \r \n\r auto
  23. "trailingComma": "es5", // 多行时尽可能打印尾随逗号<none|es5|all>
  24. "jsxBracketSameLine": true,
  25. "htmlWhitespaceSensitivity": "css", // 指定HTML文件的全局空格敏感度 <css|strict|ignore>
  26. }
  27. },
  28. }

项目结构

  1. ├── .vscode
  2. └── setting.json # 编辑器设置配置文件,也可以直接配置在个人编辑器中
  3. ├── public
  4. ├── src
  5. ├── api # 接口api
  6. ├── assets # 图片、样式等
  7. ├── components # Vue 组件
  8. ├── constant # 常量文件夹
  9. ├── mock # mock数据
  10. ├── router # Vue Router
  11. ├── store # Vuex
  12. ├── typings # 全局声明文件夹
  13. ├── shims-tsx.d.ts # Vue 支持jsx写法的声明
  14. └── shims-vue.d.ts # Vue 支持.vue文件类型检查的声明
  15. ├── utils # 工具函数
  16. ├── views # Vue 视图
  17. ├── App.vue # Vue 主入口视图
  18. └── main.ts # Vue 主入口文件
  19. ├── .browserslistrc
  20. ├── .eslintrc # ESLint 配置文件
  21. ├── .prettierrc.js # prettier 格式化配置文件
  22. ├── babel.config.js # Babel 配置文件
  23. ├── package.json
  24. ├── tsconfig.json # TypeScript 编译配置
  25. └── vue.config.js # Vue 工程配置