《Vite 基础知识》基于 Vite4 的 Vue3 项目创建(受 Nodejs 版本限制可参考)

news2024/11/27 12:53:09

真实的工作中 Node.js 版本不是随意可升级的,此处记录一次折中升级实战~

本章基于 Vite4 开发!

Vite5、 Vitepress, 都需要 Node.js 版本 18+20+

node/npmVite4Vite5Vitepress
14.21.3 / 8.13.2💯
20.11.0 / 10.2.4💯💯

第一步:初始化框架

  1. 全局安装 Vite4
npm i vite@4 -g

如果你想尝试最新版也可,但注意需要 Node.js 版本 18+20+

npm i vite@latest -g

查看版本号

vite -v
  1. 基于 Vite 命令 搭建项目
npm create vite@4 my-vue-app --template vue
  1. 根据提示步骤创建项目、进入目录、安装依赖、最后启动
> npm create vite@4 my-vue-app --template vue// [!code ++]
√ Select a framework: » Vue// [!code ++]
√ Select a variant: » JavaScript// [!code ++]

Scaffolding project in D:\project\my-vue-app...

Done. Now run:
  cd my-vue-app # 进入项目目录
  npm install   # 安装依赖
  npm run dev   # 启动

在这里插入图片描述

第二步:自定义配置

vite.config.js

  • 代码第 6 行,base 设为相对路径,打包后可放任意路径;
  • 代码第 3,8 行,必须设置 Vue 插件,用以支持 Vue3 单文件组件。否则编译报错[vite:build-import-analysis]
  • 代码第 15 行,限制为工作区 root 路径以外的文件的访问。设为 false 可连开发版组件库;
  • 代码 3,19-23 行,设置文件系统路径别名 resolve.alias;
  • 代码 25 行,resolve.extensions 导入文件时免后缀;
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

export default defineConfig({
    base: './', // 相对路径,打包后可放任意路径
    plugins: [ // 必有插件
        vue()
    ],
    server: {
        host: true,
        port: 8001, // 设置服务启动端口号
        open: true, // 设置服务启动时是否自动打开浏览器
        fs: { // 限制为工作区 root 路径以外的文件的访问
            strict: false
        }
    },
    resolve: {
        alias: { // 路径别名
            "@": resolve(__dirname, 'src'),
            "@images": resolve(__dirname, 'src/assets/images'),
            "@public": resolve(__dirname, 'public'),
        },
        // 导入文件时免后缀
        extensions: ['.vue', '.js', '.ts', '.jsx', '.tsx', '.json']
    }
})

packages.json

  • 插件都是固定版本,避免意想不到的错误;
  • 把接下来要安装的插件都已列出,直接拷贝即可;
{
    "name": "webapp",
    "version": "0.0.0",
    "type": "module",
    "scripts": {
        "dev": "vite",
        "build": "vite build",
        "preview": "vite preview"
    },
    "dependencies": {
        "@element-plus/icons-vue": "2.3.1",
        "axios": "1.6.5",
        "element-plus": "2.5.1",
        "js-cookie": "3.0.5",
        "js-md5": "0.8.3",
        "viewerjs": "1.11.6",
        "vue": "3.4.8",
        "vue-router": "4.2.5",
        "vuex": "4.1.0"
    },
    "devDependencies": {
        "@vitejs/plugin-vue": "4.6.2",
        "postcss-pxtorem": "6.0.0",
        "sass": "1.70.0",
        "vite": "4.5.1"
    }
}

main.js

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

import ElementPlus from 'element-plus'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs' // 配置中文
import 'element-plus/dist/index.css'
import { registerElIcon } from './utils/elements'

import router from './router/index.js' // 路由
import '@/permission' // 路由守卫:权限控制及跳转
import '@/utils/rem.js' // 自适应分辨率监听
import { ParamsStore } from './params' // 前置信息获取
import axios from 'axios'
import store from './store/index'

// 创建 Vue 实例
const app = createApp(App);

window.$vueApp = app;

// 链式安装插件
app.use(ElementPlus, { locale: zhCn }) // 使用中文
    .use(router)
    .use(store)
    .mount('#app')

