【Vue工程】001-Vite 创建 Vue-TypeScript 项目

【Vue工程】001-Vite 创建 Vue-Ts 项目

一、环境

# Windows 10 IoT 企业版 LTSC
D:\MyResearch\vue-admin>node -v
v18.15.0

D:\MyResearch\vue-admin>pnpm -v
8.3.1

二、创建项目

1、pnpm 创建 Vite 项目

pnpm create vite

2、设置项目名

D:\MyResearch\vue-admin>pnpm create vite
../../.pnpm-store/v3/tmp/dlx-8988        |   +1 +
Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: D:\.pnpm-store\v3
  Virtual store is at:             ../../.pnpm-store/v3/tmp/dlx-8988/node_modules/.pnpm
../../.pnpm-store/v3/tmp/dlx-8../../.pnpm-store/v3/tmp/dlx-8988        | Progress: resolved 1, reused 0, downloaded 1, added 1, doneme: » vite-project
? Project name: » my-vue-ts

3、选择vue

选择之后按回车键下一步!

# 省略...
? Select a framework: » - Use arrow-keys. Return to submit.
    Vanilla
>   Vue
    React
    Preact
    Lit
    Svelte
    Others

4、选择 TypeScript

选择之后按回车键下一步!

? Select a variant: » - Use arrow-keys. Return to submit.
>   TypeScript
    JavaScript
    Customize with create-vue ↗
    Nuxt ↗

5、创建完成

Scaffolding project in D:\MyResearch\vue-admin\my-vue-ts...

Done. Now run:

  cd my-vue-ts
  pnpm install
  pnpm run dev

6、安装与启动

D:\MyResearch\vue-admin>cd my-vue-ts

D:\MyResearch\vue-admin\my-vue-ts>pnpm install
 WARN  deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead
Packages: +47
+++++++++++++++++++++++++++++++++++++++++++++++
Packages are copied from the content-addressable store to the virtual store.
  Content-addressable store is at: D:\.pnpm-store\v3
  Virtual store is at:             node_modules/.pnpm
Downloading registry.npmmirror.com/typescript/5.0.2: 7.05 MB/7.05 MB, done
node_modules/.pnpm/esbuild@0.17.18/node_modules/esbuild: Running postinstall script, done in 241ms
Progress: resolved 69, reused 34, downloaded 13, added 47, done

dependencies:
+ vue 3.2.47

devDependencies:
+ @vitejs/plugin-vue 4.1.0
+ typescript 5.0.2 (5.0.4 is available)
+ vite 4.3.2 (4.3.3 is available)
+ vue-tsc 1.4.2 (1.6.0 is available)

Done in 22.9s

D:\MyResearch\vue-admin\my-vue-ts>pnpm run dev

> my-vue-ts@0.0.0 dev D:\MyResearch\vue-admin\my-vue-ts
> vite


  VITE v4.3.2  ready in 358 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

7、访问 http://localhost:5173/

image-20230427221350468

8、默认生成的项目结构

image-20230427221446319

9、修改 tsconfig.json

{
  "compilerOptions": {
    // 将代码编译为最新版本的 JS
    "target": "ESNext",
    // 使用 ES Module 格式打包编译后的文件
    "module": "ESNext",
    // 使用 Node 的模块解析策略
    "moduleResolution": "node",
    // 引入 ES 最新特性和 DOM 接口的类型定义
    "lib": [
      "ESNext",
      "DOM",
      "DOM.Iterable"
    ],
    // 跳过对 .d.ts 文件的类型检查
    "skipLibCheck": true,
    // 允许引入 JSON 文件
    "resolveJsonModule": true,
    // 要求所有文件都是 ES Module 模块。
    "isolatedModules": true,
    // 不输出文件,即编译后不会生成任何js文件
    "noEmit": true,
    // 保留原始的 JSX 代码,不进行编译
    "jsx": "preserve",
    // 开启所有严格的类型检查
    "strict": true,
    // 报告未使用的局部变量的错误
    "noUnusedLocals": true,
    // 报告函数中未使用参数的错误
    "noUnusedParameters": true,
    // 确保switch语句中的任何非空情况都包含
    "noFallthroughCasesInSwitch": true,
    // 允许使用 import 引入使用 export = 导出的内容
    "esModuleInterop": true,
    // 允许使用js
    "allowJs": true,
    // 查询的基础路径
    "baseUrl": ".",
    // 路径映射,配合别名使用
    "paths": {
      "@/*": [
        "src/*"
      ],
      "#/*": [
        "types/*"
      ]
    }
  },
  // 需要检测的文件
  "include": [
    "src/**/*.ts",
    "src/**/*.d.ts",
    "src/**/*.tsx",
    "src/**/*.vue"
  ],
  // 为文件进行不同配置
  "references": [
    {
      "path": "./tsconfig.node.json"
    }
  ]
}

10、修改 tsconfig.node.json

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "allowSyntheticDefaultImports": true
  },
  "include": ["vite.config.ts"]
}

11、新建 src/typings.d.ts

提示:遇到 ts 报错,有些时候是配置未生效,可以重启 vscode 或 ts 服务( vscode 快捷键 ctrl+shift+p 调出命令行,输入 Restart TS Server )

// 声明 window 上自定义属性,如事件总线
declare interface Window {
  eventBus: any;
}

// 声明 .vue 文件
declare module '*.vue' {
  import { DefineComponent } from 'vue';
  const component: DefineComponent<object, object, any>;
  export default component;
}

12、在 package.json 中新增 ts 类型检查脚本

执行:pnpm run ts 即可检查是否存在 ts 类型错误!

"ts": "vue-tsc --noEmit",

三、配置路径别名

1、安装 @types/node 依赖

yarn add @types/node -D

2、修改 vite.config.ts

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
// 这个path用到了上面安装的 @types/node
import path from "path";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  // 在这里进行配置别名
  resolve: {
    alias: {
      // @代替src
      "@": path.resolve("./src"),
      // #代替types
      "#": path.resolve("./types"),
    },
  },
});

3、ts 路径映射

参考上面, 已在修改 tsconfig.json 时通过 baseUrl 与 paths 属性完成。

	// 查询的基础路径
    "baseUrl": ".",
    // 路径映射,配合别名使用
    "paths": {
      "@/*": [
        "src/*"
      ],
      "#/*": [
        "types/*"
      ]
    }

四、其他说明

1、@types/node 依赖

概述

@types/node 是一个 TypeScript 类型声明包,它包含 Node.js 中的所有类型定义。在 TypeScript 项目中,我们需要类型声明来提供类型信息,才能获得类型检查、自动补全等功能。但是 Node.js 本身的代码是由 JavaScript 编写的,没有类型信息。所以,@types/node 这个类型声明包为所有的 Node.js API 都提供了 TypeScript 的类型定义,类似:

ts
interface Response extends http.IncomingMessage {}
function createServer(requestListener?: (req: http.IncomingMessage, res: http.ServerResponse) => void): http.Server;

这段代码为 http 模块的 requestListener 方法提供了类型定义。这样,在我们的 TS 代码中使用这个 API 时,就有了类型检查和提示。比如,我们这样使用:

ts
import * as http from 'http'

const server = http.createServer((req, res) => {
  res.end()  
})

如果写成:

ts
res.end(1)  // 错误,end() 方法不接收参数

就会报错,因为 @types/node 已经声明 end() 方法不接受参数。所以,@types/node 类型声明包为我们提供了 Node.js 全部 API 的类型定义,让我们可以在 TypeScript 项目中无障碍地使用 Node.js。它是 TypeScript + Node.js 项目中必不可少的一个依赖。总的来说,@types/node 为 TypeScript 提供了:- Node.js 所有模块 API 的类型定义
- 丰富的类型检查和自动补全功能
- 更好的代码编写体验它让我们可以快速在 TS 项目中使用 Node.js,而不必硬编码所有的类型定义,大大提高了开发效率。

安装

pnpm install @types/node --save-dev

依赖包

devDependencies:
+ @types/node 18.16.3

2、配置 moduleResolution 选项

如果 VS Code 报错:Cannot find module ‘vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option?

配置为:“moduleResolution”: “node”,

“moduleResolution” 选项有以下几种取值:

  • “node” - 以 Node.js 兼容的方式解析模块,支持 .js, .json, .node 等后缀
  • “classic” - 以传统的 TS 解析方式,只支持 .ts, .tsx, .d.ts 后缀
  • “bundler” - 以 bundler 友好的方式解析,支持 .js, .jsx, .ts, .tsx, .css, .json 等后缀
    所以,设置为 “node” 与 “bundler” 的区别在于:
    “node”:
  • 只支持 Node.js 默认支持的后缀,像 .vue 需要额外配置 alias 或 paths 选项
  • 模块只在运行时结合在一起,适合 Node.js 开发
    “bundler”:
  • 支持更多 bundler 友好的后缀,像 .vue, .css 不需要额外配置就支持
  • 编译后的模块会有更好的兼容性,适合 webpack 等 bundler 开发
    所以,如果你的项目是一个:
    Node.js 项目,推荐设置为 “node”。这样可以很好地与 Node.js 的模块解析方式兼容,但是某些 web 相关文件需要额外配置。
    Webpack 或 vue-cli 等构建工具项目,推荐设置为 “bundler”。这样可以支持更丰富的模块类型,编译后也会有更好的兼容性,直接被这些构建工具识别。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值