ESbuild 简介

news/2024/7/10 22:35:23 标签: 前端, javascript, es6

Esbuild 是什么:

ESbuild 是一个类似webpack构建工具。它的构建速度是 webpack 的几十倍。


为什么这么快 ?

js是单线程串行,esbuild是新开一个进程,然后多线程并行,充分发挥多核优势

go是纯机器码,肯定要比JIT快

不使用 AST,优化了构建流程。(也带来了一些缺点,后面会说)

ESbuild 使用介绍

ESbuild 文档: esbuild - API​

Esbuild 有命令行 ,js 调用, go 调用三种使用方式。这里主要讲利用 js 调用的方式。

利用 esbuild 编译代码

esbuild 提供了 writeFileSync/writeFile 对 code 进行编译, demo 如下

javascript">require('fs').writeFileSync('in.ts', 'let x: number =   1')
require('esbuild').buildSync({
  entryPoints: ['in.ts'],
  outfile: 'out.js',
})


利用 esbuild 处理 jsx 代码

javascript">require('esbuild').transformSync('<div/>', {
  jsxFactory: 'h', //默认为 React.CreateElement,可自定义, 如果你想使用 Vue 的 jsx 写法, 将该值换成为 Vue.CreateElement
  loader: 'jsx', // 将 loader 设置为 jsx 可以编译 jsx 代码
})
 
// 同上,默认为 React.Fragment , 可换成对应的 Vue.Fragment。
require('esbuild').transformSync('<>x</>', {
  jsxFragment: 'Fragment',
  loader: 'jsx',
})


利用 esbuild 压缩代码体积

esbuild 提供了一个 minify 配置允许用户去压缩代码体积,实际 demo 如下

javascript">var js = 'fn = obj => { return obj.x }'
require('esbuild').transformSync(js, {
  minify: true,
})
 
// minify 后
{
  code: 'fn=n=>n.x;\n',
  map: '',
  warnings: []
}


处理其他资源

与webpack不同的是,esbuild内置了一些文件处理的loader。 当esbuild解析到某后缀时,会自动使用该loader进行处理。 当然,你也可以手动指定对应的loader处理器,如你想使用jsx loader去处理js文件。可以按下面的实例进行配置。 目前Esbuild 内置了 js,jsx,ts,tsx,css,text,binary,dataurl,file类型的loader

javascript">require('esbuild').buildSync({
  entryPoints: ['app.js'],
  bundle: true,
  loader: { '.js': 'jsx' }, // 默认使用 js loader ,手动改为 jsx-loader 
  outfile: 'out.js',
})


在Webpack中使用esbuild

在当前前端环境中,直接使用 esbuild 代理 webpack 是不现实的。在目前的主流方案是在 webpack 中使用 esbuild 去做一些代码的 transform (代替 babel-loader)。

Webpack 构建流程

先讲讲 webpack 的构建流程:Webpack原理浅析


Webpack 的构建流程简单来说就是递归编译每一个模块文件,对于不同类型的文件使用不同的 webpack loader 进行处理。我们要做的就是就是将 webpack 中做代码转化的步骤(babel-loader, ts-loader) esbuild-loader 代替。

esbuild-loader

esbuild-loader 就是一个这样的工具。简单讲下 esbuild-loader 如何使用。

首先你需要在 plugin 中引用 esbuild-plugin。 将 esbuild 的相关方法挂载在webpack中


然后就可以正常的配置 webpack 相关配置了。下面讲讲可以拿来干啥

  • 用 esbuild 代替 babel-loader(ts-loader同理) 做代码降级

  • 用 esbuild 代替 ts-loader 处理 ts 代码


  • Esbuild-loader 还可以用于minify代码


添加图片注释,不超过 140 字(可选)

esbuild 的缺点

esbuild 同样不是完美的(如果真有那么完美为什么还没有大面积使用呢?),为了保证 esbuild 的编译效率,esbuild 没有提供 AST 的操作能力。所以一些通过 AST 处理代码的 babel-plugin 没有很好的方法过渡到 esbuild 中(说的就是你 babel-plugin-import)。so,如果你的项目使用了 babel-plugin-import, 或者一些自定义的 babel-plugin 。在目前来看是没有很好的迁移方案的。