// 全局注册 el-icon
registerElIcon(app);

App.vue

  • main.js 中删除默认样式 import './style.css',还有文件;
  • 代码第 2 行,配置路由。注意 Vue2Vue3 非兼容之一,被挂载的应用不会替换元素。也就是说 id='app' 不会被替换,而是放在id='app'节点之下;
  • 代码第 6,7 行,直接全局导入字体库和样式;
<template>
  <router-view></router-view>
</template>

<style>
@import './assets/fonts/fonts.css';
@import './assets//scss/base.scss';

svg {
  width: 1em;
  height: 1em;
}

#app {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow: hidden;
}

html ::-webkit-scrollbar { /*滚动条整体样式*/
  width: 8px; /*高宽分别对应横竖滚动条的尺寸*/
  height: 8px;
}

html ::-webkit-scrollbar-thumb { /*滚动条里面小方块*/
  border-radius: 4px;
  background: #cdcdcd;
}

html ::-webkit-scrollbar-track { /*滚动条里面轨道*/
  border-radius: 4px;
  background: white;
  margin: 0;
}
</style>

第三步:CSS自适应分辨率

参考《CSS自适应分辨率 postcss-pxtorem(适用于 Vite)》

第四步:配置 Element Plus

Element Plus 支持 Vue3,Element UI 支持 Vue2

  1. 安装 element plus 和 Icon 图标(需要单独安装)
npm i element-plus

npm i @element-plus/icons-vue
  1. 新建文件 src/utils/elements.js
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

export const registerElIcon = (app) => {
    // 全局注册图标 会牺牲一点性能 ElIconXxxx
    for (let i in ElementPlusIconsVue) {
        let name = `ElIcon${i}`;
        app.component(name, ElementPlusIconsVue[i])
        console.log(name, ElementPlusIconsVue[i]);
    }
}
  1. App.vue 中设置 svg 高宽
<style>
svg {
  width: 1em;
  height: 1em;
}
</style>
  1. main.js 引入,仅全局引入,

    • 代码第6-7行,引入所有图标和转行方法;
    • 代码第11-16行,全局注册图标组件,且使用方式有改变
    • 代码 5 和 20 行,可配置成中文;

import ElementPlus from 'element-plus'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs' // 配置中文
import 'element-plus/dist/index.css'
import { registerElIcon } from './utils/elements'

// 全局注册 el-icon
registerElIcon(app);

app.use(ElementPlus, { locale: zhCn }) // 使用中文

同样,有两种使用方式:

  1. 结合 el-icon 使用,提供了额外的属性,如:is-loading等;
  2. 直接使用 SVG 图标,当做一般的 svg 使用;
<!-- 使用 el-icon 为 SVG 图标提供属性 -->
<el-icon :size="size" :color="color">
    <ElIconEdit  />
</el-icon>
<!-- 或者独立使用它,不从父级获取属性 -->
<ElIconEdit />

第五步:配置 Sass

  • Scss是从 Sass3 引入进来的,scss语法有"{}“,”;"而sass没有,所以sass-loader对他们的解析是不一样的;
  • Sass从第三代开始,放弃了缩进式风格,并且完全向下兼容普通的CSS代码,这一代的Sass也被称为Scss
  • 如果使用 vscode 开发,建议安装插件 Live Sass Compiler;
  • 详细语法,参考此篇

安装 SASS 插件即可, Vite 提供了内置支持。无需安装 sass-loader, 这是 Webpack 插件

npm i sass@1.70.0 -D

第六步:配置 Router

Router4 支持 Vue3,Router3 支持 Vue2

  1. 安装

    npm i vue-router@4
    
  2. 简单示例

    • 新建 src/router/index.js 文件;

    • 新建 views 文件夹,新建 login.vue 和 index.vue 来;

import { createRouter, createWebHashHistory } from 'vue-router'
import index from '../views/index.vue'
import login from '../views/login.vue'

// 定义路由
const routes = [{
        path: '/',
        component: login
    },
    {
        path: '/index',
        component: index
    }
];

