• Vite 天然支持引入 .ts 文件。
  • 只编译,不校验

    编译时做 ts 校验

  • 修改 package.json 下 scripts

    1. "scripts": {
    2. "dev": "vite",
    3. "build": "tsc --noEmit && vite build",
    4. "serve": "vite preview"
    5. },
  • 安装 typescript

    1. yarn add typescript -D
  • 添加 tsconfig.json

    1. {
    2. "compilerOptions": {
    3. "target": "esnext",
    4. "module": "esnext",
    5. "moduleResolution": "node",
    6. "strict": true,
    7. "jsx": "preserve",
    8. "importHelpers": true,
    9. "skipLibCheck": true,
    10. "esModuleInterop": true,
    11. "allowSyntheticDefaultImports": true,
    12. "suppressImplicitAnyIndexErrors": true,
    13. "sourceMap": true,
    14. "baseUrl": ".",
    15. "types": [
    16. ],
    17. "paths": {
    18. "@/*": [
    19. "src/*"
    20. ]
    21. },
    22. "lib": [
    23. "esnext",
    24. "dom",
    25. "dom.iterable",
    26. "scripthost"
    27. ]
    28. },
    29. "include": [
    30. "src/**/*.ts",
    31. "src/**/*.tsx",
    32. "src/**/*.vue",
    33. "tests/**/*.ts",
    34. "tests/**/*.tsx"
    35. ],
    36. "exclude": [
    37. "node_modules",
    38. "src/assets/json/*.json",
    39. "src/assets/css/*.scss"
    40. ]
    41. }
  • 配置好之后,打包时会校验 ts

    vue-tsc for SFC

  • 如果 .vue 文件使用 ts 需要单独安装 vue-tsc 做 ts 校验

  • 安装
    1. yarn add vue-tsc
    1. "scripts": {
    2. "dev": "vite",
    3. "build": "vue-tsc --noEmit && tsc --noEmit && vite build",
    4. "serve": "vite preview"
    5. },

    isolatedModules

    因为 vite 提供的 ts 编译,只针对语法,只是针对单文件的,而对于 typescript 是可以关联不同文件之间的信息的。vite 在编译时不会读取其他文件信息,导致有些 typescript 一些功能无法使用。所有 要配置这个选项isolatedModules,来告诉现在 ts 环境中是不支持模块间关联校验的。

在 tsconfig.json 配置

  1. "compilerOptions": {
  2. "isolatedModules": true,
  3. }
  • Exports of Non-Value ldentifiers
  • Non-Module Files
  • References to const enum members

    Exports of Non-Value ldentifiers

    ```javascript // types.ts export interface A { name: string; }

// test.ts import { A } from “./types”; export const a: A = { name: “张三”, // age: 18, };

export { A };

  1. - 报错
  2. - `Uncaught SyntaxError: The requested module '/src/types.ts' does not provide an export named 'A'`
  3. - 对于 vite 来说,编译 `test.ts` 文件的时候,会发现 `A` 并没有存在,
  4. - 因为 `A` 只是一个 ts 类型,编译为 js 之后,由于 js 里没有 interface 这个概念,导致导出的时候找不到这个 `A`,无法导出。
  5. - 如果我们只是引入使用,js 编译之后 `A` 就去掉了是可以的。
  6. 当我们开启 `"isolatedModules": true` 选项,就可以在写代码时获得报错信息,<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/243804/1636292053488-db1f72c9-1b45-45a9-8b94-2d5003c38f7c.png#clientId=u470944ad-3ea6-4&from=paste&height=223&id=uc9435f2a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=668&originWidth=1896&originalType=binary&ratio=1&size=120918&status=done&style=none&taskId=u4e6b98ed-3173-4314-a663-466d39529c5&width=632)<br />build时 也会获得对应的报错信息<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/243804/1636292091397-3f761c03-4ca1-4526-84b7-44483be0f94c.png#clientId=u470944ad-3ea6-4&from=paste&height=299&id=udb1883f0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=896&originWidth=1904&originalType=binary&ratio=1&size=168962&status=done&style=none&taskId=ua05180b5-07c7-4e5b-9dea-89ba19b1228&width=634.6666666666666)
  7. <a name="ZnxIf"></a>
  8. ## Non-Module Files
  9. 新建一个文件
  10. ```javascript
  11. // no-export.ts
  12. const a = "111";
  • 报错
    • 'no-export.ts' cannot be compiled under '-- isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module. ts( 1208)
  • 我们必须通过 import export 让此文件让 ts 认为这是一个模块

image.png

References to const enum members

  1. import { A } from "./types";
  2. declare const enum Num {
  3. First = 0,
  4. Second = 1,
  5. }
  6. export const a: A = {
  7. name: "张三",
  8. age: Num.First,
  9. };
  10. export { A };
  • 报错:
    • Uncaught ReferenceError: Num is not defined
    • Cannot access ambient const enums when the isolatedModules' flag is provided. ts(2748)
  • 在 ts 环境中,enum 定义的数据,在使用过程中会直接替换为对应的常量,
  • 在 vite 环境中,不能识别 enum 这种语法,会直接把 declare const enum Num 定义直接去掉,引用的是 Num.First 找不到 Num 变量

当我们开启 "isolatedModules": true 选项,就可以在写代码时获得报错信息,
image.png
build时 也会获得对应的报错信息
image.png

client types

ts 提供了一些内置对象,例如

  1. import.meta

我们就需要让 ts 认识这种语法,通过配置 tsconfig.json

  1. {
  2. "compilerOptions": {
  3. "types": ["vite/client"],
  4. }
  5. }

配置完之后可以获得代码提示,可以知道 vite 中有哪些可以使用的内置变量
image.png

vite 中的内置变量

  • Asset imports

    1. import pngUrl from './assets/logo.png';
  • env

  • HMR API