生产环境使用 esbuild 的可行性

先说结论,在生产环境下使用 esbuild 是可行的。像 snowpack , vite 等构建工具都已经是用了 esbuild 作为代码处理工具(稳定性已经足够)。如果你一定要使用,可以看看是否符合下面标准

  1. 没有使用一些自定义的 babel-plugin (如 babel-plugin-import)
  2. 不需要兼容一些低版本浏览器(esbuild 只能将代码转成 es6

那你就可以大胆使用 esbuild-loader 为你的项目提效了~

提效成果


可以看到升级完 esbuild 后提效明显。在冷启动阶段,打包速度能优化到 70% 在带 cache 的阶段,速度也能到 50%


http://www.niftyadmin.cn/n/5391824.html

相关文章

Linux:gcc的基本知识

gcc 是一个将C语言文件变成可执行文件的工具。 在Linux中&#xff0c;如果需要将一个C语言文件变得可以执行&#xff0c;那么除了这个文件本身的内容是C语言编写的内容外&#xff0c;还需要gcc这个编译工具进行编译才行。 gcc 使用的格式方法:gcc 要编译的文件 //在该代码下…

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022 摘要关键词 1 材料和方法1.1 研究区概况与数据来源1.2 研究方法 2 结果和分析2.1 蒸散发通量观测数据缺省状况2.2 蒸散发与气象因子的相关性分析2.3 不同气象因子输入组合下各模型算法精度对比2.4 随机森林回归模…

第2.5章 StarRocks表设计——行列混存表

注&#xff1a;本篇文章阐述的是StarRocks- 3.2.3版本的行列混存表 一、概述 1.1 背景 StarRocks 基于列存格式引擎构建&#xff0c;在高并发场景&#xff0c;用户希望从系统中获取整行数据。当表宽时&#xff0c;列存格式将放大随机IO和读写。自3.2.3开始&#xff0c;StarRo…

Hive的UDF开发之向量化表达式(VectorizedExpressions)

1. 背景 笔者的大数据平台XSailboat的SailWorks模块包含离线分析功能。离线分析的后台实现&#xff0c;包含调度引擎、执行引擎、计算引擎和存储引擎。计算和存储引擎由Hive提供&#xff0c;调度引擎和执行引擎由我们自己实现。调度引擎根据DAG图和调度计划&#xff0c;安排执…

机器学习——多元线性回归算法

多元线性回归算法 多元线性回归的概念 多元线性回归算法&#xff0c;即多特征量线性回归算法&#xff0c;用多个特征量来进行预测&#xff0c;如这里用多个特征量&#xff08;房子面积、卧室数量、房屋楼层数、房子年龄&#xff09;来预测房子的售价问题 多元线性回归的假设函…

Unity类银河恶魔城学习记录7-8 P74 Pierce sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill.cs using System; using System.Collections; using System.C…

Unity中URP实现水体效果(泡沫)

文章目录 前言一、给水上色1、我们在属性面板定义两个颜色2、在常量缓冲区申明这两个颜色3、在片元着色器中&#xff0c;使用深度图对这两个颜色进行线性插值&#xff0c;实现渐变的效果 二、实现泡沫效果1、采样 泡沫使用的噪波纹理2、控制噪波效果强弱3、定义_FoamRange来控制…

RobotGPT:利用ChatGPT的机器人操作学习框架,三星电子研究院与张建伟院士、孙富春教授、方斌教授合作发表RAL论文

1 引言 大型语言模型&#xff08;LLMs&#xff09;在文本生成、翻译和代码合成方面展示了令人印象深刻的能力。最近的工作集中在将LLMs&#xff0c;特别是ChatGPT&#xff0c;整合到机器人技术中&#xff0c;用于任务如零次系统规划。尽管取得了进展&#xff0c;LLMs在机器人技…