Vue3 携手 TypeScript 搭建完整项目结构

一、准备工作
1. 安装 node.js(版本需大于等于 12.0.0) 和 npm(版本需大于等于 6.0.0);
2. 在终端中执行 npm install -g @vue/cli 安装 Vue CLI(版本需大于等于 4.5.0);
3. 在终端中执行 vue create my-project 创建一个 Vue 项目;
4. 在创建项目的时候,选择 Manually select features,然后选择 TypeScript、Router、Vuex、Linter / Formatter;
5. 等待项目的依赖安装完成后,在终端运行 npm run serve 启动项目。

二、Vue3 携手 TypeScript
1. 安装依赖:在终端中运行 npm install --save-dev vue@next @vue/compiler-sfc @vue/test-utils @types/node @types/vue @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-plugin-vue
2. 配置 TypeScript:在项目根目录创建 tsconfig.json 文件,并添加以下内容:

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "test/"]
}
  1. 修改 main.ts:将 import Vue from 'vue' 修改为 import { createApp } from 'vue'Vue.config.productionTip = false 修改为 app.config.productionTip = falsenew Vue({ render: h => h(App) }).$mount('#app') 修改为 app.mount('#app')
  2. 修改样式文件(.css/.less/.scss):在样式文件最顶部添加 lang="scss"(示例为 Sass);
  3. 配置 webpack:在项目根目录创建 vue.config.js 文件,并添加以下内容:
module.exports = {
    chainWebpack: config => {
        // TypeScript Loader
        config.module
            .rule('typescript')
            .test(/\.ts$/)
            .use('babel-loader')
            .loader('babel-loader')
            .end()
            .use('ts-loader')
            .loader('ts-loader')
            .end()
            .include
            .add(/src/)
            .add(/test/)
            .end();
    }
};
  1. 创建组件:在 src/components 目录下创建一个名为 HelloWorld.vue 的组件,并添加以下内容:
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'HelloWorld',
  props: {
    msg: String
  }
});
</script>

<style lang="scss">
.hello {
  h1 {
    font-size: 36px;
  }
}
</style>
  1. 修改 App.vue:在 Vue3.x 中,需要在主组件中使用 defineComponent 定义父组件。修改 src/App.vue 文件,并添加 HelloWorld 组件:
<template>
  <div id="app">
    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import HelloWorld from './components/HelloWorld.vue';

export default defineComponent({
  name: 'App',
  components: {
    HelloWorld
  }
})
</script>
  1. 验证效果:在终端中运行 npm run serve,在浏览器中查看项目是否正常运行。

三、搭建完整项目结构
1. 目录结构参考:

my-project/
├── node_modules/
├── public/
├── src/
│   ├── api/
│   │   └── index.ts            // 接口请求工具的定义
│   ├── assets/
│   │   ├── logo.png
│   │   └── ...
│   ├── components/
│   │   └── HelloWorld.vue
│   ├── router/
│   │   └── index.ts            // 路由配置
│   ├── store/
│   │   ├── index.ts            // Vuex store 的定义
│   │   ├── actions.ts
│   │   ├── mutations.ts
│   │   ├── getters.ts
│   │   └── modules/
│   ├── utils/
│   │   ├── index.ts            // 工具函数
│   │   └── ...
│   ├── views/
│   │   ├── Home.vue
│   │   └── ...
│   ├── App.vue
│   └── main.ts
├── tests/
│   ├── e2e/
│   └── unit/
├── .eslintrc.js
├── babel.config.js
├── package-lock.json
├── package.json
└── tsconfig.json
  1. 编写接口请求工具:在 src/api 目录下创建 index.ts 文件,并添加以下内容:
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';

interface RequestOptions extends AxiosRequestConfig {}

interface RequestPromise extends Promise<AxiosResponse<any>> {}

export class Http {
  private static DEFAULT_TIMEOUT = 10000;
  private $http: AxiosInstance;
  private static instance: Http;

  private constructor(config: RequestOptions) {
    this.$http = axios.create(config);
  }

  public static getInstance(config: RequestOptions): Http {
    if (!this.instance) {
      this.instance = new Http({
        timeout: Http.DEFAULT_TIMEOUT,
        ...config
      });
    }
    return this.instance;
  }

  public request(options: RequestOptions) {
    const instance = this.$http;
    return instance(options) as RequestPromise;
  }
}

export const http = Http.getInstance({
  baseURL: 'https://jsonplaceholder.typicode.com/'
});
  1. 配置路由:在 src/router 目录下创建 index.ts 文件,并添加以下内容:
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Home from '../views/Home.vue';

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
});

export default router;
  1. 创建 Vuex store:在 src/store 目录下创建 index.ts 文件,并添加以下内容:
import { createStore } from 'vuex';
import { actions } from './actions';
import { mutations } from './mutations';
import { getters } from './getters';
import { moduleA } from './modules/moduleA';

