将Vite添加到您现有的Web应用程序

news2024/11/24 17:48:05

Vite(发音为“veet”)是一个新的JavaScript绑定器。它包括电池,几乎不需要任何配置即可使用,并包括大量配置选项。哦——而且速度很快。速度快得令人难以置信。

本文将介绍将现有项目转换为Vite的过程。我们将介绍别名、填充webpack的dotenv处理和服务器代理等内容。换句话说,我们正在研究如何将一个项目从现有的bundler转移到Vite。如果你想开始一个新的项目,你会想跳转到他们的文档。

长话短说:CLI会询问您选择的框架——React、Preact、Svelte、Vue、Vanilla,甚至lit-html——以及您是否想要TypeScript,然后为您提供一个功能齐全的项目。

我们的用例

我们所看到的是基于我自己迁移booklist项目(repo)的webpack构建的经验。这个项目没有什么特别的地方,但它相当大,而且很旧,而且非常依赖webpack。因此,从这个意义上说,这是一个很好的机会,可以在我们迁移到Vite时看到一些更有用的配置选项。

我们不需要什么

使用Vite最令人信服的原因之一是,它已经做了很多开箱即用的工作,结合了其他框架的许多职责,因此配置和约定的依赖性更少,基线也更稳固。

所以,与其从喊出我们需要开始的内容开始,不如让我们回顾一下我们不需要的所有常见的网络包东西,因为Vite免费给了我们。

静态资产加载

我们通常需要在webpack中添加这样的内容:

{
  test: /\.(png|jpg|gif|svg|eot|woff|woff2|ttf)$/,
  use: [
    {
      loader: "file-loader"
    }
  ]
}

这将获取对字体文件、图像、SVG文件等的任何引用,并将它们复制到dist文件夹中,以便可以从新的捆绑包中引用它们。这是Vite的标准配置。

Styles

我在这里故意说“styles”而不是“css”,因为有了webpack,你可能会有这样的东西:

{
  test: /\.s?css$/,
  use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"]
},

// later

new MiniCssExtractPlugin({ filename: "[name]-[contenthash].css" }),

…这允许应用程序导入CSS或SCSS文件。你会厌倦听我这么说的,但Vite支持这一点。只要确保将Sass本身安装到您的项目中,Vite将处理其余的工作。

模板转换/TypeScript

很可能您的代码正在使用TypeScript和/或非标准JavaScript功能,如JSX。如果是这种情况,您将需要转换代码以删除这些内容,并生成浏览器(或JavaScript解析器)能够理解的普通旧JavaScript。在webpack中,它看起来像这样:

{
  test: /\.(t|j)sx?$/,
  exclude: /node_modules/,
  loader: "babel-loader"
},

…用相应的Babel配置来指定适当的插件,对我来说,它看起来是这样的:

{
  "presets": ["@babel/preset-typescript"],
  "plugins": [
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-syntax-dynamic-import",
    "@babel/plugin-proposal-optional-chaining",
    "@babel/plugin-proposal-nullish-coalescing-operator"
  ]
}

虽然我可能在几年前就停止使用前两个插件了,但这并不重要,因为正如我相信你已经猜到的那样,Vite为我们做了这一切。它会获取你的代码,删除任何TypeScript和JSX,并生成现代浏览器支持的代码。

node_modules

令人惊讶的是,webpack要求您告诉它从node_modules解析导入,我们这样做:

resolve: {
  modules: [path.resolve("./node_modules")]
}

不出所料,Vite已经做到了。

生产模式

我们在webpack中做的一件常见的事情是通过手动传递模式属性来区分生产环境和开发环境,如下所示:

mode: isProd ? "production" : "development",

…我们通常会这样推测:

const isProd = process.env.NODE_ENV == "production";

当然,我们通过构建过程来设置环境变量。

Vite处理这一问题的方式有点不同,它为我们提供了不同的命令来运行开发构建和生产构建,我们很快就会了解这些命令。

文件扩展

冒着拖延这一点的风险,我会很快注意到Vite也不要求您指定您正在使用的每个文件扩展名。

