Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >B乎问题:通俗的解释下Vite能用来干嘛?是怎么回事?

B乎问题:通俗的解释下Vite能用来干嘛?是怎么回事?

作者头像
秋风的笔记
发布于 2021-08-27 03:34:38
发布于 2021-08-27 03:34:38
2.6K00
代码可运行
举报
文章被收录于专栏:秋风的笔记秋风的笔记
运行总次数:0
代码可运行

最近在B乎看到了这么一个问题,能不能通俗地讲 Vite 到底是用来干嘛的,一开始觉得这个问题没什么意思,因为 Vite 这个话题有太多的人讲了。

但是我看了看其他的回答,大部分都会从 Vite 的特性,ES Modules 去讲整件事情,然后还是会时不时要和 webpack 去做比较。

而且我又仔细看了看题主的疑问。

我也陷入了深深的思考,到底是大家学习一些新知识的时候急迫了呢?还是说前端常常容易把一些简单的东西复杂化,容易形成套娃式的知识?又或者是知识太零散了,分不清到底是哪些是有关系的?

探索Vite

我打开了 Vite 的官网,他的标语是 「 下一代前端开发与构建工具」,因为一般标语需要言简意赅地表达出它的意思,所以会用最精简的去概括(也是为了宣传)。我认为确实也没有啥毛病,但是对于一些新手而且,确实这句话不知所云,官网也没有足够清楚的图,如果是一些不了解的人,确实也容易迷失。

那么这句话到底要表达出什么意思呢?我用通俗的话表述了一遍(可能不一定准确,仅代表个人的理解):

目前大部分浏览器已经支持了ESM(ES Modules)模块的方式了,因此我写了一个转化工具,可以让一些浏览器不支持的格式(.vue/.svelte/.ts)以及不支持的语法(最新的es语法/特性)让浏览器支持,它将会成为趋势。

很多人会从 ES ModulesDev ServerVue 集成度高速度快啊各种方向来讲解它,更像是在说它的优点,我觉得有点神话它了,所以才让它变得那么神秘(迷惑)?

而在我看来 Vite 就是一个转化器,而 Webpack 就是 模块器 + 转化器。

转化器的用途就是,将一些浏览器无法解析的文件,转化成可以被浏览器解析的 js 文件,Vite 做的核心就是这个。什么用 Vite 快啊,都是浏览器自己的功劳,浏览器统一了模块化方案,Vite 只是吃了一波浏览器的性能红利而已。

用一张图来描述就是(这里我盗用了 Webpack 的官方图,改了改)

Vite 就是把所有的资源都转化成了 js 的形式去引入,因为浏览器只支持 js 文件的 ES Modles 方式,毕竟 ES Modules 属于 ECMAscript 规范,当然只能是适用于 js 了。而整个模块化过程都是浏览器的功劳。

这里再来看看 Webpack 的整体流程图,如果你对 Webpack 了解,可能能加深印象,但是不了解 webpack 也没关系。

由于 Webpack 要自己的模块化方式,因此需要将所有的资源都打包成一个 js,这个图很形象地解释了 Webpack 的作用。(对于不了解 Webpack 的也没有关系,知道 Vite 的图就够了。)

我举一个例子,可能能让你更加清楚地去理解 Vite 的真面目。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.html
<script type="module" src="main.js"></script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
import { element, text } from './el.js';

const container = element('div');

const h1 = element('h1');

const t = text('Hello ES Modules');

h1.appendChild(t);

container.appendChild(h1);

document.body.appendChild(container);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// el.js
export function element(name) {
 return document.createElement(name);
}

export function text(data) {
 return document.createTextNode(data);
}

VS Code 装一个 Live Server , 然后启动这个 html, 然后我们随便改点东西,可以看到,更新速度的非常快。

也许你会说,我文件数量太少了,没事,我们这次来整活20个文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');

const LENGTH = 20;

new Array(LENGTH).fill(0).forEach((item, index) => {
    fs.writeFileSync(`child-${index}.js`, `
    export { child } from './child-${index+1}.js';
    `)
})

fs.writeFileSync(`child-${LENGTH}.js`, `
import { element, text } from '../el.js';

export function child() {
    const c = element('div');
    const t = text('child');
    c.appendChild(t);
    document.body.appendChild(c);
}
`)

所以我说,Vite 本质是拨除了 webpack 模块化功能后的一个转化器。

