5分钟为vue-cli2构建项目添加typescript

3,488 阅读1分钟

去年我们将基于 vue-cli2 构建的项目中的 webpack3 升级到 webpack4。今年我们继续升(zhe)级(teng),添加 typescript

目前市场上大部分脚手架在生成项目时都会提示是否要安装 typescript. 比如 vue-cli3+。但还是有很多老项目或者是通过 vue-cli2 构建的项目一直在被维护中。如果你想对这些老项目重新改造、以旧换新,为其添加 typescript 支持的话,Give me five minutes Plz。

只需要以下 6 小步。

1. 安装相关依赖

$ npm install typescript ts-loader vue-property-decorator -D

typescript 必须安装,你要问能不能不安装它,哼哼~你究竟干啥来的!

ts-loader 告诉 webpack 我是 ts.

vue-property-decorator 让 vue 支持修饰器,这里也可以使用 vue-class-component. 至于用法这里不讲,想了解可以点击开发教程进行阅读.

2. 修改 webpack 配置

build 目录下找到 webpack.base.config.js 文件. 新增一个 rule 配置.

module: {
  rules: [
    ...
    {
      test: /\.tsx?$/i,
      use: [{
        loader: 'ts-loader',
        options: {
          appendTsSuffixTo: [/\.vue$/]
        }
      }],
      exclude: /node_modules/
    },
    
    ...

3. 创建 vue 声明文件

src 目录下创建一个 shims-vue.d.ts 文件,这里叫啥无所谓,但是必须要以 .d.ts 为后缀.

declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}

其作用是让TS编译器识别 vue 文件.

4. 创建 tsconfig.json

在项目根目录下创建 tsconfig.json 文件. 这个文件可以使用 tsc 命令创建.

$ tsc --init

如果提示没有 tsc,你需要在全局安装 typescript

$ npm install typescript -g

文件配置如下:

{
  "compilerOptions": {
    "strict": true,
    "module": "es2015",
    "moduleResolution": "node",
    "target": "es5",
    "allowSyntheticDefaultImports": true,
    "declaration": false,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowJs": true,
    "lib": [
      "es2017",
      "es2016",
      "dom"
    ]
  },
  "include": ["src/**/*.*"],
  "exclude": ["node_modules", "build", "dist"]
}

这里不对配置一一进行介绍,想要了解可以点击编译选项进行阅读.

5. 用 ts 替换 js 文件

4 处文件需要修改

  • src/App.vue
<script lang="ts">
import { Vue, Component } from 'vue-property-decorator'

@Component
export default class App extends Vue {
}
</script>
  • src/components/HelloWorld.vue
<script lang="ts">
import { Vue, Component } from 'vue-property-decorator'

@Component
export default class HelloWorld extends Vue {
  msg: string = 'Welcome to Your Vue.js App'
}
</script>
  • src/router/index.ts
import Vue from 'vue'
import Router, { RouteConfig } from 'vue-router'

import HelloWorld  from '@/components/HelloWorld.vue'
Vue.use(Router)
const routes: RouteConfig[] = [
  {
    path: '/',
    component:HelloWorld
  }
]
export default new Router({
  routes
})
  • src/main.ts
import Vue from 'vue'
import App from './App.vue'
import router from './router/index'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

6. 修改 entry

回到 webpack.base.config.js 配置文件,讲入口的 main.js 修改为 main.ts 即可.

module.exports = {
  entry: {
    app: './src/main.ts'
  }
  ...
}

到这里对 vue-cli2 添加 typescript 升级改造大(qing)功(er)告(yi)成(ju).

相关链接

最后相关示例和总结双手奉上.

demo示例

升级过程

typescript开发教程