[Esbuild] esbuild调用总结

news/2025/2/28 2:31:06/文章来源:https://www.cnblogs.com/Answer1215/p/18742458

transform API

transform/transformSync 对单个字符串进行操作,不需要访问文件系统。非常适合在没有文件系统的环境中使用或作为另一个工具链的一部分,它提供了两个参数:

transform(str: string, options?: Config): Promise<Result>
transformSync(str: string, options?: Config): Result
  1. str:字符串(必填),指需要转化的代码
  2. options:配置项(可选),指转化需要的选项

常用配置:

interface Config {define: object # 关键词替换format: string # js 输出规范(iife/cjs/esm)loader: string | object # transform API 只能使用 stringminify: boolean # 压缩代码,包含删除空格、重命名变量、修改语法使语法更简练# 通过以下方式单独配置,上述功能minifyWhitespace: boolean # 删除空格minifyIdentifiers: boolean # 重命名变量minifySyntax: boolean # 修改语法使语法更简练sourcemap: boolean | stringtarget: string[] # 设置目标环境,默认是 esnext(使用最新 es 特性)
}
// transform.mjsimport * as esbuild from 'esbuild'
const code = `
interface User{name: string;age: number;
}
let x: number = 1;
const getUserInfo = (user: User) => {console.log(user.name);console.log(user.age);
}
getUserInfo({name: 'jack', age: 18});
`let result = await esbuild.transform(code, {loader: 'ts',// minify: true,// minifyWhitespace: true,// sourcemap: true,})
console.log(result)

命令行调用

# 入口文件 esbuild xxx/index.ts
# --outfile=xxx/xxx/js 输出文件
# --outdir=xxx/ 输出目录
# --bundle 打包
# --minify 压缩
# --target=esnext
# --loader:.png=dataurl 将 png 转换成dataurl的形式

JS代码调用

Build API
const config = {};
await esbuild.build(config);
esbuild.buildSync(config); //同步方法
//esbuild.watch()
//esbuild.serve()
const ctx = await esbuild.context(config) esbuid v.0.17
//监听文件
await ctx.watch();
//开发服务器
await ctx.serve({});
//重新打包
await ctx.rebuild();

build API

Build API调用对文件系统中的一个或多个文件进行操作。这使得文件可以相互引用,并被编译在一起(需要设置bundle: true

build(options?: Config): Promise<Result>
buildSync(options?: Config): Result

常用配置:

// ./node_modules/esbuild/lib/main.d.tsinterface CommonOptions {absWorkingDir: string # 当前项目根目录,可通过process.cwd()设置bundle: boolean # 将所有源码打包到一起entryPoints: string[] | object # 入口文件,通过对象方式可以指定输出后文件名,和 webpack 类似outdir: string # 输出文件夹,不能和 outfile 同时使用;多入口文件使用 outdiroutfile: string # 输出的文件名,,不能和 outdir 同时使用;单入口文件使用 outfileoutbase: string # 每个入口文件构建到不同目录时使用define: object # define = {K: V}  在解析代码的时候用V替换K platform: string # 指定输出环境,默认为 browser 还有一个值是 node,format: string # js 输出规范(iife/cjs/esm),如果 platform 为 browser,默认为 iife;如果 platform 为 node,默认为 cjssplitting: boolean # 代码分割(当前仅限 esm模式,还在迭代中...)loader: string | object # transform API 只能使用 stringminify: boolean # 压缩代码,包含删除空格、重命名变量、修改语法使语法更简练。其实就是下面三个配置的整合体minifyWhitespace,minifyIdentifiers,minifySyntaxminifyWhitespace: boolean # 删除空格minifyIdentifiers: boolean # 重命名变量minifySyntax: boolean # 修改语法使语法更简练sourcemap: boolean | stringtarget: string[] # 设置目标环境,默认是 esnext(使用最新 es 特性)jsxFactory: string # 指定调用每个jsx元素的函数jsxFragment: string # 指定聚合一个子元素列表的函数assetNames: string # 静态资源输出的文件名称(默认是名字加上hash)chunkNames: string # 代码分割后输出的文件名称entryNames: string # 入口文件名称treeShaking: boolean # 默认为truetsconfig: string # 指定 tsconfig 文件publicPath: string # 公共路径write: boolean # 默认 false,对于cli和js API,默认是写入文件系统中,设置为 true 后,写入内存缓冲区inject: string[] # 将数组中的文件导入到所有输出文件中metafile: boolean # 生成依赖图 
}

加载器(loader)

esbuild加载器的作用与webpack中loader作用类似,都是对于某种类型的文件进行编译

1. js-loader

这个加载器默认用于.js、.cjs和.mjs文件。.cjs扩展名被node用于CommonJS模块,而.mjs扩展名被node用于ECMAScript模块,尽管esbuild并没有对这两者进行区分。

esbuild支持所有现代JavaScript语法。然而,较新的语法可能不被旧的浏览器所支持,所以你可能想配置目标选项,告诉esbuild将较新的语法转换为适当的旧语法。

esbuild并不支持ES5的转换,目前还不支持将ES6+语法转换为ES5。

2. ts-loader

.ts默认情况下为、.tsx.mts和文件启用此加载器.cts,这意味着 esbuild 内置支持解析 TypeScript 语法并丢弃类型注释。但是,esbuild执行任何类型检查

3. jsx-loader

JSX是 JavaScript 的类似 XML 的语法扩展,是为React创建的。它旨在由您的构建工具转换为普通的 JavaScript。每个 XML 元素都成为一个普通的 JavaScript 函数调用。例如,以下 JSX 代码:

import Button from './button'
let button = <Button>Click me</Button>
render(button)

将被转换为以下 JavaScript 代码:

import Button from "./button";
let button = React.createElement(Button, null, "Click me");
render(button);

.jsx和.tsx会默认开启此loader,如果你的文件是.js结尾的,那么必须手动声明loader,比如:loader: { '.js': 'jsx' },

4. json-loader

对于.json文件,这个加载器是默认启用的。它在构建时将JSON文件解析成一个JavaScript对象,并将该对象作为默认导出

5. css-loader

6. text-loader

7. binary-loader

8. Base64-loader

9. dataurl-loader

10. file-loader

11. copy-loader

该加载程序会将文件复制到输出目录,并重写导入路径以指向复制的文件。

Context API

context API 是esbuild v0.17.0版本新加入的API,此版本不向后兼容。context函数本身可以配置interface CommonOptions中的所有内容

context API 主要替换了之前可以直接使用esbuild对象调用的servewatch等函数。现在servewatch等函数要通过context函数调用之后的对象获取,并且他们都已异步的。

  • Watch mode 简单来说就是监听模式,当我们修改源文件的时候,会自动帮我们重建
  • Serve mode 启动本地开发服务器,提供最新构建的结果。注意,Serve mode会自动帮我们构建打包源文件,但是并不支持热重载
  • Rebuild mode 允许手动调用构建。当将 esbuild 与其他工具集成时这非常有用。

而且在以前,esbuild是不支持servewatch函数一起使用的,这个版本之后,允许同时使用这两个功能。主要目的,其实就是为了live load,当文件系统上的文件发生更改时,浏览器会自动重新加载页面

esbuild是通过服务器发送事件来实现的live load,服务器发送事件是一种将单向消息从服务器异步传递到客户端的简单方法。服务模式现在提供一个/esbuild带有change事件的端点,每次 esbuild 的输出更改时都会触发该事件。因此,您现在可以实现简单的“实时重新加载”(即在编辑和保存文件时重新加载页面),如下所示:

new EventSource('/esbuild').addEventListener('change', () => location.reload())

完整案例

package.json

{......其他省略"scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "node ./esbuild.config.js production","start": "node ./esbuild.config.js development"},"type":"module"
}

esbuild.config.js

import esbuild from "esbuild";//process是一个全局对象,argv返回的是一组包含命令行参数的数组。
//第一项为”node”,
//第二项为执行的js的完整路径,
//后面是附加在命令行后的参数
//console.log(process)const productionMode = "development" !== process.argv[2];//console.log(productionMode);const ctx = await esbuild.context({// 当前项目根目录absWorkingDir: process.cwd(),// 输出环境 `node` 或 `browser`, 默认为 `browser`platform: "browser",// 模块格式,包括`esm`、`commonjs`和`iife`// 如果 platform 为 browser,默认为 iife;如果 platform 为 node,默认为 cjsformat: "esm",// 静态资源名称,可以搭配loader使用,比如 ".png": "file"assetNames: "assets/[name]-[hash]",// 入口文件名称// entryNames: '[dir]/[name]-[hash]',// 摇树优化,treeShaking: true,// 指定 tsconfig 文件tsconfig: "./tsconfig.json",// 日志级别 `silent`(默认)、`verbose`、`debug`、`info`、`warning`、`error`logLevel: "info",publicPath: "/",//esbuild 在构建之前编辑源代码以删除某些构造,比如常见的debugger和console//目前esbuild也仅仅提供了这两个选项drop: productionMode ? ['debugger', 'console'] : [],// 入口文件列表,为一个数组entryPoints: ["src/app.tsx", "src/index.html"],// 是否需要打包,一般设为 truebundle: true,// 是否进行代码压缩minify: false,// 是否生成 SourceMap 文件sourcemap: true,// 指定语言版本和目标环境target: ["es2020", "chrome58", "firefox57", "safari11"],// 是否生成打包的元信息文件metafile: true,// 指定输出文件outdir: productionMode ? "./public/dist/" : "./dist/",// 指定loaderloader: {".html": "copy",".svg": "dataurl",".png": "file",// ".module.css": "local-css",},
});if (productionMode) {ctx.rebuild();//释放资源ctx.dispose();
}
else { await ctx.watch();await ctx.serve({port: 3000,host: "localhost",servedir: "./dist",}).then((server) => {console.log(`server: ${server.host}:${server.port}`)}).catch((err) => process.exit(1));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890955.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Semver Checker : PHP依赖管理工具Composer 版本兼容性神器

本文导读:最近由于webman 2.x的重大发布,社区好友私聊或者群聊问webman-jwt的兼容性问题,但是由于各种安装源问题,自己又不知道是哪里的问题,所以就想到了 Packagist Semver Checke 这个工具,分享给大家,希望能帮助到大家。 概述 Packagist Semver Checker 是一种用于检…

【phpstudy】phpstudy的MySQL服务启动不了?一启动就自动停止怎么办?

遇到一个问题,就是phpstudy的MySQL服务启动不了,一启动就自动停止。 很明显是端口被占用,还要删除本地的MySQL。 按照以下步骤皆可解决: 第一步:查询mysql服务、然后删除 sc query mysqlsc delete mysql第二步:查看端口情况 netstat -ano | findstr 3306查询为空即可。 如…

[Python] Jupyter NoteBook : 开源的交互式 Python Web 应用程序

概述:Jupyter Notebook 简介Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。它最初由IPython团队开发,现在已经成为一个独立的项目,并广泛用于数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。…

【SSH实战】巧用 SSH 打通外网限制

在工作中遇到此场景,如下两条网络限制下,总部如何访问分公司内部web服务器?dmz服务器可以访问总部外网服务器22端口,不可以访问web服务器; web服务器不可访问公网,但是到dmz网络无限制。初看需求,我们第一个想到的肯定是内网端口映射到公网,或者vpn,但是不修改网络策略…

Java Web - 项目

Java Web 项目中学到的相关知识: RESTful, Apifox, 三层架构, 日志技术, 数据库多表操作, 事务管理, 阿里云 OSS 文件上传, 全局异常处理, 登录认证 (JWT, 拦截器), AOP(实现日志管理)Java Web - 项目 准备工作 开发模式 当前主流开发模式: 前后端分离 前后端分离, 如何知道前后…

【Linux部署】Linux环境下Java项目Jar包的启动指令

在Java开发领域,我们经常需要将编译好的Java应用程序打包成Jar文件,以便于部署和运行。 特别是在Linux服务器上,管理多个Jar包的启动和停止是日常运维中的重要一环。 本文介绍如何在Linux环境下高效地启动和管理Jar包,同时提供简洁明了的代码示例,帮助大家更好地理解这一过…

手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开

MicroPython串口舵机库,支持幻尔科技全系列舵机,支持mpremote工具一键导入,28条指令全测试。原文链接: FreakStudio的博客 摘要 MicroPython串口舵机库,支持幻尔科技全系列舵机,支持mpremote工具一键导入,28条指令全测试。 往期推荐: 学嵌入式的你,还不会面向对象??…

Plombery:将Python脚本的执行与Web界面的可视化监控完美结合的Python任务调度工具

还在为定时运行Python脚本而苦恼吗?还在为复杂的调度系统而头疼吗?今天,就让Plombery帮你解决这些问题!Plombery是一个简单易用的Python任务调度器,拥有友好的Web界面和REST API,让你轻松管理和监控你的Python脚本。告别复杂的配置和代码,Plombery将带你进入高效、便捷的…

AQS的acquire(int arg) 方法底层源码

一、定义 acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态。如果当前线程无法获取同步状态,则将其加入等待队列并阻塞,直到成功获取同步状态或被中断 1、acquire(int arg) 方法的作用功能:尝试获取同步状态(独占模式…

【钓鱼邮件】春节复工近期常见的钓鱼邮件

本期主要分享2025年2月常见的钓鱼邮件样本,特别提醒广大用户在春节复工高峰期加强安全防范。 补贴类钓鱼邮件 春节之后,五险一金补贴、年终奖补贴相关的钓鱼邮件依旧频发。钓鱼手法也有所提升,攻击者通常将通知内容放到附件中,并且对附件设置访问密码,试图绕过反垃圾系统检…

HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍

title: HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐 date: 2025/2/28 updated: 2025/2/28 author: cmdragon excerpt: 🏭 本文作为系列终章,通过物流管理系统的案例,揭秘API开发的完整流程。你将掌握: 深度解读28个HTTP协议进阶特性(ETag/CO…

第一周实验:二次开发

来源 来自大一舍友C++大作业。该项目模拟了一个图书管理系统,涉及到用户对于书籍的查看、借阅与归还,管理员对于书籍相关信息的增删改查。 运行环境+运行结果的截图 运行环境:Windows 11 + Visual Studio 2022main.cpp #include<Windows.h> #include "Account.h&…