一、文章引导

#mermaid-svg-1aHB08JglRY7yGzA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1aHB08JglRY7yGzA .error-icon{fill:#552222;}#mermaid-svg-1aHB08JglRY7yGzA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1aHB08JglRY7yGzA .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-1aHB08JglRY7yGzA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1aHB08JglRY7yGzA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1aHB08JglRY7yGzA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1aHB08JglRY7yGzA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1aHB08JglRY7yGzA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1aHB08JglRY7yGzA .marker.cross{stroke:#333333;}#mermaid-svg-1aHB08JglRY7yGzA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1aHB08JglRY7yGzA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1aHB08JglRY7yGzA .cluster-label text{fill:#333;}#mermaid-svg-1aHB08JglRY7yGzA .cluster-label span{color:#333;}#mermaid-svg-1aHB08JglRY7yGzA .label text,#mermaid-svg-1aHB08JglRY7yGzA span{fill:#333;color:#333;}#mermaid-svg-1aHB08JglRY7yGzA .node rect,#mermaid-svg-1aHB08JglRY7yGzA .node circle,#mermaid-svg-1aHB08JglRY7yGzA .node ellipse,#mermaid-svg-1aHB08JglRY7yGzA .node polygon,#mermaid-svg-1aHB08JglRY7yGzA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1aHB08JglRY7yGzA .node .label{text-align:center;}#mermaid-svg-1aHB08JglRY7yGzA .node.clickable{cursor:pointer;}#mermaid-svg-1aHB08JglRY7yGzA .arrowheadPath{fill:#333333;}#mermaid-svg-1aHB08JglRY7yGzA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1aHB08JglRY7yGzA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1aHB08JglRY7yGzA .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-1aHB08JglRY7yGzA .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-1aHB08JglRY7yGzA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1aHB08JglRY7yGzA .cluster text{fill:#333;}#mermaid-svg-1aHB08JglRY7yGzA .cluster span{color:#333;}#mermaid-svg-1aHB08JglRY7yGzA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1aHB08JglRY7yGzA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

前端vue3+typescript搭建vite项目

屏幕适配

默认清除配置

vite.config.ts配置

项目配置完善

创建项目

二、博主简介

博客首页: 水香木鱼 专栏收录:后台管理系统【vue2+vue3+vite+ts】 文章摘要:vue3 vite typescript 适配 vite.config.ts 木鱼寄语:故木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。

三、文章内容

兼容性注意 Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

(一)、创建项目

①、创建方式

使用npm:

npm create vite@latest

使用Yarn:

yarn create vite

使用 PNPM:

pnpm create vite

②、创建项目vite-project

如下注意项:按↑ ↓ 方向键、回车键 进行选择确认操作。【根据项目需求,选择对应的签到框架即可】

默认项目名,回车键即可。

③、选择前端框架

本篇文章以vue为例子

④、选择业务语言

逻辑处理语言:javascript 、typescript【本篇文章以typescript为例】

根据需求选择合适的业务处理语言,回车键 确认选择 

⑤、项目创建完成

⑥、进入项目文件夹

cd vite-project

⑦、下载依赖

npm install

⑧、启动项目

npm run dev

⑨、浏览器预览项目

(二)、项目配置完善

①、增加目录

api 接口配置目录layout 项目结构-布局文件夹router 路由-文件夹store 存放vuex-文件夹styles 全局样式-文件夹utils 全局工具函数-文件夹views 放置页面-文件夹

②、创建router目录前,需要下载路由依赖

使用npm:

npm install vue-router@4

使用Yarn:

yarn add vue-router@4

创建router index.ts 文件

//index.ts

import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";

const routes: RouteRecordRaw[] = [

{

path: "/",

name: "Home",

component: () => import("../views/home.vue"),

},

];

const router = createRouter({

history: createWebHashHistory(), // 哈希模式

routes,

});

export default router;

路由有两种模式: 

createWebHashHistory 哈希模式createWebHistory 历史模式

③、创建store目录前,需要下载路由依赖

npm install vuex@next --save

创建store index.ts 文件

//index.ts

import { createStore } from "vuex";

import state from "./state";

import mutations from "./mutations";

import actions from "./actions";

const store = createStore({

state,

mutations,

actions,

modules: {},

});

export default store;

创建state.ts、actions.ts、mutations.ts 文件

//state.ts

const state= {};

export default state;

//actions.ts

const actions= {};

export default actions;

//mutations.ts

const mutations= {};

export default mutations;

④、安装样式编译器

使用less:

npm install less less-loader -D

使用sass:

npm install sass node-sass sass-loader -D

使用scss:

npm install scss node-scss scss-loader -D

安装好之后在标签上面直接就可以用

⑤、main.ts

//main.ts

import { createApp } from "vue";

import App from "./App.vue";

import router from "./router";//配置路由

import store from "./store";//配置vuex

const app = createApp(App);

app.use(router).use(store).mount("#app");

(三)、vite.config.ts配置

vite.config.ts完整代码,在

①、如何让vite项目启动时自动打开浏览器?

server:{

open:true, //项目启动时自动打开浏览器

},