resolve: {
  extensions: [".ts", ".tsx", ".js"],
}

只要建立一个合适的Vite项目,你就可以开始了。

支持 Rollup 插件

这是一个关键点,我想在它自己的部分中指出。如果你在完成这篇博客文章时,仍然需要在Vite应用程序中替换一些webpack插件,那么试着找到一个等效的Rollup插件并使用它。你没有看错:Rollup插件已经(或者通常,至少)与Vite兼容。当然,一些Rollup插件所做的事情与Vite的工作方式不兼容——但总的来说,它们应该只是工作的。

详情请查看: 使用插件

你的第一个Vite项目

请记住,我们正在将现有的遗留webpack项目转移到Vite。如果你正在建造新的东西,最好开始一个新的Vite项目,然后从那里开始。也就是说,我向您展示的初始代码基本上是从Vite从一个新项目中构建的代码复制而来的,所以花点时间构建一个新的项目可能也是比较流程的好主意。

HTML入口

是的,你没看错。Vite不是像webpack那样将HTML集成放在插件后面,而是将HTML放在首位。它期望在JavaScript入口点上有一个带有脚本标记的HTML文件,并从中生成所有内容。

以下是我们开始使用的HTML文件(Vite希望将其称为index.html):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>The GOAT of web apps</title>
  </head>
  <body>
    <div id="home"></div>
    <script type="module" src="/reactStartup.tsx"></script>
  </body>
</html>

请注意,<script>标记指向/reactStartup.tsx。根据需要将其调整为您自己的条目。

让我们安装一些东西,比如React插件:

$ npm i vite @vitejs/plugin-react @types/node

我们还在项目目录中的index.html文件旁边创建以下vite.config.ts。

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

export default defineConfig({
  plugins: [react()]
});

最后,让我们添加一些新的npm脚本:

"dev": "vite",
"build": "vite build",
"preview": "vite preview",

现在,让我们用npm运行的dev启动Vite的开发服务器。它速度快得令人难以置信,可以根据请求逐步构建所需的内容。

但是,不幸的是,它失败了。至少现在是这样。

我们稍后将了解如何设置别名,但现在,让我们改为修改reactStartup文件(或您的入口文件的名称),如下所示:

import React from "react";
import { render } from "react-dom";

render(
  <div>
    <h1>Hi there</h1>
  </div>,
  document.getElementById("home")
);

现在我们可以通过npm run-dev命令运行它,并浏览到localhost:3000

HMR(热更新模块)

现在开发服务器正在运行,请尝试修改源代码。输出应该几乎立即通过Vite的HMR进行更新。这是维特最好的特点之一。当变化似乎立即反映出来,而不是等待,甚至是自己触发它们时,它会让开发体验变得更好。

这篇文章的其余部分将介绍我为使用Vite构建和运行自己的应用程序所必须做的所有事情。我希望其中一些与您相关!

Aliases(别名)

基于webpack的项目有这样的配置并不罕见:

resolve: {
  alias: {
    jscolor: "util/jscolor.js"
  },
  modules: [path.resolve("./"), path.resolve("./node_modules")]
}

这在提供的路径中为jscolor设置了一个别名,并告诉webpack在解析导入时同时查看根文件夹(./)和node_modules。这使我们可以进行这样的进口:

import { thing } from "util/helpers/foo"

…在组件树的任何位置,假设在最顶部有一个util文件夹。

Vite不允许您提供整个文件夹来进行这样的解析,但它允许您指定别名,这些别名遵循与@rollup/plugin-alias相同的规则:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

import path from "path";

export default defineConfig({
  resolve: {
    alias: {
      jscolor: path.resolve("./util/jscolor.js"),
      app: path.resolve("./app"),
      css: path.resolve("./css"),
      util: path.resolve("./util")
    }
  },
  plugins: [react()]
});

我们添加了resolve.alias部分,其中包括我们需要别名的所有条目。我们的jscolor-util被设置为相关模块,并且我们的顶级目录有别名。现在,我们可以从任何位置的任何组件导入app/、css/和util/。

