2022-04-14使用ts重构vue2项目

一、改动点

1. 安装依赖
  • 如果不使用基于类的组件(使用基本组件)略过这步
    vue-class-component :官方维护的装饰器
    vue-property-decorator :基于vue-class-component的装饰器,社区维护
    npm install --save vue-class-component vue-property-decorator 
    
  • 必须安装
    npm install --save-dev ts-loader typescript
    
  • 其他(eslint相关)
    @typescript-eslint/eslint-plugin
    @typescript-eslint/parser
2. 修改webpack配置(vue.config.js)
configureWebpack: (config) => {
  config.resolve.extensions.push('.ts');   // 添加ts扩展文件:引用ts文件的时候不用写后缀名
  config.module.rules.push({             // 使用ts-loader对ts/tsx文件打包编译
    test: /\.tsx?$/,
    loader: 'ts-loader',
    exclude: /node_modules/,
    options: {
      appendTsSuffixTo: [/\.vue$/],    // ts编译器tsc不能识别.vue文件,所以在 .vue文件后加.ts后缀
    },
  });
}
3. 根目录下新建tsconfig.json文件(或者使用tsc --init自动生成)
  • compilerOptions用于确定如何编译ts文件

  • 使用官方/默认配置即可。

  • 自定义配置参考:

     "compilerOptions": {
       "target": "es5",  // 指定ECMAScript目标版本
       "module": "commonjs",  // 指定生成哪个模块系统代码
       "allowJs": true,   // 允许编译js文件
       "sourceMap": true, // 是否生成map文件
       "strict": true, // 启用所有严格类型检查选项
       "noUnusedLocals": true,
       "baseUrl": ".",   // 工作根目录
       "paths": {          // 和webpack中resolve.alias配置一样
           "@/*": [
             "src/*"     
           ]
        }, 
       "esModuleInterop": true, // 支持使用esm的方式引入commonjs包
       "experimentalDecorators": true, // 启用试验性的es装饰器(如果要使用装饰器的话)
       "skipLibCheck": true, // 忽略所有的声明文件的类型检查。
       "forceConsistentCasingInFileNames": true. // 禁止对同一个文件的不一致的引用(将强制区分大小写)。
     }
    
    1. \color{red}{*}path路径查找注释minimatch,用来模式匹配字符串的库。
    • *匹配 0 个或多个字符,不包含目录分隔符
    • **/递归匹配任意子目录
    1. esModuleInterop作用解析
    2. compilerOptions编译选项
4. 修改.eslintrc.js文件:详见(二、重构问题/踩坑-Q2)
5. src根目录下创建声明文件支持引入.vue文件(必须)
// shims-vue.d.ts
//通配符声明模块
declare module '*.vue' {
    import Vue from 'vue';  // import写里面,不要写外面(原因待补充)
    export default Vue;
}
6. 支持this访问vue原型上定义的功能(非必须)
// type.d.ts
import { default as Axios } from '@/plugins/axios.js'
declare module 'vue/types/vue'{
    interface Vue {
        $axios: Axios;
    }
}

二、重构问题/踩坑

Q1:import Vue from 'vue' => Cannot find module ‘vue’.
原因
解决:tsconfig.json配置

"target": "es5",             
"module": "es6", 

修改为

"target": "es5",             
"module": "commonjs", 

Q2:.vue文件使用ts语法eslint报错
解决:修改.eslintrc文件(目前只针对特定重构目录使用ts解析,后面有更合适的配置会修改)
待解决:怎么对不同目录下的文件分别使用不同的配置。\color{red}{已解决}

  • (解决方式:在子目录下配置自己的eslintrc文件。层叠配置使用离要检测的文件最近的 .eslintrc文件作为最高优先级,然后才是父目录里的配置文件。配置冲突时,子目录配置会覆盖根目录配置)eslint-Configuration Cascading and Hierarchy
 overrides: [{
    files: [
      '**/financial_manage/**/*.ts',
      '**/financial_manage/**/*.tsx',
      '**/financial_manage/**/*.vue',
    ],
    plugins: ['@typescript-eslint'],
    parserOptions: {
      parser: '@typescript-eslint/parser',
    },
  }],

Q3:使用this访问定义在vue原型上的功能
解决:在type.d.ts文件进行模块补充(在shims-vue.d.ts声明会使之前对.vue的声明、自定义模块的声明等全部失效。)。重点是模块补充和其他的分开两个文件写,也可以在shims-vue.d.ts中声明原型上的方法属性,在type.d.ts.vue声明ts识别处理vue文件。声明文件名遵循xxx.d.ts就可以。
原因:暂时不知道(待补充)
Q4:ts文件引入js报错
解决:

  1. 方法一:tsconfig.json设置allowJs:true
  2. 方法二:声明文件中声明模块
  3. 方法三:使用require导入

三、tsconfig.json文件配置项

1. target、module、lib
  • ES版本:ES6 == ES2015 ES7 == ES2016 ES8 == ES2017 ESNext(泛指) == es最新版本的下一版本
  • target:指定ECMAScript目标版本
    默认值:ES3
    选值:"ES5", "ES6"/ "ES2015", "ES2016", "ES2017"或 "ESNext"
  • module: 指定生成哪个模块系统代码
    默认值:target === "ES6" ? "ES6" : "commonjs"
    选值:"None", "CommonJS", "AMD", "System", "UMD", "ES6"或 "ES2015"
  • lib:编译过程中需要引入的标准库文件的列表
    默认值: - target ES5:DOM,ES5,ScriptHost
    - target ES6:DOM,ES6,DOM.Iterable,ScriptHos
  • types:要包含的类型声明文件名列表
    默认:所有可见的"@types"包会在编译过程中被包含进来;如果指定了types,只有被列出来的包才会被包含进来
    \color{red}{*}所以不清楚所有node_modules/@types中全局声明文件意义的时候,尽量不要单独设置types,可能会产生一些例如es语法无法匹配到标准库的bug
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容