Vite+Vue+ts 新建项目及简单示例

创建

pnpm create vite project-name --template vue-ts
project-name为新建项目的名称

配置

一、配置开发环境

1、创建新文件 .env.pro 与.env.dev
.env.pro(正式环境)文件中配置

VITE_BASE_API='http://url:9002/demo/'

.env.dev(开发环境)文件中配置

VITE_BASE_API='http://localhost:9002/demo/'

2、在pakage.json文件中补全script属性如下所示(可直接覆盖原有script属性)

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

二、修改运行地址为localhost

将vite.config.ts文件中defineConfig修改成如下所示

export default defineConfig({
  base:'./',  //设置打包的文件路径为相对路径
  plugins: [vue()],
  server: {
    host: '0.0.0.0', //ip地址
    port: 8080, //端口号
    open: true //启动后是否自动打开浏览器
  }
})

三、配置后端接口

在/src下创建/api/index.ts,存放后端接口
控制台pnpm install axios

import axios from "axios"

const baseUrl=import.meta.env.VITE_BASE_API 

export async function queryList(factory:string):Promise<any[]> {
    try {
        const res = await axios.get(baseUrl+ 'queryList?factory='+factory);
        return res.data.data;
    } catch (error) {
        // 处理错误
        console.error("Error fetching factory list:", error);
        throw error;
    }
}

四、管理前端通用接口

在/src下创建/utils/index.ts,存放前端接口
一些通用前端代码

const util = {
    //获取time的年月日并以yyyy-MM-dd的日期格式输出
    // getDate: (time: Date): string => {
    //     return time.toLocaleDateString().replace(/\//g, '-');
    // },

    //获取time的年月日并以yyyy年MM月dd日的日期格式输出
    getDate: (time: Date): string => {
        const year = util.getYear(time);
        const month = util.getMonth(time);
        const day = util.getDay(time);
        return `${year}${month}${day}`
    },

    //获取time的时分秒并以HH:mm:ss的时间格式输出
    getTime: (time: Date): string => {
        const h = util.getHours(time);
        const m = util.getMinutes(time);
        const s = util.getSeconds(time);
        return `${h}:${m}:${s}`;
    },

    //根据日期获取对应的week
    getWeek: (time: Date): string => {
        const week = time.getDay();
        const weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
        return weeks[week];
    },

    getYear: (time: Date): number => {
        const year = time.getFullYear();
        return year;
    },

    getMonth: (time: Date): string => {
        let month = time.getMonth() + 1;
        return (month < 10 ? "0" : "") + month;
    },

    getDay: (time: Date): string => {
        let day = time.getDate();
        return (day < 10 ? "0" : "") + day;
    },

    getHours: (time: Date): string => {
        let h = time.getHours();
        return (h < 10 ? "0" : "") + h;
    },

    getMinutes: (time: Date): string => {
        let m = time.getMinutes();
        return (m < 10 ? "0" : "") + m;
    },

    getSeconds: (time: Date): string => {
        let s = time.getSeconds();
        return (s < 10 ? "0" : "") + s;
    },
    
    //输入百分比得到其对应宽度
    setPercentWidth :(percent:number):number => {
        let clientWidth = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
        if (!clientWidth) return 0;
        const decimalPercentage = percent / 100;
        const width = clientWidth * decimalPercentage;
        return width;
    },
};

export default util;

五、静态资源引入

将图片直接放在pulic中打包时会一起打包。
引入 public 中的资源永远应该使用根绝对路径- 举个例子, public/icon.png 应该在源码中被引用为 /icon.png。
public 中的资源不应该被 JavaScript 文件引用

六、组件引入

创建组件TestComponent.vue并将其引入组件App.vue中

<script setup lang="ts">
import TestComponentfrom './components/TestComponent.vue'
</script>

<template>
  <TestComponentfrom />
</template>

<style scoped>
</style>

七、编写组件(实现一个表格轮播图并且实时更新页面时间值)

轮播图使用DataV组件dv-scroll-board,参考文章https://datav-vue3.netlify.app/Guide/Guide.html
控制台安装:pnpm install @kjgl77/datav-vue3