请注意,这些别名仅适用于导入的根,例如util/foo。如果您的树中有其他util文件夹,并且您使用以下内容引用它:

import { thing } from "./helpers/util";

……那么上面的别名就不会搞砸了。这种区别没有很好的记录,但您可以在Rollup别名插件中看到它。Vite的别名与相同的行为相匹配。

环境变量

Vite当然支持环境变量。它从开发中的.env文件或process.env中读取配置值,并将它们注入到代码中。不幸的是,事情的工作方式与你可能习惯的有点不同。首先,它不能取代process.env。FOO,但更重要的是.meta.env。FOO。不仅如此,默认情况下,它只替换前缀为VITE_的变量。所以,import.meta.env。VITE_FOO实际上会被替换,但不是我原来的FOO。可以配置此前缀,但不能将其设置为空字符串。

对于遗留项目,您可以将所有环境变量进行grep和替换以使用import.meta.env,然后添加VITE_前缀,更新.env文件,并更新您使用的任何CI/CD系统中的环境变量。或者,您可以配置更经典的替换process.env的行为。任何在开发中具有.env文件值的东西,或在生产中具有真实进程.env值的东西。

方法如下。Vite的define功能基本上就是我们所需要的。这在开发过程中注册全局变量,并为生产进行原始文本替换。我们需要进行设置,以便在开发模式下手动读取.env文件,在生产模式下手动阅读process.env对象,然后添加适当的define条目。

让我们将所有这些构建到Vite插件中。首先,运行npm i dotenv。

现在让我们来看一下插件的代码:

import dotenv from "dotenv";

const isProd = process.env.NODE_ENV === "production";
const envVarSource = isProd ? process.env : dotenv.config().parsed;

export const dotEnvReplacement = () => {
  const replacements = Object.entries(envVarSource).reduce((obj, [key, val]) => {
    obj[`process.env.${key}`] = `"${val}"`;
    return obj;
  }, {});

  return {
    name: "dotenv-replacement",
    config(obj) {
      obj.define = obj.define || {};
      Object.assign(obj.define, replacements);
    }
  };
};

Vite设置process.env。NODE_ENV,所以我们所需要做的就是检查一下,看看我们处于哪种模式。

现在我们得到实际的环境变量。如果我们在生产中,我们会获取process.env本身。如果我们在dev中,我们要求dotenv获取我们的.env文件,解析它,并返回一个包含所有值的对象。

我们的插件是一个返回Vite插件对象的函数。我们将环境值注入到一个具有process.env的新对象中。在值前面,然后我们返回实际的插件对象。有许多挂钩可供使用。不过,在这里,我们只需要配置挂钩,它允许我们修改当前的配置对象。如果不存在定义条目,则添加一个定义条目,然后添加所有值。

但在继续前进之前,我想指出,我们正在解决的Vite环境变量限制是有原因的。上面的代码是捆绑器的频繁配置方式,但这仍然意味着process.env中的任何随机值都会被卡在源代码中(如果该键存在的话)。那里存在潜在的安全问题,所以请记住这一点。

代理配置

您部署的web应用程序是什么样子的?如果它所做的只是提供JavaScript/CSS/HTML——实际上一切都是通过位于其他地方的独立服务进行的——那就太好了!你实际上已经完成了。我给你看的应该就是你所需要的。Vite的开发服务器将根据需要为您的资产提供服务,它会像以前一样ping您的所有服务。

但是,如果你的网络应用程序足够小,以至于你的网络服务器上正在运行一些服务,该怎么办?对于我正在转换的项目,我在web服务器上运行了一个GraphQL端点。为了进行开发,我启动了Express服务器,它以前知道如何为webpack生成的资产提供服务。我还启动了一个webpack监视任务来生成这些资产。

但随着Vite推出自己的开发服务器,我们需要启动Express服务器(在Vite使用的端口之外的另一个端口上),然后在那里对/graphql进行代理调用:

server: {
  proxy: {
    "/graphql": "http://localhost:3001"
  }
} 

