Vite+Vue3+TypeScript 搭建开发脚手架

news2024/11/19 6:26:36

Vite前端开发与构建工具

开发环境中,vite无需打包,可快速的冷启动

真正的按需编译,不需要等待整个应用编译完成

一个开发服务器,它基于原生ES模块 提供了丰富的内建功能,速度快模块热更新(HMR)

一套构建指令,它使用Rollup打包代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

Vue3 与 Vue2区别

Vue2 使用 Options API 而 Vue3 使用的 Composition API

TypeScript

在应用中对类型判断的定义和使用有很强的表现。同一对象的多个键返回值必须通过定义对应的接口(interface)来进行类型定义。要不然在 ESLint 时都会报错

使用Vite创建脚手架

注意:Vite 需要 Node.js 版本 >= 12.0.0

1、创建项目文件夹,例如:想在workSpace文件下创建 my-vue-app,则先进入workplace文件夹,再打开cmd,运行一下命令

 # npm 6.x
  npm init vite@latest my-vue-app --template vue

  # npm 7+, 需要额外的双横线:
  npm init vite@latest my-vue-app -- --template vue

2、选择Vue 

3、选择TypeScript

 

4、完成后可以看到项目文件夹(my-vue-app),然后根据指令,进入文件夹,安装依赖,运行项目

 完成后效果

 配置文件引用别名 alias

修改 vite.config.ts 文件配置(此时:会报错 path 未定义,接下来定义path)

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
   // 配置文件引用别名 alias
   resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
})

 定义path,修改tsconfig.json