<script setup lang="ts">
  import {ScrollBoard} from '@kjgl77/datav-vue3'  //引入data-v中轮播表组件
  import util from '../utils';  //引入前端通用接口
  import { onMounted,ref,onUnmounted,reactive } from 'vue';
  import { queryList} from '../api';  //引入后端接口
  
  const time=ref('');
  const date=ref('');
  const timer=ref<number | null>(null);;

  const setDate=()=>{
    time.value=util.getTime(new Date);
    date.value=util.getDate(new Date);
  }
  //const data=ref([]);	//用于接收后端接口返回的数据
  const data=[
  ["test1","1","1","1","11","1","1"],
  ["test2","1","1","1","11","1","1"],
  ["test3","1","1","1","11","1","1"],
  ["test4","1","1","1","11","1","1"],
  ["test5","1","1","1","11","1","1"],
  ["test6","1","1","1","11","1","1"],
  ["test7","1","1","1","11","1","1"],
  ["test8","1","1","1","11","1","1"],
  ["test9","1","1","1","11","1","1"],
]
//用于给scroll-board提供配置数据
  const config = reactive({
  	  //定义表头
      header: ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7'],
      //定义每一列的宽度
      columnWidth: [util.setPercentWidth(6), util.setPercentWidth(13), util.setPercentWidth(13), util.setPercentWidth(13), util.setPercentWidth(13), util.setPercentWidth(13), util.setPercentWidth(13), util.setPercentWidth(13)],
      data: data,
      //表头颜色
      headerBGC: 'rgba(255,255,255,0.2)',
      //基数行颜色
      oddRowBGC: 'rgba(9,37,50,0.4)',
      //偶数行颜色
      evenRowBGC: 'rgba(10,32,50,0.3)',
      //是否添加序号
      index: true,
      //一个可见轮播表展示多少条数据
      rowNum: 6,
      //设置每一列文本放置位置
      align:['center','center','center','center','center','center','center','center'],
      //设置表头高度
      headerHeight: 40
  })

	//通过后端接口返回数据并用data接收
    // const queryList= async (factory:string) => {
    //     try {
    //         let res: any = await queryList(factory);
    //         data.value = res;
    //     } catch (error) {
    //         console.error(error);
    //     }
    // }
    

    onMounted(()=>{
      setDate();
      timer.value=setInterval(()=>{
        setDate()
      },1000);
     	//调用接口
      // queryList('1230')
  })

  onUnmounted(() => {
  	  //关闭定时任务
      if(null!=timer.value){
        clearInterval(timer.value);
      }
    });
</script>

<template>
   <div class="timeDate">
     <span>{{ date }}</span>
     <span>{{ time }}</span>
   </div>
   <div class="main-content">
    <scroll-board class="scroll-board" :config="config"/>
   </div>
</template>

<style scoped>
.main-content{
  position: relative;
  width:50%;
  height: 80vh;
}
:deep(.scroll-board  .rows .row-item){
  font-size: 40px;
}
:deep(.scroll-board .header .header-item){
  font-size: 40px;
}
</style>

### 创建 Vue 3 项目并集成 Vite 和 TypeScript 为了设置一个包含 Vite、TypeScript 和 Vue 3 的新项目,可以遵循以下方法: #### 安装 Node.js 和 npm 确保本地环境已安装最新版本的 Node.js 及其包管理工具 npm。 #### 初始化项目结构 使用终端执行命令来创建新的工作目录,并初始化基础配置文件 `package.json`: ```bash mkdir my-vue-app && cd $_ npm init --yes ``` #### 添加 Vite 构建工具支持 利用 npm 来安装 Vite CLI 工具作为全局依赖项以便后续操作更加便捷;对于特定项目的开发,则推荐将其设为局部 devDependencies 类型的依赖项之一: ```bash npm install vite @vitejs/plugin-vue vue-tsc --save-dev ``` 这里引入了三个主要组件: - **Vite**: 提供快速冷启动性能以及按需编译等功能; - **@vitejs/plugin-vue**: 支持 .vue 单文件组件解析; - **vue-tsc**: 增强版 tsc 编译器插件用于更好地兼容 Vue 特性[^1]。 #### 更新 package.json 脚本字段 编辑生成后的 `package.json` 文件,在 scripts 字段下新增如下条目以定义常用的任务指令集: ```json { "scripts": { "dev": "vite", "build": "vite build", "serve": "vite preview" } } ``` 这些脚本允许开发者轻松地启动开发服务器 (`npm run dev`) 或者打包生产资源 (`npm run build`) 并预览最终效果(`npm run serve`)。 #### 设置 tsconfig.json 配置文件 在根路径下新建名为 `tsconfig.json` 的 JSON 文档,用来声明 TypeScript 编译参数。针对 Vue 应用场景建议至少包含以下几个关键属性: ```json { "compilerOptions": { "target": "ESNext", "module": "ESNext", "strict": true, "jsx": "preserve", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "useDefineForClassFields": true, "baseUrl": ".", "paths": { "@/*": [ "src/*" ] }, "types": ["vite/client"] }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], "exclude": ["node_modules"] } ``` 此配置启用了严格模式和其他最佳实践选项,同时也指定了源码查找范围和别名映射规则[@/* -> src/*][^1]。 #### 准备 main.ts 主入口文件 于 `/src` 下建立 `main.ts` ,这是整个应用程序逻辑起点的地方。在此处导入必要的模块和服务端渲染辅助函数等: ```typescript import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app') ``` 上述代码片段展示了如何实例化一个新的 Vue 实例并将它挂载到页面上的 DOM 元素上。 #### 开发第一个单文件组件 (SFC) 同样位于 `/src/components/HelloWorld.vue` 内编写简单的 SFC 结构,这有助于理解 HTML/CSS/JSX 如何共存于一体化的 `.vue` 文件之中: ```html <template> <div class="hello"> {{ msg }} </div> </template> <script lang="ts"> export default defineComponent({ name: 'HelloWorld', props: { msg: String } }) </script> <style scoped> .hello { color: red; } </style> ``` 这段示例中的 `<script>` 标签特别之处在于设置了 `lang="ts"` 属性指示内部采用的是 TypeScript 语法而非普通的 JavaScript 表达方式。 #### 启动应用测试成果 完成以上准备工作之后就可以尝试运行一次完整的构建流程看看是否一切正常啦! ```bash npm run dev ``` 如果顺利的话应该可以在浏览器里看到预期的结果界面了!此时便成功搭建起了基于 Vite + Vue 3 + TS 技术栈的新一代前端工程框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值