使用Vite创建一个动态网页的前端项目
1. 引言
虽然现在的前端更新换代的速度很快,IDE和工具一批批的换,但是我们始终要理解一点基本的程序构建的思维,这些环境和工具都是为了帮助我们更快的发布程序。笔者还记得以前写前端代码的时候,只使用文本编辑器,然后在浏览器中刷新就可以了。对于纯前端项目,其实这样也是很方便的。不过一旦涉及到文件资源访问的问题就麻烦了,因为浏览器的安全限制,不能访问域以外的资源。那么你就需要将其部署到Web服务器中,这意味着你要起个服务器。另外,调试的时候也要每次都刷新页面;第三方依赖包的引入也是问题,需要自己去管理,然后进行引入。于是,像Vite这样的前端开发与构建工具就出现了,它可以帮助你将上述这些步骤自动化处理,加快你的前端程序的编程效率。这里笔者就总结一下如何使用Vite创建动态网页的前端项目。
2. 操作
首先,安装Node.js和npm。Node.js是JavaScript 的运行时环境,npm是一个包管理和任务运行工具,安装过程比较简单,这里就不复述了。
接下来,选择一个文件夹,在终端中运行以下命令来创建项目:
npm create vite@latest my-native-js-app
这时,终端会让你选择一个框架:
> npx
> create-vite my-native-js-app|
* Select a framework:
| > Vanilla
| Vue
| React
| Preact
| Lit
| Svelte
| Solid
| Qwik
| Angular
| Marko
| Others
—
这里笔者选择使用Vanilla,表示使用原生的模板,不使用任何框架。接下来,终端会让你选择使用TypeScript还是JavaScript:
> npx
> create-vite my-native-js-app|
o Select a framework:
| Vanilla
|
* Select a variant:
| > TypeScript
| JavaScript
—
这里笔者选择使用JavaScript。然后等待一会儿,前端项目就创建完成了,如下所示:
> npx
> create-vite my-native-js-app|
o Select a framework:
| Vanilla
|
o Select a variant:
| JavaScript
|
o Scaffolding project in C:\Work\js\my-native-js-app...
|
— Done. Now run:cd my-native-js-appnpm installnpm run dev
虽然可以接着使用终端,但这时就可以使用VS Code接管项目了。通过VS Code打开my-native-js-app文件夹,并启动终端,如下图所示:
在终端执行指令:
npm install
这一步是为了安装第三方依赖库。一般来说,如果你开始一个新的项目,这一步是必须的。当然依赖库安装完成后,如果后续依赖库没有变动,就不需要执行这一步了。
此时的项目的文件组织如下所示:
my-native-js-app
├── public
│ └── vite.svg
├── src
│ ├── counter.js
│ ├── javascript.svg
│ ├── main.js
│ └── style.css
├── index.html
└── package.json
这里的package.json文件是npm的核心配置文件,如下所示:
{"name": "my-native-js-app","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite","build": "vite build","preview": "vite preview"},"devDependencies": {"vite": "^6.3.5"}
}
主要作用有两个:
- 依赖管理。dependencies字段和devDependencies字段,其中dependencies字段是项目需要的依赖库包,devDependencies构建项目需要的依赖库包。执行
npm install
就是根据这两个字段中的值自动安装响应的依赖包。 - 执行任务脚本。scripts字段,通过自定义命令来执行跟构建相关的任务,这里的dev、build和preview就是最基础和常用的三个指令。
dev就是执行指令:
npm run dev
表示在开发环境中启动服务器,终端一般会有如下提示:
> my-native-js-app@0.0.0 dev
> viteVITE v6.3.5 ready in 500 ms➜ Local: http://localhost:5173/➜ Network: use --host to expose➜ press h + enter to show help
在浏览器中访问地址:http://localhost:5173/ ,可以看到页面中显示了一个基础的HTML +JS示例,如下所示:
另外两个指令主要是为了实际发布时使用:
npm run build
构建项目代码,比如压缩、拼接、混淆等。npm run preview
发布经过构建后的代码项目。
3. 解析
这个示例JS项目不仅仅是个欢迎页面,甚至还是个动态页面:可以对鼠标点击的次数计数。那么我们就来稍微解析一下其中的代码。首先是index.html:
<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="/vite.svg" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite App</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script></body>
</html>
可以看到这个HTML页面并没有显示在界面的元素,因为这些元素都是通过JS动态加载上来的。另外,要注意的是这里的
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
是用来兼容高分屏的,具体可以参看笔者的文章《HTML页面关于高分屏的设置》。可以看到即使是这个最简化的示例都把这个元数据标签带上了,因为现在使用高分屏的设备已经非常多了。
接着我们来看一下main.js:
import './style.css'
import javascriptLogo from './javascript.svg'
import viteLogo from '/vite.svg'
import { setupCounter } from './counter.js'document.querySelector('#app').innerHTML = `<div><a href="https://vite.dev" target="_blank"><img src="${viteLogo}" class="logo" alt="Vite logo" /></a><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank"><img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" /></a><h1>Hello Vite!</h1><div class="card"><button id="counter" type="button"></button></div><p class="read-the-docs">Click on the Vite logo to learn more</p></div>
`setupCounter(document.querySelector('#counter'))
这段代码的主要意思也就是刚才说的,查询#app元素,并填充HTML字符串,也就是这个页面是先显示HTML,再通过js动态加载元素到页面中。
另一个有意思的点是这里的导入:
import './style.css'
import javascriptLogo from './javascript.svg'
import viteLogo from '/vite.svg'
其实并不是原生JS的行为,而是Vite提供的。这其实也体现了一种思想,HTML、CSS和JavaScript三者来说,JavaScript才是最主要的,css样式和HTML页面都可以通过JavaScript来生成。
再来看下counter.js:
export function setupCounter(element) {let counter = 0const setCounter = (count) => {counter = countelement.innerHTML = `count is ${counter}`}element.addEventListener('click', () => setCounter(counter + 1))setCounter(0)
}
函数实现很简单,就是个简单的计数功能。不过要注意的是这里的export function setupCounter(element)
使用的是JavaScript ES6(ECMAScript 2015)中的模块导出语法,表示将setupCounter这个函数导出。在main.js中则进行导入:
import { setupCounter } from './counter.js'setupCounter(document.querySelector('#counter'))
4. 结语
之所以选择使用原生JS项目没有使用框架,是因为笔者想研究一下比较底层的实现,以及对比体会一些框架的设计思路。当然不能重复造轮子,但是也不能离开这些轮子就啥都不会了,理解一些更深层次、更底层的东西,有助于我们更新换代,使用更好的轮子。
相关文章:
使用Vite创建一个动态网页的前端项目
1. 引言 虽然现在的前端更新换代的速度很快,IDE和工具一批批的换,但是我们始终要理解一点基本的程序构建的思维,这些环境和工具都是为了帮助我们更快的发布程序。笔者还记得以前写前端代码的时候,只使用文本编辑器,然…...
常见的LLM
常见的 LLM(大语言模型,Large Language Models)可以按照开源/闭源、机构/公司、用途等维度分类。以下是一些主流和常见的 LLM 及其简介: 一、开源 LLM Meta(Facebook) 名称参数量特点LLaMA 1 / 2 / 37B /…...
助力 FPGA 国产化,ALINX 携多款方案亮相深圳、广州“紫光同创 FPGA 技术研讨会”
5 月中旬,一年一度的紫光同创技术研讨会系列活动正式拉开帷幕,相继在深圳、广州带来 FPGA 技术交流盛宴。 ALINX 作为紫光同创官方合作伙伴,长期助力推动 FPGA 国产化应用发展,此次携多款基于 Kosmo-2 系列产品开发的方案 demo 亮…...
深入浅出IIC协议 - 从总线原理到FPGA实战开发 --第四篇:I2C工业级优化实践
第四篇:I2C工业级优化实践 副标题 :从实验室到产线——I2C控制器的高可靠设计秘籍 1. 时序收敛技巧 1.1 关键路径识别与优化 Vivado时序报告解析 : Slack (MET): 0.152ns (要求≥0) Data Path Delay: 3.821ns (逻辑布线) Cell Delay: i…...
【leetcode】70. 爬楼梯
文章目录 1. 数组2. 优化空间 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 1…...
【web全栈】若依框架B站学习视频
文章目录 基础篇-01 AI若依导学视频基础篇02 若依搭建基础篇03 入门案例基础篇04 功能详解-权限控制 基础篇-01 AI若依导学视频 基础篇02 若依搭建 基础篇03 入门案例 基础篇04 功能详解-权限控制...
MFC 捕捉桌面存成jpg案例代码
下面是关于截屏并保存成jpg文件的代码。由主函数OnCapScreenJpg()、DDBToDIB()、JpegFromDib()、DibToSamps()以及QuadFromWord()函数组成。这些函数的功能包括截取屏幕、将截取的屏幕转成设备无关bmp、再进一步压缩成jpeg格式。这些代码是从网上得到的,得到的代码没…...
2.4.4-死锁的处理策略-检测和解除
知识总览 死锁的检测 用资源分配图这种数据结构来检测是否产生了死锁,资源分配图上有2种节点,进程节点用圆圈表示,一个圆圈代表一个进程,还有资源节点,一个矩形代表一类资源,用矩形中的圆圈表示当前类型的…...
豪越智能仓储:为消防应急物资管理“上锁”
在城市的繁华街角,一场突如其来的大火无情地肆虐着一栋商业大楼。火焰在楼内疯狂蔓延,滚滚浓烟迅速弥漫,人们的生命财产安全受到了严重威胁。消防警报声骤然响起,消防队员们迅速出动,争分夺秒赶赴火灾现场。然而&#…...
(06)数字化转型之质量管理:遵循PDCA规范的全流程避险指南
在全球化竞争和消费升级的双重驱动下,质量管理已从单纯的产品检验演变为企业核心竞争力的重要组成部分。一个完善的质量管理体系不仅能降低质量成本、提升客户满意度,更能成为品牌差异化的战略武器。本文将系统性地介绍现代企业质量管理的完整框架&#…...
图论算法精解(Java 实现):从基础到高频面试题
一、图的基础表示方法 1.1 邻接矩阵(Adjacency Matrix) 邻接矩阵是表示图的一种直观方式,它使用一个二维数组来存储节点之间的连接关系。对于一个有 n 个节点的图,邻接矩阵是一个 nn 的矩阵,其中 matrix [i][j] 表示…...
[Linux] Linux信号量深度解析与实践(代码示例)
Linux信号量深度解析与实践 文章目录 Linux信号量深度解析与实践一、什么是信号量1. 信号量的核心概念2. 信号量的分类3. 信号量的操作机制 二、怎么用信号量1. 信号量API的深度解析(1)无名信号量API(2)有名信号量API(…...
Switch最新 模拟器 Eden(伊甸)正式发布 替代Yuzu模拟器
Switch最新 模拟器 Eden(伊甸)正式发布 替代Yuzu模拟器 100 帧跑满《塞尔达传说:旷野之息》 这款模拟器基于 Yuzu 框架开发,但团队强调它并非…...
[cg] [ds]深度缓冲z与线性z推导
4. GLSL 代码实现 在着色器中,将深度缓冲值转换为线性深度: float LinearizeDepth(float depth, float near, float far) {// OpenGL 的 NDC 深度范围是 [-1, 1],需转换float z_ndc 2.0 * depth - 1.0;// 计算线性深度return (2.0 * near …...
clock的时钟频率check代码
在芯片验证中,经常遇到需要check时钟频率的场景,由于时钟数量有很多,手动写代码得到后年马月,所以我这边写了一个宏define,可以通过输入参数的形式验证需要check的时钟频率,大大提升了验证效率和准确率&…...
企业数字化转型是否已由信息化+自动化向智能化迈进?
DeepSeek引发的AI热潮迅速蔓延到了各个行业,目前接入DeepSeek的企业,涵盖了科技互联网、云服务、电信、金融、能源、汽车、手机等热门领域,甚至全国各地政府机构也纷纷引入。 在 DeepSeek 等国产 AI 技术的推动下,众多企业已经敏锐…...
PT5F2307触摸A/D型8-Bit MCU
1. 产品概述 ● PT5F2307是一款51内核的触控A/D型8位MCU,内置16K*8bit FLASH、内部256*8bit SRAM、外部512*8bit SRAM、触控检测、12位高精度ADC、RTC、PWM等功能,抗干扰能力强,适用于滑条遥控器、智能门锁、消费类电子产品等电子应用领域。 …...
嵌入式STM32学习——串口USART 2.0(printf重定义及串口发送)
printf重定义: C语言里面的printf函数默认输出设备是显示器,如果要实现printf函数输出正在串口或者LCD显示屏上,必须要重定义标准库函数里调用的与输出设备相关的函数,比如printf输出到串口,需要将fputc里面的输出指向…...
进程信号(上)【Linux操作系统】
文章目录 进程信号信号引入进程要如何识别信号?进程接收到信号的时候,不一定马上处理信号进程处理信号的情况 信号相关概念信号产生键盘产生通过指令向进程发送信号系统调用向进程发送信号软件条件异常错误 操作系统如何知道进程出现了异常错误ÿ…...
全方位详解微服务架构中的Service Mesh(服务网格)
一、引言 随着微服务架构的广泛应用,微服务之间的通信管理、流量控制、安全保障等问题变得日益复杂。服务网格(Service Mesh)作为一种新兴的技术,为解决这些问题提供了有效的方案。它将服务间通信的管理从微服务代码中分离出来&a…...
bi工具是什么意思?bi工具的主要功能有哪些?
目录 一、BI 工具是什么意思? 1. 基本概念 2. 发展历程 编辑二、BI 工具的主要功能 1. 数据连接与整合 2. 数据存储与管理 3. 数据分析与挖掘 4. 可视化呈现 5. 报表生成与分享 6. 实时监控与预警 三、BI 工具的应用场景 1. 销售与营销 2. 财务与会计…...
cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins
cocos 版本2.4.11 在windows上jenkins的具体配置和部署,可参考上一篇文章cocos creator使用jenkins打包流程,打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意,windows上运行jenkins需要关闭windows自己的jenkins服务&a…...
PaddleOCR的Pytorch推理模块
概述 在项目中,遇到文字识别OCR的使用场景。 然而,目前效果最好的PaddleOCR只能用百度的PaddlePaddle框架运行。 常见项目中,往往使用更普遍的Pytorch框架,单独安装PaddlePaddle不仅会让项目过于臃肿,而且可能存在冲…...
操作系统期末复习(一)
一、选择 1.从用户的观点看,操作系统是() A.用户与计算机之间的接口 B.控制和管理计算机资源的软件 C.合理地组织计算机工作流程的软件 由若干层次的程序按一定的结构组成的有机体 答案:A 2.操作系统在计算机系统中位于&#x…...
今日行情明日机会——20250521
上证指数缩量收阳线,个股跌多涨少,整体处于日线上涨末端,注意风险。 深证指数,出现60分钟的顶分型,需要观察方向的选择。 2025年5月21日涨停股主要行业方向分析 并购重组 涨停家数:9家。 代表标的&am…...
传统Spring MVC + RESTful 与 Vue3 结合 JWT Token 验证的示例
以下是针对非Spring Boot项目(传统Spring MVC)的示例 一、项目结构 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── config/ # 配置类目录 │ │ │ ├─…...
使用Redis的Bitmap实现了签到功能
思路分析 我们可以把 年和月 作为BitMap的key,然后保存到一个BitMap中,每次签到就到对应的位上把数字从0 变为1,只要是1,就代表是这一天签到了,反之咋没有签到。 关键问题 问题一: 什么叫做连续签到天数…...
Unity-编辑器扩展-其二
今天我们来基于之前提到的编辑器扩展的内容来做一些有实际用处的内容: 检查丢失的组件 首先是一个比较实际的内容:当我们在做项目时,经常会涉及到预设体在不同项目或者不同文件路径下的转移,这个时候很容易在某个具体的prefab对…...
项目中Warmup耗时高该如何操作处理
1)项目中Warmup耗时高该如何操作处理 2)如何在卸载资源后Untracked和Other的内存都回收 3)总Triangles的值是否包含了通过GPU Instancing画的三角形 4)有没有用Lua来修复虚幻引擎中对C代码进行插桩Hook的方案 这是第432篇UWA技术知…...
php://filter的trick
php://filter流最常见的用法就是文件包含读取文件,但是它不止可以用来读取文件,还可以和RCE,XXE,反序列化等进行组合利用 filter协议介绍 php://filter是php独有的一种协议,它是一种过滤器,可以作为一个中…...
STM32 I2C硬件读写
一、I2C外设简介 STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担支持多主机模型(固定多主机、可变多主机)支持7位/10位地址模式支持不同的通讯速度&a…...
Qt+线段拖曳示例代码
Qt线段拖曳示例代码,功能见下图。 代码如下: canvaswidget.h #ifndef CANVASWIDGET_H #define CANVASWIDGET_H#include <QWidget> #include <QPainter> #include <QMouseEvent> #include <QVector>class CanvasWidget : publi…...
计算机网络相关面试题
一、HTTP1.1和HTTP2的区别 HTTP/1(主要指 HTTP/1.1)和 HTTP/2 是 Web 协议发展中的两个重要版本,二者在性能、协议机制和功能特性上有显著差异。以下从多个维度对比分析,并结合具体案例说明: 一、连接与请求处理方式 1…...
docker中部署Universal Media Server (UMS)
Universal Media Server (UMS) 本身主要是作为桌面服务程序开发的(主要面向 Java GUI DLNA 播放),但确实可以通过 Docker 进行部署。虽然官方没有提供 Docker 镜像,但社区有一些可用的方式可以在 Docker 中运行它。 下面是一个可…...
WordPress Elementor零基础教程
一、WordPress Elementor 是什么?—— 可视化网站搭建 “积木工具箱” 基础定义 Elementor 是 WordPress 的一款可视化页面构建插件,就如同网站搭建领域的 “PPT 编辑器”。它能让你无需编写代码,仅通过拖放模块(像图片、文本、…...
鸿蒙UI开发——实现一个上拉抽屉效果
1、概 述 在项目开发中,我们可能会遇到临时交互的场景(即:弹出一个临时交互框,交互完毕后继续用户的主流程),效果如下: 在ArkUI中,此类弹出窗被称为“半模态页面”,ArkU…...
详细介绍Qwen3技术报告中提到的模型架构技术
详细介绍Qwen3技术报告中提到的一些主流模型架构技术,并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型(LLM)领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…...
docker面试题(3)
如何临时退出一个正在交互的容器的终端,而不终止它 按ctrlp,后按ctrlq ,如果按ctrlc会使容器内的应用进程终止,进而会使容器终止 很多应用容器都默认是后台运行的,怎么查看它们输出的日志信息 使用docker logs &#…...
2025年二级等保实施全攻略:传统架构与云等保方案深度解析
2025年,随着《网络安全法》的深化落实和等保2.0标准的全面推行,二级等保已成为中小企业及非核心业务系统的合规基线。如何在高效满足监管要求的同时,兼顾成本与安全效能?本文将结合最新政策与实战经验,从传统架构到云等…...
技术点对比
数据库 数据库程序在线访问与ORM访问的对比 数据库程序在线ORM访问优点性能好性能差可以处理复杂sql缺点 性能: 复杂sql支持: 开发成本: 架构风格 管道-过滤器风格与数据仓库风格对比 管道-过滤器风格数据仓储风格备注交互方式顺序结构…...
自监督学习与监督学习
🔍 一、监督学习 vs 自监督学习:核心区别 维度监督学习(Supervised Learning)自监督学习(Self-Supervised Learning)是否需要人工标注的标签✅ 需要,如分类标签、边界框等❌ 不需要,…...
Java操作数据库,JDBC
package myjdbc; import com.mysql.jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /*** 练习JDBC,完成一些简单的操作。*/ public class jdbc01 {public static void main(Str…...
UML 活动图 (Activity Diagram) 使用案例
UML 活动图使用案例 UML 活动图 (Activity Diagram) 使用案例活动图的主要元素典型使用案例1. 用户登录流程2. 在线购物流程3. 订单处理系统4. 文件审批流程 活动图的优势何时使用活动图 UML 活动图 (Activity Diagram) 使用案例 活动图是UML中用于描述业务流程或系统工作流程…...
回溯法求解N皇后问题
目录 前言 一、回溯法是什么? 二、N皇后问题描述 分析解题思路 三、算法设计 1、递归法 2、非递归法 总结 前言 本文将从递归形式和非递归形式两种方法来介绍求解N皇后问题的回溯法,后续也会更新更多有关算法分析这方面的问题欢迎大家关注~🤩…...
网络流量分析工具ntopng的安装与基本使用
网络流量分析工具ntopng的安装与基本使用 一、ntopng基本介绍1.1 ntopng简介1.2 主要特点1.3 使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、安装ntopng工具3.1 官网地址3.2 配置软件源3.3 添加软件源3.4 安装ntopng 四、ntopng的基本配置4.1 修改配置文件4.…...
新导游入行规范与职业发展指导
随着旅游行业的蓬勃发展,导游作为旅游服务的重要环节,其职业素养和专业能力备受关注。对于新入行的导游而言,了解行业规范,明确职业发展方向,是开启职业生涯的重要一步。 一、严格遵守行业规范 持证上岗…...
数据结构与算法——堆
堆 树树的概念与结构树的相关术语树的表示树形结构实际运用场景 二叉树概念与结构特殊的二叉树满二叉树完全二叉树 二叉树存储结构顺序结构链式结构 实现顺序结构二叉树堆的概念与结构堆的实现向上调整算法(插入数据)向下调整算法 堆的应用堆排序(建堆)向…...
【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…...
AI驱动新增长:亚马逊Rufus广告点击率提升300%的奥秘
在生成式人工智能迅速融入商业应用的背景下,全球跨境电商巨头亚马逊(Amazon)正以前所未有的速度重构其广告生态。2024年第一季度,据亚马逊官方披露,通过部署内部开发的AI购物助手“Rufus”,其平台部分广告点…...
osgEarth中视角由跟随模式切换到漫游模式后没有鼠标拖拽功能问题分析及解决方法
遇到了一个棘手的问题,就是在由跟随模式切换到漫游模式的时候,鼠标无法实现拖拽功能。后来发现是前面给自己挖的坑。 因为要实现鼠标点选某个模型后,模型需要变红色显示,所以添加了一个事件处理程序。 // 创建 场景中模型的点选功能 事件处理程序 ModelSelectionHandler* …...