但是尽管浏览器解决了模块化的依赖,依旧是有两个问题:

  1. 但是没办法支持一些样式/文件(css/ttf/jpg...)资源的 import 语法
  2. 无法支持.ts/.vue/.svelte 等模板语法(或者高级特性)的直接引用

所以,才会有我们看到 Vite 仿佛又做了很多事情,因为 Vite 能够去加载 .ts/.vue/.svelte 等文件, 它整合了很多插件去做这些转化工作,将所有的资源都转化成浏览器可识别的 js 的方式去导入,将 css 文件经过包装,转化为一个 js 文件等等。

剩余的就是原文件中的内容替换,因为类似于像第三方包中的资源没办法直接引入,需要做一层替换,例如一下代码就被转化成了这样。

在编译的时候需要去替换我们实际写代码的地址,去让浏览器加载,然后为了不让浏览器加载文件太多,还要将第三方包导成一个模块,然后还有热更新功能(这部分功能稍微复杂一些)。并且为了能够在生产环境打包(Tree shaking / 压缩啊,等等之前常规的优化),使用了 Rollup ,不仅提供了 ESM 的打包方式,以及你需要的其他模块化方式(umd/amd/cmd/iife)。

因此核心是简单的,但是相关的生态想要好用,却是要花大量的精力,Vite 团队也是花了大力气去解决了周边的生态问题,各种插件的适配啊等等。

首创的ESM

而首次提出利用浏览器原生ESM能力的工具并非是Vite,而是一个叫做Snowpack的工具(可以看我这篇文章 《模块化系列》snowpack,提高10倍打包速度。)。前身是@pika/web,从1.x版本开始更名为Snowpack。

Snowpack在其官网是这样进行自我介绍的:“Snowpack是一种闪电般快速的前端构建工具,专为现代Web设计。它是开发工作流程较重,较复杂的打包工具(如Webpack或Parcel)的替代方案。Snowpack利用JavaScript的模块化方式(称为ESM)来避免不必要的工作并保持流畅的开发体验”。

为此,Pika团队开发并维护了两个技术体系:构建相关的Snowpack和造福大众的Skypack。其中 skypack 上还有很多特殊处理过的 ES Modules 形式的包(例如 React 等)直接用来调用,由于那些包原先是不支持 ES Modules 形式,他们单独维护了 ES Modules 版本。

看完了 ES Modules 的现状以及 Vite 的本质,我们就再来把模块化来回顾一下,这样整个时间线就完整了以及我们的开发方式变化到现在,Web 真的做出了巨大的努力。

模块化简史

把时间回退到2006年,这个时候 jQuery 刚呱呱落地,那个时候虽然没有模块化,使用 jQuery 相比传统那样写已经提高极大的速度,当然虽然已经很方便了,单还是阻挡不了爱研究的程序员们。

在2009年的时候 「CommonJS」 诞生了,但是 「CommonJS」 由于有两个重要问题没能得到解决,所以迟迟不能推广到浏览器上。(1.由于外层没有 function 包裹,被导出的变量会暴露在全局中。2.在服务端 require 一个模块,只会有磁盘 I/O,所以同步加载机制没什么问题;但如果是浏览器加载,一是会产生开销更大的网络 I/O,二是天然异步,就会产生时序上的错误。)中间百家争鸣(「AMD、CMD、UMD」)一直到2016年5月,经过了两年的讨论,ECMAScript 6.0 终于正式通过决议,成为了国际标准。在这一标准中,首次引入了 importexport 两个 JavaScript 关键字,并提供了被称为 「ES Module」 的模块化方案。在 JavaScript 出生的第 21 个年头里,JavaScript 终于迎来了属于自己的模块化方案。而在这期间想要使用模块化,只能通过打包工具来解决。

有了标准之后,也不是能立马让所有设备都支持 「ES Module」 因为浏览器的推进是一个漫长的过程,不像服务端,如果做一个升级,只需要对服务端升级,而浏览器的升级伴随着电脑/手机等一系列的因素,因素非常不可控,因为用户总是可以有多种多样的选择,「ES Modules(ESM)」 是 JavaScript 官方的标准化模块系统,而它这一走,却在标准化的道路上已经花费了近 10 年的时间。在2018 年 5 月 Firefox 60 发布之后,所有的主流浏览器就都支持 「ESM」 了。直到现在,「ES Module」 还并不能真正地用在生产环境使用,还是需要转化成以旧的方式(非ESM方式)。

写在最后

当回答完这个问题的时候,不禁会想,前端的发展过程中却是会有一些新瓶装旧酒的东西,然后神话它,然后让小白觉得它很高大上,让人惧怕,然后大佬就会觉得这个东西很简单,也不愿意去拆解它,是否我们需要转化一些思考,当我们讲一个东西的时候,剥离那些高大上的词汇,做一些更加亲民的解释?当然我不否则这些新的工具带来的便利以及背后的付出,但是亲民是否也是一种方式,或许会变得更加美好?答案我也不得而知,本文只是作出了自己的一个思考,如有错误请大家批评指出。

参考

https://segmentfault.com/a/1190000039370642

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秋风的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vite 原理浅析及应用
Tips: 如果大家想直接看重点可以跳过前言,这里将介绍一下为什么我会有这次分享,也就是本次分享的背景以及目的。
离殊
2022/04/01
1.7K1
Vite 原理浅析及应用
Vue3 中的脚手架工具Vite到底牛在哪, 一文全知道
Vue是一套用于构建用户界面的渐进式框架,与其它大型 JS 框架不同,Vue 被设计为可以自底向上逐层应用,更易上手,还便于与第三方库或既有项目整合,因此,Vue完全能够为复杂的单页应用提供驱动。
秋风的笔记
2021/07/09
1.9K0
Vite和Webpack的核心差异
写在开头 最近的vite比较火,而且发布了2.0版本,vue的作者也是在极力推荐 在之前的文章里面我提到过,vite的缺点在于目前的生态不够webpack成熟,但是只要能弥补这个缺点,便有很大概率能替代目前webpack的大部分市场 全方位对比vite和webpack webpack打包过程 1.识别入口文件 2.通过逐层识别模块依赖。(Commonjs、amd或者es6的import,webpack都会对其进行分析。来获取代码的依赖) 3.webpack做的就是分析代码。转换代码,编译代码,输出代码 4.
公众号@魔术师卡颂
2021/03/15
4.3K0
Vite 特性和部分源码解析
本文首发于政采云前端团队博客:Vite 特性和部分源码解析 https://www.zoo.team/article/about-vite Vite 的特性 Vite 的主要特性就是 Bundle
政采云前端团队
2021/07/19
8270
153.精读《snowpack》
基于 webpack 构建的大型项目开发速度已经非常慢了,前端开发者已经逐渐习惯忍受超过 100 秒的启动时间,超过 30 秒的 reload 时间。即便被寄予厚望的 webpack5 内置了缓存机制也不会得到质的提升。但放到十年前,等待时间是几百毫秒。
黄子毅
2022/03/14
5920
153.精读《snowpack》
Vite 学习(一) - 介绍
vite 是一个基于浏览器原生 ES-Module 的前端构建工具。官网描述为 下一代前端开发与构建工具。
测不准
2022/01/14
5480
Snowpack,新时代前端构建的先锋
今天给大家介绍一个非常厉害的前端构建工具——Snowpack。也许你之前听说过前端领域非常多的打包工具,诸如 Webpack、Rollup,或者Parcel,甚至是现在在前端圈大火的 Bundleless 构建工具Vite,但大家也许并没有注意到 Snowpack。
用户3806669
2021/10/12
5490
探索Vite开发服务核心工具之:预优化(Pre-Bundling)
[15dz2gbnov.jpg] 背景 前段时间用Vite2.x造了个Vue3的个人项目,在Vite的加持下,无论是项目冷启动、热更新和构建,比起webpack速度都提升n00%(n≥10)以上,怀着强烈的好奇心,就把Vite的源码搞了下来学习下,顺便水篇文章方便以后重温😂😂😂。 认识构建工具的开发服务「Dev server」 开发服务是指开发者在本地开发前端项目时,构建工具会额外启动的一个本地服务。如执行npm run dev命令后,框架执行服务启动操作,启动完成后,你就能通过浏览器输入http://lo
南山种子外卖跑手
2022/02/22
1.5K0
探索Vite开发服务核心工具之:预优化(Pre-Bundling)
Webpack多页面项目转Vite升级初尝试
本文非深入了解,从中你能对Vite有个初步的认识,以此来对比与Webpack的差异,看完后你能了解到以下内容:
gary12138
2022/10/05
1.9K0
Webpack多页面项目转Vite升级初尝试
ESModule 系列 (二):构建下一代基础设施 PDN
简单来讲,这些站点都做了一件事情:将 npm 仓库上的包转化成支持 esmodule 的版本并通过 url 来进行分发。
winty
2021/09/17
1.3K0
ESModule 系列 (二):构建下一代基础设施 PDN
Vue Conf关于Vite的分享给我带来的启发
Vite在去年就已经出来了,但我真正的去了解它却是在最近Vue Conf上李奎关于Vite: 下一代web工具的分享。其中他提到的几点吸引到了我。分享的开始,他简要说明了本次分享的关键点:
前端森林
2021/06/25
6650
Vue Conf关于Vite的分享给我带来的启发
前端构建这十年
前端模块化/构建工具从最开始的基于浏览器运行时加载的 RequireJs/Sea.js 到将所有资源组装依赖打包 webpack/rollup/parcel的bundle类模块化构建工具,再到现在的bundleless基于浏览器原生 ES 模块的 snowpack/vite,前端的模块化/构建工具发展到现在已经快 10 年了。
IT大咖说
2021/09/08
1K0
前端构建这十年
渐进式 Unbundled 开发工具探索之路
业界主流的开发工具还是以 Webpack 为主,随着项目体积增大,开发阶段一次性将源代码和第三方依赖编译处理打包到一起的耗时会显著增加。在我们团队内部的 monorepo 仓库中,应用项目开发时,为了开发阶段调试方便,通常也会对一些公共库源码一起打包编译,成千上万个模块导致首次 dev server 启动耗时在几分钟甚至十几分钟,严重影响了开发效率与体验。
winty
2021/07/01
1.4K0
渐进式 Unbundled 开发工具探索之路
vite —— 一种新的、更快地 web 开发工具
vite —— 一个由 vue 作者尤雨溪开发的 web 开发工具,它具有以下特点:
lucifer210
2020/06/15
1.7K0
三大前端构建工具横评,谁是性能之王!
而在Vite之前,还有Snowpack也同样采用了No-Bundler构建方案。那么No-Bundler模式与传统老牌构建工具Webpack孰优孰劣呢?能否实现平滑迁移和完美取代?
Nealyang
2021/03/26
2.1K0
三大前端构建工具横评,谁是性能之王!
浅谈低代码平台远程组件加载方案
低代码开发平台(LCDP)是无需编码(0代码)或通过少量代码就可以快速生成应用程序的开发平台。通过可视化进行应用程序开发的方法,使具有不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程序。这两年越来越多的公司和开发人员开始自研低代码平台来达到降本提效的目的。今天和大家分享一下低代码平台开发过程中遇的一个问题和对应的解决思路。
CRMEB商城源码
2022/08/03
2.5K1
前端新的构建范式
前端的交付基于浏览器,资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,是前端发展中一直探索的难题。
奋飛
2021/09/30
7780
前端新的构建范式
新一代构建工具(1):对比rollup/parcel/esbuild—esbuild脱颖而出
字节前端是如何基于 ESBuild 的做现代化打包设计? https://mp.weixin.qq.com/s/bS_qwiOIMqFN1sfuPKTUbA
周陆军博客
2022/06/25
2.7K0
[调研报告] 新一代前端构建工具汇总
说起前端构建,大家一定首先想到 Webpack,确实它是前端构建的老大哥了,大而全,什么场景都能满足,社区生态爆炸。但是社区里也有许多其他优秀的构建工具,他们或许不如 Webpack 那样“包治百病”,但他们都有一些独特的优势,如果在一些特定的场景你觉得使用 Webpack 太臃肿了,那你或许可以考虑下面的一些工具。
Tecvan
2022/05/18
1K0
[调研报告] 新一代前端构建工具汇总
站在潮流前沿,不到100行代码快速实现一个简易版 vite
本文最终实现的简易版 vite 可通过github 地址(https://github.com/levelyu/simple-vite)下载,代码实现地较为简单(不到 100 行)可运行后再看此文,阅读效果可能更佳~
winty
2021/07/01
9370
站在潮流前沿,不到100行代码快速实现一个简易版 vite
相关推荐
Vite 原理浅析及应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文