| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 前端打包工具Esbuild--模块化、ESM、esbuild-loader、 -> 正文阅读 |
|
[JavaScript知识库]前端打包工具Esbuild--模块化、ESM、esbuild-loader、 |
模块化编程在前端领域已非常普遍,应用程序中将各种功能细分成独立的模块(单独文件)进行开发。module bundler 将所有文件串联起来变成了必须。 JavaScript 社区中有很多程序的打包工具,如 Webpack、Rollup、Parcle 等,它们都是使用 JavaScript 构建的,性能方面有很多不足。下面要介绍的 Esbuild,采用 Go 语言开发,运行速度得到了显著提高。 Esbuild 也被称为下一代构建工具(使用 Go 语言编写,基于 ESM)。
其定位为一款极快的 JavaScript 打包工具。“极快”是源于同当前市场上比较流行工具的对比(下图来自官方Github)。 第一种方式,引用一些脚本来存放每个功能;此解决方案很难扩展,因为加载太多脚本会导致网络瓶颈; ESM 的出现后及相关主流浏览器的支持,ESM 模块成了首选,因为原生速度要于远远优于其他方式(不再需要引入额外的库来实现模块化)。 本文的重点是要讲述 esbuild,但在讲述之前,不得不提及ESM、Babel 和 Webpack中几个相关联的重要知识 。 ESM
通过 这里也不再赘述 ESM 的使用方式及相关语法,重点介绍执行机制,详细内容可以看这篇:
所有模块的静态依赖在该模块代码执行前都必须下载、解析并进行实例化。
浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入的代码,即只在当前屏幕上实际使用时才会被处理。 因此,引出了使用 ESM 最核心的两个特点: 1、构建复杂度非常低,修改任何组件都只需做单文件编译(不需要重新构建和重新打包应用程序的整个bundle),时间复杂度永远是 O(1) 更加详细的,可以阅读 为什么选vite BabelBabel 是一个 JavaScript 编辑器,将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。 重点介绍工作过程:
webpackWebpack 的构建流程简单来说就是递归编译每一个模块文件,对于不同类型的文件使用不同的 webpack loader 进行处理。并可以自动构建并基于你所引用或导出的内容推断出依赖的图谱。 Webpack 在很多方面处理的很好,特别是在大型项目中得到了实战测试,已成熟并且可以处理很多用例。 esbuild-loader 是一个构建在 esbuild 上的 webpack loader,且可以替代 babel-loader 或 ts-loader 来提高构建速度。
esbuildesbuild 重点提到的就是构建速度方面,为什么会比 webpack 快呢?而且不在同一个数量级。
扫描阶段: 这个阶段从一组入口点开始,遍历依赖图以找到需要在包中的所有模块。这是 编译阶段: 这个阶段为每个入口点创建一个包,这涉及首先“链接”导入和导出,然后将解析的 AST 转换回 JavaScript,然后将它们连接在一起形成最终的 bundle。这发生在 示例index.js
math.js
构建:
结果:
默认输出 iife 格式,也可以通过
针对 esm 格式,也支持 Tree Shaking
main.js 内容同上述 index.js
结果
chunk-2YHQ3R6P.js
esbuild 构建默认开启了 Tree shaking(sub 并没有被编译输出),还可以进行 minify、 sourcemap,指定 platform ,以及 watch(监视模式)等等。具体可以查看官方 API 缺点当然 esbuild 不是万能的,由于其为了保证编译效率,并没提供 AST 的操作能力,所以对一些处理 AST 的 plugin(如 babel-plugin-import) 暂时不能过渡到 esbuild 中。 总结在当前前端环境中,直接使用 esbuild 代替 webpack 不现实;主流方案是在 webpack 中使用 esbuild 去做一些代码的 transform (代替 babel-loader)。当然随时后续 vite(采用 esbuild 预构建依赖) 、snowpack 等构建工具的发展,其会在某些场景下替代 webpack(vue3 的官方推荐构建工具为 vite)。esbuild 针对构建 应用 的重要功能仍然还在持续开发中 —— 特别是代码分割(可以获得最佳的加载性能)和 CSS 处理方面。当未来这些功能稳定后,不排除使用
webpack 在 v5 版本中也是针对编译的性能做出了不少努力,除了提供了物理缓存的优化之外,还提供 Module Federation 的方案,这给我们上层的应用实践带来了很多想象的空间。以前 webpack 大有一统构建工具的趋势,而现在我们可以结合业务的特点有更多的选择。 最后通过 ESM 构建,提到 esbuild,还有一个 swc;esbuild 采用 go 语言编写,而 swc 采用 rust 语言编写。他们的速度都比目前市面上成熟的打包工具要快太多,带来性能提升的关键是底层编写语言的天生特性导致。关于这个话题esbuild为什么不用Rust,而使用了Go? 在知乎上有专门讨论,感兴趣的小伙伴可以查看一下。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/22 8:00:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |