当前位置: 首页 > news >正文

esbuild入门

esbuild 是一款基于 Go 语言开发的 javascript 构建打包工具,相比传统的构建工具,主打性能优势。同样规模的项目,使用 Esbuild 可以将打包速度提升 10 - 100 倍,目前vite开发阶段使用esbuild, 生产阶段使用rollup;为什么生产阶段不使用esbuild呢?是因为esbuild只支持es6以上的版本。

esbuild命令行调用

使用 Esbuild 有 2 种方式,分别是 命令行调用代码调用

无论如何我先npm init -y创建一个新项目,然后通过如下的命令完成 Esbuild 的安装:

npm i esbuild

查看esbuild版本

./node_modules/.bin/esbuild --version

创建ts文件

const sayHello = (text:string) => { console.log(`hello ${text}`);
}
sayHello('world!');

ts文件编译,指定输出文件位置

// 直接输入命令
./node_modules/.bin/esbuild src/index.ts --outfile=dist/index.js
// 配置命令
"scripts": {"esbuild": "esbuild src/index.ts --outfile=dist/index.js"
}

对比tsc的编译

tsc src/index.ts

默认转成的是ES5语法

var sayHello = function (text) {console.log("hello ".concat(text));
};
sayHello('world!');

可以给一些参数

tsc src/index.ts --target es6 --outFile dist/index.js

其实esbuild也能指定ES的转换版本

./node_modules/.bin/esbuild src/index.ts  --outfile=dist/index.js --target=esnext

但是注意,esbuild只支持es6以上的版本,因此,如果你指定es5的版本,就会报错

输入命令:

./node_modules/.bin/esbuild src/index.ts  --outfile=dist/index.js --target=es5

报错如下:

报如下错误:Transforming const to the configured target environment ("es5") is not supported yet ...

关键是要看执行了多少时间

time tsc src/index.ts --target es6 --outFile dist/index.js

注意time为liunx命令,这里只是演示时间效果,windows系统上不能复现这个命令效果不用强求

npx 软件包运行器

如果你想执行一个本地安装的软件包,你只需要输入:

$ npx your-package

npx 将检查 <command><package> 是否存在于 $PATH 或本地项目的二进制文件中,如果存在,npx 将执行它。

上面的代码可以直接简写为

npx esbuild src/index.ts --outfile=dist/index.js

执行以前没有安装的软件包

npx甚至能够执行以前没有安装的软件包。

让我们通过运行来测试一下:

$ npx cowsay hello world    

bundle

npx src/index.ts  --outfile=dist/index.js --target=es6 --bundle

--bundle启用后,默认输出格式设置为iife,它将生成的 JavaScript 代码包装在立即调用的函数表达式中,以防止变量泄漏到全局范围内。

这样看着不是太明显,我们可以导入react相关包,模拟一下相关打包情况

npm install react react-dom @types/react @types/react-dom

App.tsx

import * as React from 'react'
import * as Server from 'react-dom/server'
​
let Greet = () => <h1>Hello, world!</h1>
console.log(Server.renderToString(<Greet />))

我们可以直接将这个tsx文件进行编译打包,你会看到,包括react的相关内容,也都会打包到生成的文件中

npx esbuild src/App.tsx --outfile=dist/app.js --bundle

当然,如果你想压缩的话,也可以很简单的加上--minify属性

npx esbuild src/App.tsx --outfile=dist/app.js --bundle --minify

Content Types

但是这里你需要留意一个问题,tsx其实是react的语法后缀,但是esbuild也能直接进行默认编译。esbuild内置了内容类型,每个内容类型都有一个关联的“加载器”-loader。它告诉 esbuild 如何解释文件内容。默认情况下,某些文件扩展名已经为其配置了加载器

比如,如果后缀名是tsx或者jsx,就会自动的加载jsx loader加载器。换句话说,如果后缀名不为tsx或者jsx,我们可以手动的为其设置加载器loader

测试:text.ts,下面的jsx代码肯定会报错,不过这里不纠结,直接在编译的时候,使用loader进行转换

import * as React from 'react'
import * as Server from 'react-dom/server'
​
let Greet = () => <h1>Hello, world!</h1>
console.log(Server.renderToString(<Greet />))
npx esbuild src/test.ts --bundle --outfile=dist/test.js --loader:.ts=tsx

当然有一些并非默认就可以直接处理的,比如图片,我们加入张图片到App.tsx的代码中

