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日

相关文章

  • 实现横向滚动条的2种方法示例

    让我们来详细讲解“实现横向滚动条的2种方法示例”的完整攻略。在这个攻略中,我们将深入探讨如何在网页中实现横向滚动条。 1. 使用CSS属性overflow-x overflow-x属性可以用来控制元素在水平方向上是否出现滚动条,如果水平方向上的内容溢出了父容器,浏览器就会自动给该元素添加水平方向的滚动条。我们可以通过设置属性值来控制滚动条的出现。 示例代码 …

    css 2023年6月11日
    00
  • 用jQuery技术实现Tab页界面之二

    关于“用jQuery技术实现Tab页界面之二”的攻略,我可以提供如下几点: 1. 创建html结构 首先我们需要在页面中创建一个Tab容器,然后在该容器下创建若干个标签页。具体结构如下: <div class="tab-container"> <ul class="tabs"> <li c…

    css 2023年6月11日
    00
  • HTML静态页面引入公共html文件(ssi服务器端指令详解)

    HTML静态页面引入公共HTML文件属于SSI(Server-Side Include,服务器端包含)功能范畴,可以让我们在多个网页中使用相同的HTML代码,如网站的页头、页脚、导航栏等,减少代码冗余程度,提高代码的可重复性与可维护性。 以下是使用SSI引入公共HTML文件(ssi服务器端指令)的完整攻略: 1. 准备工作 在使用SSI之前,需要确保服务器已…

    css 2023年6月9日
    00
  • 强制显示、隐藏(IE\Mozilla)浏览器的滚动条实现代码

    强制显示或隐藏浏览器滚动条是网页制作中经常使用的技巧之一。下面我们就来详细讲解如何实现该功能。 方法一:使用CSS样式来控制滚动条 使用CSS样式可以对滚动条进行样式定制,并且可以通过设置overflow属性来控制是否显示滚动条。 隐藏滚动条 要隐藏滚动条,可以将body、html标签的overflow属性设置为hidden: body, html { ov…

    css 2023年6月10日
    00
  • 使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条

    使用Bootstrap实现表格隔行变色及hover变色并在需要时出现滚动条,可以通过以下几个步骤进行: 1. 引入Bootstrap和CSS文件 首先,需要在HTML文档中引入Bootstrap样式库和CSS文件,可以通过以下代码进行引入: <link rel="stylesheet" href="https://cdn.…

    css 2023年6月10日
    00
  • HTML iframe(内联框架)标签详解

    HTML中的<iframe>标签可以创建一个内联框架,用来嵌入其他网页或文档。使用<iframe>标签可以为你的网页添加更多的内容,同时还可以提供更好的用户体验和功能。本文介绍了如何使用<iframe>标签,包括其属性和代码示例。 基本语法 使用<iframe>标签需要指定被嵌入的文档的URL: <ifr…

    Web开发基础 2023年3月16日
    00
  • CSS 三栏等高布局实现方法

    CSS三栏等高布局实现方法 在Web开发中,三栏等高布局是一种常见的布局方式。本攻略将详细讲解CSS三栏等高布局的实现方法,包括基本原理、使用方法和示例说明。 1. 基本原理 CSS三栏等高布局的基本原理是通过使用CSS的float属性和clear属性来实现。具体来说,可以将三个元素分别设置为左浮动、右浮动和不浮动,并使用clear属性来清除浮动,从而实现三…

    css 2023年5月18日
    00
  • 最新百度PM告诉你SEO这六个方面的优化原则(干货)

    最新百度PM告诉你SEO这六个方面的优化原则(干货) 本文介绍了最新的百度搜索引擎优化原则,将涵盖以下六个方面的优化原则: 网站内容要有价值 关键词选择要精准 网站结构要清晰 链接质量要高 移动端适配要到位 速度优化要充分 下面将从这六个方面给出详细的优化攻略。 1. 网站内容要有价值 为了让用户有更好的体验,同时也是满足百度对内容要求的基础,网站内容需要提…

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