{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true,
    "jsx": "preserve",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"],
    "skipLibCheck": true,
    "noEmit": true,
    "baseUrl": ".",
    "paths": {
      "@/*":["src/*"]  // 未设置 "baseUrl" 时,不允许使用非相对路径。是否忘记了前导 "./",所以添加一个baseUrl
    }
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

安装css处理器插件scss

npm install sass-loader sass webpack --save-dev
或yarn add sass-loader --dev

npm i dart-sass
或yarn add dart-sass --dev

npm i npm-sass
或yarn add sass --dev

 配置全局scss样式(在src/assets 下创建style 文件夹,用于存放全局样式文件,创建main.scss文件,用于测试)

$test-color: rgb(255, 0, 60);

在组件  HelloWorld.vue文件中 添加测试元素与绑定测试样式

 仅仅这样会编译报错,还需要在vite.config.ts 中增加 全局样式配置

// 全局配置  样式变量
  css:{
    preprocessorOptions:{
      scss:{
        additionalData:'@import "@/assets/style/main.scss";'
      }
    }
  },

完整配置如下图

 效果图片

 安装路由 vue-router

npm i vue-router

yarn add vue-router@4

在src 文件夹下 创建 router 文件夹 -》并新建router.ts  文件,文件内容如下

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';

const routes: RouteRecordRaw[] = [
    {
        path: '/home',
        name: 'home',
        component: () => import('@/views/Home/index.vue'), //可能问题1    注意这里要带上 文件后缀.vue
    },
    {
        path: '/',
        name: 'helloWorld',
        component: () => import('@/components/HelloWorld.vue'), //可能问题1    注意这里要带上 文件后缀.vue
    },
    {
        path: '/helloWorld',
        name: 'helloWorld',
        component: () => import('@/components/HelloWorld.vue'), //可能问题1    注意这里要带上 文件后缀.vue
    },
];


const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;

新建页面:在src 文件夹下创建 views文件夹-》创建 home 文件夹-》创建 index.vue 文件,文件内容如下

<template>
    <h1>这是 home 页</h1>

  <router-link :to="{path:'/helloWorld'}">跳转到helloWord(router-link)</router-link>
    <br/>
  <button @click="goHelloWordPage">跳转到 helloWord(js_function)</button>
</template>


<script setup lang="ts">
import {useRouter} from 'vue-router'

// 2. 调用useRouter函数
const $r = useRouter();

  const goHelloWordPage = () =>{
    $r.push("helloWorld")
  }

</script>

 在入口文件main.ts 中 配置路由

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

import router from '@/router/router'

const app = createApp(App)

app.use(router)
app.mount('#app')

//createApp(App).mount('#app')

注意:配置完成后发现 浏览器地址栏:http://127.0.0.1:5174/home  无法跳转,需要在App.vue中配置路由容器,原有的template 替换为 一下内容

<template>
    <!-- <h1>这是 主容器</h1> -->
  <router-view></router-view>

</template>

 状态管理 Pinia

 安装

npm i pinia

yarn add pinia@next

 在main.ts 中注册 pinia

// 导入组件
import { createPinia } from "pinia"  

# 创建根存储库并将其传递给应用程序
app.use(createPinia())

 

 定义状态:在src文件夹下 创建store文件夹-》创建main.ts文件,文件内容如下

import { defineStore } from 'pinia'

export const useMainStore = defineStore({
  id: 'main',
  state: () =>({
    name: '群主'
  }),
  getters: {
    nameLength: (state) => state.name.length,
  }
})

 组件中使用与修改:

<template>
<div>这是状态管理Pinia:{{ mainStore.name }}<br />长度:{{ mainStore.nameLength }}</div>
<button @click="updateName">修改 store 中的 name</button>
</template>

<script setup lang="ts">

import { useMainStore } from "@/store/main";

const mainStore = useMainStore()
const updateName = () => {
  // $patch 修改 store 中的数据
  mainStore.$patch({
    name: "名称被修改了,nameLength也随之改变了",
  });
};

</script>

例如在 home->index.vue 中使用

<template>
    <h1>这是 home 页</h1>
    <router-link :to="{path:'/helloWorld'}">跳转到helloWord(router-link)</router-link>
    <br/>
    <button @click="goHelloWordPage">跳转到 helloWord(js_function)</button>
    <br/>
    <div>这是状态管理Pinia:{{ mainStore.name }}<br />长度:{{ mainStore.nameLength }}</div>
    <button @click="updateName">修改 store 中的 name</button>
</template>


<script setup lang="ts">
import {useRouter} from 'vue-router'
import { useMainStore } from "@/store/main";

const mainStore = useMainStore()
const updateName = () => {
  // $patch 修改 store 中的数据
  mainStore.$patch({
    name: "名称被修改了,nameLength也随之改变了",
  });
};

// 2. 调用useRouter函数
const $r = useRouter();

const goHelloWordPage = () =>{
$r.push("helloWorld")
}

</script>

环境变量配置

vite提供了开发模式(development)和生产模式(product) 

项目根目录创建开发环境   .enc.dev    文件,文件内容如下

  NODE_ENV=development
  VITE_APP_WEB_URL= 'https://www.baidu.com'

项目根目录创建生产环境   .enc.prod    文件,文件内容如下 

 NODE_ENV=production
  VITE_APP_WEB_URL='https://www.goole.com'	

使用:在views->home->index.vue  中  添加

<template>
<p>当前环境:{{ env.NODE_ENV }}</p>
</template>


<script setup lang="ts">
const env = import.meta.env
</script>

 最后修改 pacakge.json  生效

"scripts": {
    "dev": "vite --mode dev",
    "dev:prod": "vite --mode prod",
    "build": "vue-tsc && vite build",
    "build:dev": "vue-tsc --noEmit && vite build --mode dev",
    "build:uat": "vue-tsc --noEmit && vite build --mode uat",
    "build:prod": "vue-tsc --noEmit && vite build --mode prod",
    "preview": "vite preview"
  },

启动项目时:

npm run dev
npm run dev:prod     
不同的启动方式,环境变量值不同 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年10个最流行Blender插件

如果你从事平面设计、动画或 3D 建模&#xff0c;您可能听说过Blender&#xff0c;这是一款开源的一体化 3D 图形软件。Blender 配备了适用于各种领域的工具和功能&#xff0c;包括 3D 动画、计算机辅助设计、纹理编辑、特殊效果等。 Blender 的最新版本3.0于 2021 年 12 月上…

LeetCode题目笔记——1566. 重复至少 K 次且长度为 M 的模式

文章目录题目描述题目难度——简单方法一&#xff1a;模拟代码/C总结题目描述 给你一个正整数数组 arr&#xff0c;请你找出一个长度为 m 且在数组中至少重复 k 次的模式。 模式 是由一个或多个值组成的子数组&#xff08;连续的子序列&#xff09;&#xff0c;连续 重复多次…

【面试】vue组件style中scoped的作用是什么?什么是scoped穿透?

vue组件style中scoped的作用是什么&#xff1f; 在Vue文件中的style标签上有一个特殊的属性——scoped。scoped属性是 HTML5 中的新属性&#xff0c;是一个布尔属性&#xff0c;如果使用该属性&#xff0c;则css样式仅仅只能应用到当前的Vue组件&#xff0c;避免组件之间样式相…

EfficientNet v1 v2

EfficientNet v1 增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失&#xff0c;训练困难的问题。增加网络的width能够获得更高细粒度的特征并且也更容易训练&#xff0c;但对于width很大而深度较浅的网络往往很…

Base64编码

介绍 Base64 编码 Base64 是一种使用 64 个可打印字符来表示二进制数据的编码方式。 Base64 中的 64 个可打印字符包括&#xff1a;大小写字母 a - z、阿拉伯数字 0 - 9&#xff0c;这样共有 62 个字符&#xff0c;另外两个可打印字符在不同的系统中而不同。RFC 4648 标准中&…

程序员可以不看书,但不可以不知道这些网站!

程序员可以不看书&#xff0c;但是不能停止学习。如果你不喜欢看书&#xff0c;这些网站可以先收藏下来&#xff01; 花了两天整理出的程序员常看的网站&#xff0c;纯纯干货来了↓↓ 一、学习网站 ①菜鸟教程 这个网站有HTML、CSS、Javascript、PHP、C、Python等各种基础编…

关于python常用软件用法:Pycharm 常用功能

一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 &#xff08;1&#xff09;.Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New>Python File2.File>New>P…

Mysql高级部分学习笔记(一)——底层及索引

0. 概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能 就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题…

使用windows电脑SSH客户端链接Iphone手机的sshd服务(免越狱)

最近有需求使用电脑导出手机中特定app的文件。 当然可以直接连上数据线将手机中的文件下载下来。 为了能做到代码自动化导出&#xff0c;将手机作为一台电脑使用&#xff0c;将手机中的文件导出来。 关键问题是如何将手机作为电脑使用&#xff0c;这里有几个步骤(我使用的是…

关于接口测试自动化的总结与思考

关于接口测试自动化的总结与思考 目录&#xff1a;导读 什么是服务端? 什么是接口? 什么是接口测试? 为什么要做接口测试? 如何做接口测试&#xff1f; 什么是接口测试自动化? 为什么要做接口测试自动化? 接口测试自动化的规范 文档准备 明确接口测试自动化需…

CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路

作者|张磊 CRI 与 ShimV2&#xff1a;一种 Kubernetes 集成容器运行时的新思路-阿里云开发者社区 Kubernetes 项目目前的重点发展方向&#xff0c;是为开发者和使用者暴露更多的接口和可扩展机制&#xff0c;将更多的用户需求下放到社区来完成。其中&#xff0c;发展最为成熟…

再探前端低代码的“野路子”

之前码过很多低代码的文章&#xff0c;发现大家口中的低代码挺不一样的&#xff0c;这次心血来潮想探探低代码的野路子。 只需要拖拽操作或者几行基础代码&#xff0c;就能完成以往需要程序员才能搭建的各类应用系统&#xff0c;对效率要求较高的企业而言&#xff0c;是不是很有…

命令执行简介、命令执行函数

数据来源 命令执行简介 01 命令执行漏洞产生原因 02 命令执行漏洞的危害 03 远程代码执行 1&#xff09;远程代码执行- eval函数 2&#xff09;远程代码执行 - assert函数 3&#xff09;远程代码执行 - preg_replace函数 使用方法和一句话木马一样 示例&#xff1a; 在ph…

9 多分类问题

文章目录问题引入网络设计改进网络方法softmax层lossMINIST引入代码实现课程内容来源&#xff1a; 链接课程文本借鉴&#xff1a; 链接以及Birandaの突然发现的也挺好&#xff1a;链接 问题引入 前篇中&#xff0c;对糖尿病数据集的问题是一个二分类问题&#xff0c;但实际问…

vue-node解决 rollbackFailedOptional: verb npm-session fd23ceb3f5797b77进度条卡住的问题

一、文章引导 #mermaid-svg-qv5tmCFBaoUwQojc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qv5tmCFBaoUwQojc .error-icon{fill:#552222;}#mermaid-svg-qv5tmCFBaoUwQojc .error-text{fill:#552222;stroke:#55222…

RabbitMQ常见场景问题

RabbitMQ常见场景问题 文章目录RabbitMQ常见场景问题6种工作模式1.直连模式2.发布订阅模式3.Routing路由模式4.Topic通配符模式5.Header模式6.RPC消息不丢失消息发送到交换机失败1.配置文件开启发布确认2.配置回调函数3.测试4.如何处理失败消息RabbitMQ服务器故障持久化消息发送…

存量房贷利率,一种简单估算其自然年利率调整的方法。

1.摘要2022年过去了&#xff0c;总所周知LPR被多次下调&#xff0c;目前有存量房贷的朋友&#xff0c;如果&#xff08;普遍&#xff09;设置的是根据自然年LPR动态调整利率&#xff0c;到2023年2月应该注意到了比较明显的房贷金额变动。这里主要给出一种根据这个变动&#xff…

Plecs电力电子仿真专业教程-第一季 第一节 Plecs简介

Plecs电力电子仿真专业教程-第一季 第一章 Plecs是什么&#xff1f; 第一节 Plecs简介 Plecs是瑞士Plexim GmbH公司开发的系统级电力电子仿真软件PLECS。PLECS是一个用于电路和控制结合的多功能仿真软件&#xff0c;尤其适用于电力电子和传动系统。不管您是工业领域中的开发…

[架构之路-96]:《软件架构设计:程序员向架构师转型必备》-6-需求与用户用例User Case/Senario建模

第6章 需求与用户用例User Case建模备注&#xff1a;严格意义上讲&#xff0c;用户用例属于需求分析领域&#xff0c;不属于架构设计。用户用例是架构设计最重要的输入参考之一。User Case和User Senario是非常重要的描述需求的重要手段6.1 常用的4种用例技术6.1.1 用例图6.1.2…

学习Java开发按此路线规划,从10K到40K全都有了,我就是这样过来的

如果有一天我醒来时&#xff0c;发现自己的几年Java开发经验被抹掉&#xff0c;重新回到了一个小白的状态。我想要重新自学Java&#xff0c;然后找到一份自己满意的Java工作&#xff0c;我想大概只需要6个月的时间就够了&#xff0c;如果顺利的话&#xff0c;4个月也差不多。如…