import * as React from 'react'
import * as Server from 'react-dom/server'
import logo from "./assets/react.svg"
​
let Greet = () => (<div><img src={logo} /><h1>Hello, world!</h1></div>)
console.log(Server.renderToString(<Greet />))

由于我们并没有工程化的导入react工程,因此TS类型肯定会有一些问题,我们可以简单的引入一下svg的类型,直接在根目录下创建types.d.ts文件,声明图片类型

declare module '*.svg' {const src: stringexport default src
}

一般情况下,我们通过脚手架创建的项目,其实都会有一个类似于react-app-env.d.ts或者 vite-env.d.ts文件,里面内容大致如下:

/// <reference types="react-scripts" />
或者
/// <reference types="vite/client" />

你可以在对应的types声明文件中找到相应的类型声明

无论怎么样,加入了图片之后,再通过esbuild直接打包,就会报错

对于一些简单的图片,我们可以直接通过data url来进行处理,加上下面的属性,可以把svg图片转换为

npx esbuild src/app.tsx --outfile=dist/app.js --bundle --loader:.svg=dataurl

文章转载自:

http://bcbpZOVC.Lrwsk.cn
http://lIurWh6B.Lrwsk.cn
http://ExuWMCeb.Lrwsk.cn
http://7Ola1ce4.Lrwsk.cn
http://bTnJW7nj.Lrwsk.cn
http://1zhNf4nl.Lrwsk.cn
http://o15TlvsA.Lrwsk.cn
http://AbveSXog.Lrwsk.cn
http://K2bonE2G.Lrwsk.cn
http://a3wnFnrR.Lrwsk.cn
http://i8Ys5uT6.Lrwsk.cn
http://B4GNEzrg.Lrwsk.cn
http://o24KqRAp.Lrwsk.cn
http://BBi9Gppt.Lrwsk.cn
http://ddG2QN5t.Lrwsk.cn
http://oaNZtMy8.Lrwsk.cn
http://Vx7x0otx.Lrwsk.cn
http://kUG12EhQ.Lrwsk.cn
http://DJ27UdX9.Lrwsk.cn
http://M4OZIelQ.Lrwsk.cn
http://zZl2iBoH.Lrwsk.cn
http://K23a1khj.Lrwsk.cn
http://7SErhFNL.Lrwsk.cn
http://gmiGvCJP.Lrwsk.cn
http://HIfdib8E.Lrwsk.cn
http://GDHsG2R5.Lrwsk.cn
http://UM3LnBEF.Lrwsk.cn
http://w5zR2DKO.Lrwsk.cn
http://23Y4nEuF.Lrwsk.cn
http://qdszbiYR.Lrwsk.cn
http://www.dtcms.com/a/371236.html

相关文章:

  • 决策树概念与原理
  • More Effective C++ 条款31:让函数根据多个对象来决定怎么虚拟
  • Python列表:从入门到灵活运用的全攻略
  • 校园洒水车cad+三维图+设计说书
  • 机械硬盘的工作原理
  • 生命周期方法:didUpdateWidget
  • Pie Menu Editor V1.18.7.exe 怎么安装?详细安装教程(附安装包)​
  • ragflow MCP 调用核心提示词解析:逻辑闭环与优化方向
  • Knative Serving:ABP 应用的 scale-to-zero 与并发模型
  • Xsens帮助独立工作室创造引人注目的冒险游戏真实角色动画
  • 《动手学深度学习v2》学习笔记 | 2.4 微积分 2.5 自动微分
  • 【开题答辩全过程】以 哈尔滨裕丰草莓园管理系统为例,包含答辩的问题和答案
  • 国内外支持个人开发者的应用市场
  • 【LLIE专题】SIED:看穿0.0001lux的极致黑暗
  • ANSYS HFSS边界条件的认识
  • python系列之综合项目:智能个人任务管理系统
  • IOC为什么交由spring容器管理?
  • spring事务传播机制
  • LeetCode_数学
  • (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
  • 虚拟化技术
  • 【74页PPT】MES简介(附下载方式)
  • 基于Pygame的六边形战术推演系统深度剖析——从数据结构到3D渲染的完整实现(附完整代码)
  • 强化学习入门:从零开始实现DDQN
  • 开启Python之路,第一节学习大纲-从入门到进阶
  • 单词分析与助记之数据建表(以production为例)
  • 【温室气体数据集】亚洲地区长期空气污染物和温室气体排放数据 REAS
  • 高精度地图
  • 美陆军启用数字仿真与分析中心;首次测试AI空战指挥官“星智“系统;五角大楼计划削减关键技术清单
  • 《秦时明月》系列经典语录分享