②、vite启动默认端口为8080?如何更改默认端口?

server:{

port:8080, //自定义端口

},

③、vite如何设置热加载?

server:{

hmr:true, //开启热加载

},

④、vite中如何配置别名路径?

import { resolve } from 'path';

export default ({mode})=>{

return defineConfig({

resolve:{

alias:{

"@":resolve(__dirname,"src"),

"@c":resolve(__dirname,"src/components"),

}

},

}

}

⑤、vite中如何设置便捷图片路径引用?

resolve:{

alias:{

"/images":"src/assets/images/"//这里不能通过path模块解析路径的写法

}

},

⑥、vite打包配置

build: {

target: "modules", //设置最终构建的浏览器兼容目标 //es2015(编译成es5) | modules

outDir: "dist", // 构建得包名 默认:dist

assetsDir: "assets", // 静态资源得存放路径文件名 assets

sourcemap: false, //构建后是否生成 source map 文件

minify: "esbuild", // 项目压缩 :boolean | 'terser' | 'esbuild'

chunkSizeWarningLimit: 1000, //chunk 大小警告的限制(以 kbs 为单位)默认:500

cssTarget: "chrome61", //防止 vite 将 rgba() 颜色转化为 #RGBA 十六进制符号的形式 (要兼容的场景是安卓微信中的 webview 时,它不支持 CSS 中的 #RGBA 十六进制颜色符号)

},

⑦、vite如何设置开启生产打包分析文件大小功能?类似webpack-bundle-analyzer? 安装依赖:

npm i rollup-plugin-visualizer --save

设置状态为true 生效,不分析时,可自行关闭。

plugins: [

visualizer({

open: false, //注意这里要设置为true,否则无效

gzipSize: false,

brotliSize: false,

}),

], // 注册插件

⑧、vite全局样式配置

// 样式全局配置

css: {

// 全局变量+全局引入less+配置主题色

preprocessorOptions: {

less: {

javascriptEnabled: true,

// 全局变量使用:@primary-color

modifyVars: {

"primary-color": "#1890ff", // 全局主色

"link-color": " #1890ff", // 链接色

"success-color": " #52c41a", // 成功色

"warning-color": " #faad14", // 警告色

"error-color": " #ff4d4f", // 错误色

"font-size-base": " 14px", // 主字号

/*light浅色背景下*/

"light-headline": "#262626", // 标题色

"light-text": "#595959", // 主要文字

"light-text-secondary": "#8c8c8c", // 次要文字

"light-disabled": "#bfbfbf", // 禁用

"light-border": " #d9d9d9", // 边框色

"light-cut-off-rule": " #f0f0f0", // 分割线

"light-bg": " #f5f5f5", // 背景

"light-table-headline": " #fafafa", // 表格标题

/*dark深色背景下*/

"dark-headline": "#262626", // 标题色

"dark-text": "#595959", // 主要文字

"dark-text-secondary": "#8c8c8c", // 次要文字

"dark-disabled": "#bfbfbf", // 禁用

"dark-border": " #d9d9d9", // 边框色

"dark-cut-off-rule": " #f0f0f0", // 分割线

"dark-bg": " #f5f5f5", // 背景

"dark-table-headline": " #fafafa", // 表格标题

/*边框配置*/

"border-radius-base": " 2px", // 组件/浮层圆角

"box-shadow-base": " 0 2px 8px rgba(0, 0, 0, 0.15)", // 浮层阴影

},

},

},

},

⑧、完整代码

//vite.config.ts

import { defineConfig } from "vite";

import vue from "@vitejs/plugin-vue";

import { resolve } from "path"; //配置别名路径

// https://vitejs.dev/config/

export default defineConfig({

plugins: [vue()], // 注册插件

server: {

// open: true,//启动项目后自动打开浏览器

port: 8080, //端口配置

hmr: true, //开启热加载

},

resolve: {

//设置便捷图片路径引用

alias: {

"/images": "src/assets/images/", //这里不能通过path模块解析路径的写法

"@": resolve(__dirname, "src"),//配置别名路径

"@c": resolve(__dirname, "src/components"),//配置别名路径

},

},

//项目构建配置

build: {

target: "modules", //设置最终构建的浏览器兼容目标 //es2015(编译成es5) | modules

outDir: "dist", // 构建得包名 默认:dist

assetsDir: "assets", // 静态资源得存放路径文件名 assets

sourcemap: false, //构建后是否生成 source map 文件

minify: "esbuild", // 项目压缩 :boolean | 'terser' | 'esbuild'

chunkSizeWarningLimit: 1000, //chunk 大小警告的限制(以 kbs 为单位)默认:500

cssTarget: "chrome61", //防止 vite 将 rgba() 颜色转化为 #RGBA 十六进制符号的形式 (要兼容的场景是安卓微信中的 webview 时,它不支持 CSS 中的 #RGBA 十六进制颜色符号)

},

// 样式全局配置

css: {

// 全局变量+全局引入less+配置主题色

preprocessorOptions: {

less: {

javascriptEnabled: true,

// 全局变量使用:@primary-color

modifyVars: {

"primary-color": "#1890ff", // 全局主色

"link-color": " #1890ff", // 链接色

"success-color": " #52c41a", // 成功色

"warning-color": " #faad14", // 警告色

"error-color": " #ff4d4f", // 错误色

"font-size-base": " 14px", // 主字号

/*light浅色背景下*/

"light-headline": "#262626", // 标题色

"light-text": "#595959", // 主要文字

"light-text-secondary": "#8c8c8c", // 次要文字

"light-disabled": "#bfbfbf", // 禁用

"light-border": " #d9d9d9", // 边框色

"light-cut-off-rule": " #f0f0f0", // 分割线

"light-bg": " #f5f5f5", // 背景

"light-table-headline": " #fafafa", // 表格标题

/*dark深色背景下*/

"dark-headline": "#262626", // 标题色

"dark-text": "#595959", // 主要文字

"dark-text-secondary": "#8c8c8c", // 次要文字

"dark-disabled": "#bfbfbf", // 禁用

"dark-border": " #d9d9d9", // 边框色

"dark-cut-off-rule": " #f0f0f0", // 分割线

"dark-bg": " #f5f5f5", // 背景

"dark-table-headline": " #fafafa", // 表格标题

/*边框配置*/

"border-radius-base": " 2px", // 组件/浮层圆角

"box-shadow-base": " 0 2px 8px rgba(0, 0, 0, 0.15)", // 浮层阴影

},

},

},

},

});

(四)、默认清除配置

请移步 前端清除项目默认样式

(五)、vue3+ts+vite屏幕适配

应用场景:不固定宽高比的Web应用,适用于绝大部分业务场景基于rem的适配方案

①、安装依赖

postcss-pxtorem 是PostCSS的插件,用于将像素单元生成rem单位autoprefixer 浏览器前缀处理插件amfe-flexible 可伸缩布局方案 替代了原先的lib-flexible 选用了当前众多浏览器兼容的viewport

npm i postcss-pxtorem autoprefixer amfe-flexible --save-dev

②、根目录创建 postcss.config.js 文件

//postcss.config.js

module.exports = {

plugins: {

autoprefixer: {

overrideBrowserslist: [

"Android 4.1",

"iOS 7.1",

"Chrome > 31",

"ff > 31",

"ie >= 8",

"last 10 versions", // 所有主流浏览器最近10版本用

],

grid: true,

},

"postcss-pxtorem": {

rootValue: 192, // 设计稿宽度的1/ 10 例如设计稿按照 1920设计 此处就为192

propList: ["*", "!border"], // 除 border 外所有px 转 rem

selectorBlackList: [".el-"], // 过滤掉.el-开头的class,不进行rem转换

},

},

};

③、main.ts/js 文件中导入依赖

可伸缩布局方案

import "amfe-flexible/index.js";

④、项目重新启动

四、程序语录

#mermaid-svg-3MRkWqoeJn9pZmuT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .error-icon{fill:#552222;}#mermaid-svg-3MRkWqoeJn9pZmuT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3MRkWqoeJn9pZmuT .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-3MRkWqoeJn9pZmuT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3MRkWqoeJn9pZmuT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3MRkWqoeJn9pZmuT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3MRkWqoeJn9pZmuT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3MRkWqoeJn9pZmuT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3MRkWqoeJn9pZmuT .marker.cross{stroke:#333333;}#mermaid-svg-3MRkWqoeJn9pZmuT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3MRkWqoeJn9pZmuT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .cluster-label text{fill:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .cluster-label span{color:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .label text,#mermaid-svg-3MRkWqoeJn9pZmuT span{fill:#333;color:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .node rect,#mermaid-svg-3MRkWqoeJn9pZmuT .node circle,#mermaid-svg-3MRkWqoeJn9pZmuT .node ellipse,#mermaid-svg-3MRkWqoeJn9pZmuT .node polygon,#mermaid-svg-3MRkWqoeJn9pZmuT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3MRkWqoeJn9pZmuT .node .label{text-align:center;}#mermaid-svg-3MRkWqoeJn9pZmuT .node.clickable{cursor:pointer;}#mermaid-svg-3MRkWqoeJn9pZmuT .arrowheadPath{fill:#333333;}#mermaid-svg-3MRkWqoeJn9pZmuT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3MRkWqoeJn9pZmuT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3MRkWqoeJn9pZmuT .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-3MRkWqoeJn9pZmuT .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-3MRkWqoeJn9pZmuT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3MRkWqoeJn9pZmuT .cluster text{fill:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT .cluster span{color:#333;}#mermaid-svg-3MRkWqoeJn9pZmuT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3MRkWqoeJn9pZmuT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了!

五、精彩推荐

前端vue中ts无法识别引入的vue文件,提示找不到xxx.vue模块的解决【引入新建页面或者通过router引入时报错】 vue实现导入表格数据【纯前端实现】 Vue实现独立修改单个页面的背景色,进入不同的页面设置不同的背景颜色【两种方式】 vue实现防抖函数、节流函数,全局使用【输入框、按钮】 vue实现禁止浏览器网页缩放【方法一和方法二可同时设置】

本篇博客文章模板唯一版权归属©水香木鱼

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: