vite & webpack

async defer commonJs esm

1.浏览器执行普通的script脚本,他不支持require。因为要防止阻塞,采用AMD(利用onload事件和script脚本的创建)。

async 和 defer 仅管理script脚本的加载 async是在下载完立刻执行。 defer推迟到DOM解析完(DOMLoadedContent)。async 和 defer 哪个按照顺序执行?async不按照顺序(不确定哪个先下载完)。 defer可以确定顺序。

2.esm 在script中添加(type = module) 在编译时确定依赖关系,并行加载,不像AMD和CommonJS在运行时确定关系。基本数据类型会绑定,类似于响应式。模块的加载不会阻塞页面。

webpack

打包:

浏览器不支持像是commonJs的模块引入方式和一些特殊格式的语法,像是裸模块或者图片引入。所以需要对代码进行打包组合到一起,转换成浏览器看得懂的代码。

webpack会从配置的起始文件进行递归的依赖分析,分析出依赖项,然后构建出依赖地图。

然后将代码进行loader处理,转换成浏览器看的懂的代码,像是图片的import变成路径,ts转换成js,css转换成html内的css等,es6转换成es5等。

接着将代码进行打包成一个或者多个bundle模块,这里会进行一系列的优化,像是如压缩代码、删除死代码 Tree-Shaking、提取公共模块 SplitChunks。

运行时:

通过服务器来返回html文件,使用websocket进行双向连接。当本地使用的库监听到代码发生变化之后,便重新分析收到影响的模块,通过websocket给到浏览器新的代码,然后对代码进行替换,通过vue的render函数进行重新的渲染。

tree-Shaking:

loader:

plugin:

这个过程中是非常的耗时的。

但是esm中浏览器会构建模块的依赖图谱,同时并行加载文件(加载指的是获取并读取文件的内容)

vite

打包:

运行时:

1.解析正确的路径。 将裸模块和路径解析到正确的文件和路径。

2.将.vue文件进行分割成template script style,将scrpit部分先获取,然后返回给浏览器 script + 'import template' 部分,浏览器检测到import 对template部分进行二次请求编译处理。

热更新: 借助 WebSocket 建立前后端的连接,通过类似于 chokidar 这样的文件监听的库来实时监听整个项目中的所有文件资源,当有资源发生变更的时候就向客户端推送一个更新通知,客户端做刷新项目的操作。

rollup & esbuild

bun

  • webpack 如何解析不同模块规范(CommonJS、ES6 Module、AMD、UMD)?
  • webpack 的代码分割(Code Splitting)有哪几种实现方式,对比 "同步代码分割" 与 "动态 import (() => import ())"
相关推荐
奕鼎竜瑆17 分钟前
Chrome 插件开发实战指南:从入门到发布
前端·chrome
广州华水科技23 分钟前
水库北斗GNSS变形监测系统及单北斗形变监测一体机应用解析
前端
anew___2 小时前
《从零手写操作系统 (20):ELF加载器——让OS读懂现代编译器》
java·服务器·前端
ss2732 小时前
AI全栈实战 | 2.3-01 组件库实战:Element Plus 怎么搭出专业界面,过度封装为什么成维护负担
前端·javascript·elementui·vue
对空六课2 小时前
动态按钮ID变化时的稳定埋点标识设计
前端·数据分析
福兮说2 小时前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
吴声子夜歌2 小时前
Nginx应用与运维——Nginx Web服务应用实战(Python网站的搭建)
运维·前端·nginx
小的时候可菜了2 小时前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript
liangshanbo12152 小时前
Webpack vs Vite 底层原理高频追问的问题
前端·webpack·node.js
web打印社区3 小时前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript