首页 > 其他分享 >Vite本地构建:手写核心原理

Vite本地构建:手写核心原理

时间:2024-07-28 17:07:31浏览次数:10  
标签:style const ctx 构建 模块 path 手写 Vite 加载

前言

接上篇文章,我们了解到vite的本地构建原理主要是:启动一个 connect 服务器拦截由浏览器请求 ESM的请求。通过请求的路径找到目录下对应的文件做一下编译最终以 ESM的格式返回给浏览器。

基于这个核心思想,我们可以尝试来动手实现一下。

搭建静态服务器

基于koa搭建一个项目:

项目结构如上,服务使用koa搭建,bin指定cli可执行文件的位置

#!/usr/bin/env node
// 代表该脚本使用node执行

const koa = require('koa');
const send = require('koa-send');



const App = new koa()

App.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

这样一个服务就搭建好了,为了方便调试,我们在该工作目录下执行npm link,这样可以将该项目链接支全局的npm,相当于全局安装了这个npm包。

接着我们在任意项目下执行my-vite就能够启动该服务了!

处理根目录html文件

由于上面服务我们没有对任何路由进行处理,当访问http://localhost:3000会发现什么也没有,我门首先需要将项目的模版文件index.html返回给浏览器

const root = process.cwd(); // 获取当前工作目录
console.log('当前工作目录:', process.cwd());

// 静态文件服务区
App.use(async (ctx, next) => {
    // 处理根路径,返回index.html
    await send(ctx, ctx.path, { root: process.cwd() ,index: 'index.html'});
    await next();
});

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 + Vue + TS</title>
  </head>
  <body>
    <div id="app"></div>
    <script>
      window.process = { env: { NODE_ENV: 'development' } };
    </script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

就是以ESM的方式加载了vue的入口文件main.ts

加完这段代码,我们在vue3项目下执行一下my-vite

来到浏览器看一下此时的情况:

此时浏览器加载了main.ts,该文件如下:它通过import引入了两个模块

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


createApp(App).mount('#app')

按理来说,浏览器此时应该会接着发起请求,去获取这两个模块,但现在却并没有

标签:style,const,ctx,构建,模块,path,手写,Vite,加载
From: https://www.cnblogs.com/songyao666/p/18328452

相关文章

  • 联通国际专线产品:构建全球无缝连接新纪元
    联通国际专线产品:构建全球数据传输的坚固桥梁在全球化日益加深的今天,跨境、跨地域的数据传输已成为企业日常运营不可或缺的一部分。为了确保数据传输的安全性、高效性和稳定性,中国联通精心打造了国际以太网专线(IEPL)和国际专线(IPLC)两款国际专线产品,旨在为全球客户提供卓越的专有国......
  • PWA实战:从零构建高性能渐进式应用
    摘要渐进式Web应用(PWA)是一种使用现代Web技术构建的应用程序,它具有原生应用程序的功能,例如离线访问、推送通知和安装到主屏幕的能力。本文将引导您从零开始构建一个高性能的PWA,并涵盖关键技术点,如ServiceWorkers、缓存策略、离线支持和性能优化。1.引言随着移动互联网的普......
  • 7.28《构建之法》读后感
    在7.6号,从网上购买了此书之后,就从中了解了软件工程这个专业的各种细节,对此我作出如下总结:《构建之法》这本书,作为一本全面而深入地探讨现代软件工程的著作,给我留下了深刻的印象。从初次翻开书页到细细品读,我不仅收获了丰富的知识,更在思维方式和职业态度上得到了极大的提升。以下......
  • 在 Django 中构建动态任务和徽章评估系统
    模型任务classQuest(models.Model):name=models.CharField(max_length=255)description=models.TextField(blank=True)criteria=models.JSONField()#StorecriteriaasJSONreward_points=models.IntegerField(default=0)def__str_......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 【深入理解SpringCloud微服务】深入理解Ribbon原理并手写一个微服务负载均衡器
    深入理解Ribbon原理并手写一个微服务负载均衡器负载均衡器理解Ribbon原理手写一个微服务负载均衡器总体设计LoadBalanceClientHttpRequestFactorySimpleLoadBalanceClientSimpleLoadBalancerLoadBalanceRulespring.factories与LoadBalanceConfig负载均衡器在微服务......
  • 使用vite创建react项目并进行初始化(仓库、路由、封装)
    前言学的时候都是跟着教程进行创建,后面发现自己写项目的时候记不住需要做什么,所以现在写一篇来给自己总结一下。(后面忘了也不用翻视频了,直接照着抄答案)只写流程,没有理论。这是我写的习惯,只具备一定通用性,有需要可参考。创建项目npmcreatevite@latestHireSpherenpmins......
  • 《构建之法》读后感
    在踏入软件开发的广阔领域之初,我如同许多初学者一样,对“软件工程”这一概念充满了既好奇又模糊的认识。我的学习与实践,往往是基于项目需求,边做边学,缺乏系统性和前瞻性的规划。阅读了邹欣老师的《构建之法——现代软件工程》一书后,我仿佛打开了一扇窗,让软件工程的全貌和精髓跃然纸......
  • Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files
    从CMake构建和编译第三方依赖库的步骤:1、下载第三方依赖库的源码,并解压到指定的目录中。2、在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build。3、打开CMakeGUI软件,按照常规步骤配置和产生针对某种编译器的解决方案文件,比如Visualstudio2019。如下如......
  • 从零手写实现 nginx-33-http_proxy 代理验证测试
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......