这个消息告诉Vite,对/graphql的任何请求都应该发送到http://localhost:3001/graphql.

请注意,我们没有将代理设置为http://localhost:3001/graphql在配置中。相反,我们将其设置为http://localhost:3001并依靠Vite将/graphql部分(以及任何查询参数)添加到路径中。

构建库

作为一个快速的奖励部分,让我们简要讨论一下构建图书馆的问题。例如,如果您只想构建一个JavaScript文件,例如像Redux这样的库,该怎么办。没有相关的HTML文件,所以您首先需要告诉Vite要做什么:

build: {
  outDir: "./public",
  lib: {
    entry: "./src/index.ts",
    formats: ["cjs"],
    fileName: "my-bundle.js"
  }
}

告诉Vite将生成的捆绑包放在哪里,称之为什么,以及构建什么格式。请注意,我在这里使用CommonJS而不是ES模块,因为ES模块不会缩小(截至本文撰写之时),因为担心它可能会破坏树的抖动。

您可以使用vite构建来运行此构建。要启动监视并在更改时重建库,您需要运行:

$ vite build --watch

总结

Vite是一个令人难以置信的令人兴奋的工具。它不仅减轻了捆绑web应用程序的痛苦和眼泪,而且在这个过程中大大提高了捆绑的性能。它附带了一个速度极快的开发服务器,该服务器附带了热模块重新加载,并支持所有主要的JavaScript框架。如果你做网络开发——无论是为了好玩,这都是你的工作,或者两者兼而有之–我再怎么强烈地推荐它也不为过。

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

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

相关文章

Springboot整合阿里云ONS RocketMq(4.0 http)

1. 引入依赖 <!--阿里云ons&#xff0c;方便的接入到云服务--> <dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</artifactId><version>1.8.4.Final</version> </dependency>2. 配置 配…

牛客周赛 46 F 祥子拆团

原题链接&#xff1a;F-祥子拆团 题目大意&#xff1a;多测&#xff0c;每次给a,b&#xff0c;要将a分解成b个数相乘&#xff0c;问有多少种分的方法。 思路&#xff1a;对a进行质因数分解&#xff0c;对每一个质数计数&#xff0c;然后分到b个篮子里面&#xff0c;允许篮子里…

SFNC —— 图像格式控制(三)

系列文章目录 SFNC —— 标准特征命名约定&#xff08;一&#xff09; SFNC —— 设备控制&#xff08;二&#xff09; SFNC —— 图像格式控制&#xff08;三&#xff09; 文章目录 系列文章目录4、图像格式控制&#xff08;Image Format Control&#xff09;1. 图像格式控制&…

Flink系列之:Generating Watermarks生成水印

Flink系列之&#xff1a;Generating Watermarks生成水印 一、水印策略简介二、使用水印策略三、处理闲置资源四、水印对齐五、编写水印生成器六、编写周期性水印生成器七、编写标点水印生成器八、水印策略和 Kafka 连接器九、Operators如何处理水印十、已弃用的AssignerWithPer…

电信网关配置管理系统 del_file.php 前台RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

护眼台灯哪个牌子最好?学生台灯护眼好还是防近视好

当前&#xff0c;我国正面临日益严峻的青少年近视挑战。从小学到大学&#xff0c;学生的近视率居高不下&#xff0c;其中高度近视的比例更是令人担忧。这不仅直接威胁到孩子们的身体健康和视力发育&#xff0c;从长远来看&#xff0c;还可能对国家的未来发展和国家安全产生不利…

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

gitlab仓库中用git bash生成不是默认路径的ssh秘钥

使用命令 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 会在默认路径生成秘钥&#xff0c;&#xff08;C:\Users\用户\.ssh\&#xff09; 想要修改默认路径使用如下命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com"…

软链接和硬链接的详解 (Linux系统下)

文章目录 硬链接的引入软链接和硬链接的形成软链接硬链接 软硬链接区别的探究硬链接数结语 硬链接的引入 当我们在命令行中输入ll时会出现很多行信息&#xff0c;详情请看下面的图 ~~~~εεε(&#xffe3;▽&#xffe3;) 我在之前的几篇Linux的文章也讲过哦 (o&#xff9f;v…