// 创建路由实例并传递 `routes` 配置
const router = createRouter({
    history: createWebHashHistory(),
    routes
});

export default router
  1. 设置 全局前置守卫,新建文件 src/permission.js
import router from "./router";

router.beforeEach((to, from, next) => {
    debugger
    // 获取 token
    let token = MyCookie.getAuthToken();
    // "/" 是登录页,"/index" 是主页
    if (token) {
        if (to.path == "/") {
            next("/index");
        } else {
            next();
        }
    } else {
        if (to.path !== "/") {
            next("/");
        } else {
            next();
        }
    }
});
  1. main.js 设置
import router from './router/index.js'
import '@/permission' // 路由守卫:权限控制及跳转

app.use(router) 
  1. 基于 Vue2Router3 和基于 Vue3Router4 主要差异如下:
    • 导入不同;
    • 创建接口不同;
/* Vue2 / Router3 */ 
import Router from 'vue-router'
const store = new new Router({})

/* Vue3 / Router4 */ 
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({})

第七步:配置 Vuex4

Vuex4 支持 Vue3,但官方更推荐新 状态管理库 Pinia!

本次不做更换,依然用 Vuex4,但 Pinia 也排在升级计划里。如果想现在就了解,可移步 Pinia 从 Vuex ≤4 迁移。

  1. 安装
npm i vuex@4.1.0
  1. 将原项目中的 src/store 文件夹和文件拷贝来;

  2. main.js 配置

import store from './store/index'

app.use(store)
  1. 优化 src\store\index.js
    • 代码第 1,14 行,Vue4 导入和初始化接口有变;
    • 代码第 4 行,动态导入 .js 文件,使用 Vite Glob 导入接口;
import * as Vuex from 'vuex'
import getters from './getters'

const modulesFiles = import.meta.glob('./modules/**/*.js', { eager: true });

let modules = {};
for (const path in modulesFiles) {
    const moduleName = path.replace(/(.*\/)*([^.]+).*/ig, "$2");
    modules[moduleName] = modulesFiles[path].default;
}

const store = Vuex.createStore({
    modules,
    getters,
})

export default store
  1. 基于 Vue2Vuex3 和基于 Vue3Vuex4 主要差异如下:
    • 导入不同;
    • 创建接口不同;
/* Vue2 / Vuex3 */ 
import Vuex from 'vuex'
const store = new Vuex.Store({})

/* Vue3 / Vuex4 */ 
import * as Vuex from 'vuex'
const store = Vuex.createStore({})

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

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

相关文章

从零开始学Linux之gcc命令

首先我们需要知道有两种编程语言 编译型语言&#xff1a;要求必须提前将所有源代码一次性转换成二进制指令&#xff0c;也就是生成一个可执行程序&#xff0c;例如C、C、go语言、汇编语言等&#xff0c;使用的转换工具称为编译器。 解释型语言&#xff1a;一边执行一边转换&a…

[NOIP2011 提高组] 聪明的质监员

[NOIP2011 提高组] 聪明的质监员 题目描述 小T 是一名质量监督员&#xff0c;最近负责检验一批矿产的质量。这批矿产共有 n n n 个矿石&#xff0c;从 1 1 1 到 n n n 逐一编号&#xff0c;每个矿石都有自己的重量 w i w_i wi​ 以及价值 v i v_i vi​ 。检验矿产的流程…

muduo库的模拟实现——工具部分

文章目录 一、Buffer模块1.为什么需要Buffer缓冲区2.Buffer模块的设计3.Buffer模块的实现4.Buffer缓冲区的其它设计方案 二、Socket模块1.Socket模块的设计2.Socket代码实现 三、Acceptor模块1.Acceptor模块的设计与实现2.Acceptor模块完整代码实现 四、定时器模块1.时间轮的思…

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

正弦波拟合

正弦波拟合是一种常见的数学方法&#xff0c;用于确定最佳匹配给定数据集的正弦波形。这可以用于各种应用&#xff0c;如信号处理、周期性数据分析等。以下举例展示如何进行正弦波拟合。 步骤与方法 收集数据&#xff1a;首先&#xff0c;你需要收集或生成一组数据&#xff0…