export default createStore({
  state: {
    count: 0
  },
  mutations,
  actions,
  getters,
  modules: {
    moduleA
  }
});
  1. src/main.ts 中引入路由和 Vuex:在 main.ts 文件中,引入 Router 和 Vuex :
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

const app = createApp(App);
app.use(router);
app.use(store);
app.mount('#app');
  1. 测试:在浏览器中打开 http://localhost:8080,路由和 Vuex 是否正常运行。

至此,我们就完成了将 Vue 3.x 搭建 TypeScript 环境、搭建完整项目结构的攻略。

示例说明:
1. 在接口请求工具之中,使用 class 和 interface 进行封装,并在外部调用时使用单例的模式返回实例,避免了频繁创建的问题;
2. 在模块化 Vuex store 的过程中,我们使用模块化的方式对 store 进行分层。在 moduleA.ts 文件中,我们看到除了 state、mutations、actions、getters 之外,还会有子模块 children,以此来进行更加细致和完善的 store 管理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3 携手 TypeScript 搭建完整项目结构 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript严格模式

    JavaScript严格模式是一种JavaScript的语言模式,它具有更严格的语法规则和更加安全的行为。使用严格模式可以更早地检测出代码错误,并防止一些常见的JavaScript陷阱。在本文中,我们将深入探讨JavaScript严格模式,介绍它的用法、优势和限制,并提供代码示例。 1.使用严格模式 启用JavaScript严格模式的方法很简单:只需要在代码…

    Web开发基础 2023年3月30日
    00
  • JS控制弹出悬浮窗口(一览画面)的实例代码

    这里给您详细讲解一下 JS 控制弹出悬浮窗口的实例代码的攻略。下面是具体步骤: 1. 给HTML添加悬浮窗口基本元素 首先,在 HTML 文档中添加弹出悬浮窗口的基本元素,包括触发弹出的按钮和整个弹出窗口的框架结构。代码示例如下: <button id="open-popup">点击打开弹出窗口</button> …

    css 2023年6月10日
    00
  • SpringBoot静态资源CSS等修改后再运行无效的解决

    关于“SpringBoot静态资源CSS等修改后再运行无效的解决”,一般有以下两种解决方法: 方法一:增加配置项 在SpringBoot的配置文件application.properties中,增加如下配置项: spring.resources.cache-period=-1 这样修改之后,每次请求静态资源的时候都会重新读取文件,不会使用缓存中的静态文件。缺…

    css 2023年6月9日
    00
  • javascript实例分享—具有立体效果的图片特效

    下面是关于“JavaScript实例分享—具有立体效果的图片特效”的完整攻略。 一、需求分析 在页面上呈现出一组有立体感的图片特效,使得用户能够得到更佳的使用体验和视觉效果。 二、技术方案 我们可以借助JavaScript来实现这个需求。具体实现步骤如下: 在HTML中使用<img>标签来加载需要呈现的图片 使用CSS对这些图片进行基本的样式…

    css 2023年6月11日
    00
  • 纯css实现多级折叠菜单折叠树效果

    下面是“纯CSS实现多级折叠菜单折叠树效果”的完整攻略: 什么是多级折叠菜单折叠树效果 多级折叠菜单折叠树效果是一种常用的导航菜单,它可以使页面更加结构化和易于导航。它具有如下特点: 可以展开/折叠子菜单 可以自动更改父菜单的状态 可以实现嵌套的多级菜单结构 如何实现多级折叠菜单折叠树效果 多级折叠菜单折叠树效果可以通过CSS中的checkbox和label…

    css 2023年6月9日
    00
  • electron打包中的巨坑解决记录

    下面我将详细讲解“electron打包中的巨坑解决记录”的完整攻略。 1. 问题描述 在使用Electron进行应用程序打包时,常常会遇到一些问题,如打包后程序无法运行、依赖包加载失败等。其中,最常见的问题是因为应用程序中包含了一些原生模块或第三方依赖包,导致打包后程序无法正常执行。 2. 解决方案 为了解决这些问题,我们需要使用Electron打包工具提供…

    css 2023年6月10日
    00
  • css关于position属性的用法详解(绝对定位和相对定位的混淆)

    CSS关于position属性的用法详解(绝对定位和相对定位的混淆) position属性的概述 position属性定义了元素的定位方式,其可选值有四种:static,relative,absolute和fixed。 static表示元素的默认定位方式,即元素在文档流中按照其自身的顺序排列 relative表示按照元素自身的偏移量来确定元素在文档流中的位置…

    css 2023年6月9日
    00
  • css效果之边框内圆角

    CSS效果之边框内圆角 在Web开发中,边框内圆角是一种常见的CSS效果,可以为元素的边框添加圆角效果,同时保留元素的背景色。本攻略将详细讲解如何使用CSS实现边框内圆角效果,包括基本原理、制作方法和示例说明。 1. 基本原理 边框内圆角的基本原理是使用CSS的伪元素:before和:after来模拟边框和圆角,然后使用position和z-index属性将…

    css 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部