2024最新版Node.js下载安装及环境配置教程(非常详细)

一、进入官网地址下载安装包 官网&#xff1a;Node.js — Run JavaScript Everywhere 其他版本下载&#xff1a;Node.js — Download Node.js (nodejs.org) 选择对应你系统的Node.js版本 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xf…

小白Linux提权

1.脏牛提权 原因&#xff1a; 内存子系统处理写入复制时&#xff0c;发生内存条件竞争&#xff0c;任务执行顺序异常&#xff0c;可导致应用崩溃&#xff0c;进一步执行其他代码。get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中&#xff0c;可能产出竞态…

项目方案:社会视频资源整合接入汇聚系统解决方案(六)

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分类…

5G消息 x 政务 | 新型数智政务服务平台

5G消息 x 政务 | 新型数智政务服务平台 通过 5G 消息&#xff0c;帮助政府部门及公共事业部门优化服务品质、提高服务效能&#xff0c;打造现代政府的展示窗口、便民利企的服务窗口、营商环境的感知窗口&#xff0c;提供多元、透明、高效的线上政务服务。 5G消息 x 政务 —— 优…

新闻稿标题怎么写吸引人?建议收藏

一个好的标题&#xff0c;不仅能激发读者的好奇心&#xff0c;还能引导他们继续深入了解文章内容。本文伯乐网络传媒将为你揭秘新闻稿标题写作的十大技巧&#xff0c;让你轻松写出吸引人的标题。 1. 激发好奇心 a. 提出疑问&#xff1a;以问句的形式提出问题&#xff0c;让读者…

​1:25万基础电子地图(江西版)

我们在《50幅1:25万基础电子地图&#xff08;四川版&#xff09;》和《1&#xff1a;25基础电子地图&#xff08;云南版&#xff09;》等文中&#xff0c;为你分享过四川和云南的基础电子地图。 现在我们再为你分享江西的1&#xff1a;25万基础电子地图&#xff0c;你可以在文…

申请国外访问学者面签技巧有哪些?

申请国外访问学者面签是一项重要的步骤&#xff0c;关系到能否成功获得访问学者身份。以下是一些实用的面签技巧&#xff0c;帮助您顺利通过面试。 1.充分准备材料 成功的面签始于准备充分的材料。确保您的申请材料齐全&#xff0c;包括&#xff1a; 个人简历&#xff1a;突出…

Inpaint软件下载附加详细安装教程

​Inpaint是一款由Maxim Gapchenko开发的图像处理软件&#xff0c;它可以帮助用户轻松地去除图像中的水印和其他不需要的元素&#xff0c;这个软件的核心技术是基于图像处理算法的&#xff0c;它可以自动识别图片中的像素&#xff0c;并用周围的颜色进行替换&#xff0c;使得图…

新版FMEA培训内容中关于团队协作的部分可以怎么展开?

团队协作&#xff0c;作为新版FMEA的核心要素之一&#xff0c;其重要性不言而喻。在FMEA的分析过程中&#xff0c;团队成员的密切合作与沟通是确保分析全面性和准确性的关键。通过团队协作&#xff0c;不同领域的专家能够共同参与到潜在故障模式的识别、评估与预防中来&#xf…

Python 爬取淘宝指定搜索商品评论 标题 销量 计算sign

只需要替换原来的Cookie和token即可使用&#xff0c;自动计算对应链接地址的sign直接使用即可。需要注意是一个账号爬取过多会有验证码 import json import hashlib import random import timeimport pandas as pd import requestsresults []def fetch_review_list(datas, md…

MMpose安装实例

摘要&#xff1a; 这个大数据训练发展较快&#xff0c;各种版本问题&#xff0c;不太好匹配&#xff0c;仅是安装就会大费周章。本文图文并茂的描述了一种成功的安装方式。仅供参考。 使用的win版本是win11&#xff0c;英伟达显卡是GeForce GTX 1660 SUPER。 1.cuda版本选择 通…