食品信息管理系统java项目ssm项目springboot项目

食品信息管理系统java项目ssm项目springboot项目&#xff0c;增删改查均已实现&#xff0c;有批量删除 前端技术: JavaScript&#xff0c;Layui&#xff0c;Html5 后端技术: Java&#xff0c;MySql&#xff0c;Spring&#xff0c;Spring Mvc&#xff0c;SpringBoot&#xff0…

【代码随想录20】669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

目录 669.修剪二叉搜索树题目描述参考代码 108.将有序数组转换为二叉搜索树题目介绍参考代码 538.把二叉搜索树转换为累加树题目描述参考代码 669.修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树…

2024.1.28 GNSS 学习笔记

1.基于 地球自转改正卫地距 以及 伪距码偏差 重构定位方程&#xff1a; 先验残差计算公式如下所示&#xff1a; 2.观测值如何定权&#xff1f;权重如何确定&#xff1f; 每个卫星的轨钟精度以及电离层模型修正后的误差都有差异&#xff0c;所以我们不能简单的将各个观测值等权…

2024.2.1日总结

web的运行原理&#xff1a; 用户通过浏览器发送HTTP请求到服务器&#xff08;网页操作&#xff09;。web服务器接收到用户特定的HTTP请求&#xff0c;由web服务器请求信息移交给在web服务器中部署的javaweb应用程序&#xff08;Java程序&#xff09;。启动javaweb应用程序执行…

(黑马出品_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_01&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术栈导学 1.认识微服务1.1.学习目标1.2.单体架构1.3.分布式架构1.4.微服务1.5.SpringCloud1.6.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示…

main函数、_tmain函数和wmain函数的区别

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 今天碰到一个问题&#xff0c;算是彻底搞明白了main函数、_tmain函数和wmain函数的区别。就是使用vs2015新建一个控制台工程&#xff0c;如果入口函数是设…

Maya------布尔 圆形圆角组件

17. maya常用命令7.布尔 圆形圆角组件_哔哩哔哩_bilibili 选中一个模型&#xff0c;再按shift加选另外一个模型 圆形圆角命令

STM32——SPI

STM32——SPI 1.SPI介绍 SPI是什么? SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#…

关于系统报错找不到X3DAudio1_7.dll怎么修复?总共有五个常见方案供你选择

通常情况下&#xff0c;当电脑尝试运行某些应用程序或游戏时&#xff0c;可能会遭遇“找不到x3daudio1_7.dll无法继续执行”的错误信息&#xff0c;这通常表明系统中缺少某个重要文件。为了理解这一问题&#xff0c;并寻找有效的解决方案&#xff0c;让我们先探讨为什么会发生这…

C++类和对象之进击篇

目录 1.类的6个默认成员函数2.构造函数2.1概念2.2特性 3.析构函数3.1概念3.2特性 4.拷贝构造函数4.1 概念4.2特征 5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一…

Versal Adaptive SoC Boards, Kits, and Modules

Versal™ AI Edge Series VEK280 Evaluation Kit https://www.xilinx.com/products/boards-and-kits/vek280.html#whatsInside The VEK280 Evaluation Kit, equipped with the AMD Versal™ AI Edge VE2802 adaptive SoC, offers AIE-ML and DSP hardware acceleration engin…

【HarmonyOS 4.0 应用开发实战】TypeScript入门之元组详讲

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

AD24-层叠的定义与添加(正片层与负片层)

一、叠层添加 1、设计-层叠管理器&#xff0c;进入层叠界面 2、一般添加红色框这两个 3、左侧绿色框勾上&#xff0c;表示每次添加两个层&#xff0c;去掉即添加一个层 4、名称修改 5、完成查看 二、正片层与负片层 1、定义 2、正片层&#xff08;所见即所得&#xff0c;看到…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣&#xff0c;这是因为每个女人在每年&#xff0c;都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的&#xff0c;从零基础学习到店铺经营都有涉及&#xff0c;就做美睫和睫毛嫁接这两项业务&#xff0c;月收入万元以上应该问题不…