esbuild中文文档-语法转换(Optimization - Define、Drop、Drop labels)


哈喽,大家好!我是「励志前端小黑哥」,我带着最新发布的文章又来了!

老规矩,小手动起来~点赞关注不迷路!

esbuild简单介绍

esbuild为了突破JavaScript语言的瓶颈,采用了Go语言编写,构建速度与同代码量下的webpack对比提升在10倍以上,开创了构建工具性能的新时代。

它的中文文档,本人正在不断的更新完善中,欢迎大家关注阅读!

优化配置 Optimization

Define

Supported by: Build and Transform

此功能提供了一种用常量表达式替换全局标识符的方法。它可以在不更改代码本身的情况下,在构建过程中更改某些代码的行为:

$ echo 'hooks = DEBUG && require("hooks")' | esbuild --define:DEBUG=true
hooks = require("hooks");

$ echo 'hooks = DEBUG && require("hooks")' | esbuild --define:DEBUG=false
hooks = false;

每个define条目都将标识符映射到包含表达式的代码字符串。字符串中的表达式必须是JSON对象(null、boolean、数字、字符串、数组或对象)或单个标识符。数组和对象以外的替换表达式是内联替换的,这意味着它们可以参与常量折叠。数组和对象替换表达式存储在变量中,然后使用标识符引用,而不是内联替换,这避免了替换值的重复副本,但意味着值不参与常量折叠。

如果您想用字符串文字替换某些内容,请记住,传递给esbuild的替换值本身必须包含引号,因为每个定义条目都映射到一个包含代码的字符串。省略引号意味着替换值是一个标识符。下面的示例演示了这一点:

$ echo 'id, str' | esbuild --define:id=text --define:str=\"text\"
text, "text";

如果您使用的是CLI,请记住,不同的shell对于如何转义双引号字符有不同的规则(当替换值是字符串时,这是必要的)。使用\“反斜杠转义,因为它在bashWindows命令提示符下都有效。其他在bash中有效的转义双引号的方法(如用单引号括起来)在Windows上不起作用,因为Windows命令提示符不会删除单引号。当从package.json文件中的npm脚本使用CLI时,这一点很重要,因为我们希望它在所有平台上都能使用:

{
  "scripts": {
    "build": "esbuild --define:process.env.NODE_ENV=\\\"production\\\" app.js"
  }
}

如果您仍然在不同的shell中遇到跨平台转义问题,您可能需要改用JavaScript API。在那里,您可以使用常规的JavaScript语法来消除跨平台的差异。

如果您正在寻找一种更高级的define功能,它可以用常数以外的东西来替换表达式(例如,用填充码shim替换全局变量),那么您可以使用类似的注入功能inject来实现这一点。

Drop

Supported by: Build and Transform

这个命令告诉esbuild在生成之前编辑源代码以删除某些结构体。目前有两种可能被丢弃的东西:

  • debugger

传递此标志将从输出中删除所有debugger语句。这类似于流行的UglifyJSTerser JavaScript minifiers程序中的drop_debug:true标志。

JavaScriptdebugger语句使活动调试器将该语句视为自动配置的断点。当调试器打开时,包含此语句的代码将自动暂停。如果没有打开任何调试器,则该语句将不执行任何操作。从代码中删除这些语句只会防止调试器在代码运行时自动停止。

您可以像这样删除调试器语句:

esbuild app.js --drop:debugger
  • console

传递此标志将从输出中删除所有控制台的API调用。这类似于流行的UglifyJSTerser JavaScript minifiers程序中的drop_console:true标志。

警告:使用此标志可能会在代码中引入错误!此标志将删除包括所有调用参数在内的整个调用表达式。如果这些参数中的任何一个有重要的副作用,那么使用此标志将更改代码的行为。使用此标志时要非常小心。

如果你想删除控制台API调用而不删除有副作用的参数(这样你就不会引入bug),你应该将相关的API调用标记为纯调用。例如,您可以使用--pure:console.logconsole.log标记为纯函数调用。这可以在启用压缩时安全地删除这些API调用。

删除控制台API调用,如下所示:

esbuild app.js --drop:console

Drop labels

Supported by: Build and Transform

此配置项会告诉esbuild在生成编辑源代码之前,删除具有特定标签名称的标签语句labeled statements。例如,考虑以下代码:

function example() {
  DEV: doAnExpensiveCheck()
  return normalCodePath()
}

如果使用此选项删除所有名为DEV的标签,那么esbuild将为您提供以下信息:

function example() {
  return normalCodePath();
}

您可以这样配置此功能(比如删除DEVTEST标签):

esbuild app.js --drop-labels=DEV,TEST

请注意,这并不是删除代码的唯一方法。另一种更常见的方法是使用define功能将特定的全局变量替换为布尔值。例如,考虑以下代码:

function example() {
  DEV && doAnExpensiveCheck()
  return normalCodePath()
}

如果您将DEV定义为false,那么esbuild将为您提供以下信息:

function example() {
  return normalCodePath();
}

这和使用标签label功能差不多。然而,使用标签而不是全局变量来有条件地删除代码的一个优点是,您不必担心因为有人忘记配置esbuild来替换代码,从而导致全局变量没有被定义。使用标签方法的一些缺点是,当标签没有被丢弃时,它会使代码变得更难阅读,而且它不适用于嵌套表达式中的代码。在一个特定的项目中使用哪种方法取决于个人偏好。

结语

笔者根据esbuild文档搭建了一套简洁的ts开发脚手架工程,编译速度非常快!脚手架还整合了eslint,另一篇文章还附带了调试教程,需要的朋友看这里:esbuild配合vscode搭建的ts开发环境,这编译速度,真香

另外,esbuild中文文档专栏,本人目前正在翻译整理,关注我,有最新的翻译文档会第一时间通知你!

(本文完)

励志前端小黑哥,全网唯一账号!
关注我,带你了解更多前端知识!

曾经听许多前端从业者说:“前端发展太快了。”这里的快,十有八九是说层出不穷的新概念,余下的一二,大抵只是抒发一下心中的苦闷罢——前两日刚习得的新技术转眼就“落后”——仔细品味这苦闷,除却不得不持续奔跑的无奈,更多的是一口气,一口卯足了劲儿也要把新知识全数揽入囊中的不服气。作为刚入行的新人,对这点体会颇深。就像是蓦地从某个时间点切入,半数时间向前走,半数时间向后看,瞻前顾后,回味揣摩这十年间的岁月精魄,还得翘首盼着花花新世界,不时再问自己一句,这样走下去真的会好么?是的,其实答案人尽皆知,同时也无人知晓,因为没人能预言未来,顶多只能预测未来,但有一件事情永不会错,当你笃定地沿着一条路走下去,结果通常不会太糟糕,但凡能在浮躁的社会冷静下来潜心磨砺,多少总会有收获。幸而我有意弱化了对新信息的执念,开始做一些事情,《深入浅出ES6》就是其中一件。 纵观整个系列,亦即纵观ECMAScript 2015的整个体系,吸取了诸多成功经验:借鉴自CoffeeScript的箭头函数;始于C++项目Xanadu,接着被E语言采用,后来分别于Python和JavaScript框架Dojo中以Deferred对象的面貌出现的Promise规范(详见Async JavaScript一书3.1章);借鉴了C++、Java、C#以及Python等语言的for-of循环语句;部分借鉴Mustache、Nunjucks的模板字符串。 当然,新的语言体系也在之前的基础上查漏补缺:弥补块级作用域变量缺失的let和const关键字;弥补面向大型项目缺失的模块方案;标准委员会甚至为JavaScript增加了类特性,有关这一方面的特性褒贬不一,Douglas Crockford曾在2014年的Nordic.js大会发表了题为《The Better Parts》的演讲,重新阐述了他个人对于ECMAScript 6的看法,他认为Class特性是所有新标准中最糟糕的创新(我个人也略赞同这一说法,类的加入虽然有助于其它语言的使用者开始使用JavaScript,但是却无法发挥出JavaScript原型继承的巨大优势);以及为了保持非侵入式弥补其它新特性而诞生的Symbols。 其它的新特性也相当诱人,熟练掌握可以大幅度提升开发效率:迭代器Iterator、生成器Generators、不定参数Rest、默认参数Default、解构Destructuring、生成器Generator、代理Proxy,以及几种新类型:Set、Map、WeakSet、WeakMap、集合Collection。 以上提及的新特性只是其中的一部分,更多的新特性等待着大家进一步挖掘。整个系列的翻译历时150余天,坚持专栏翻译的日子艰苦也快乐,编辑徐川细心地帮我审校每一篇文章,编辑丁晓昀赠予钱歌川先生详解翻译之著作让我大开眼界,与李松峰老师的交流也让我深刻理解了“阅读、转换、表达”的奥义所在,最感谢我的母亲,在我遇到困难需要力量的时候永远支持着我。选择ES6作为前端生涯的切入点实之我幸,恰遇这样的机会让我可以一心一意地向前走,向未来走。我很敬佩在“洪荒”和“战乱”年代沉淀无数经 验的前辈们,你们在各种不确定的因素中左右互搏,为终端用户提供统一的用户体验,直到如今你们依然孜孜不倦地吸取业内新鲜的经验。技术在进步,也为前端人 提供着无限的可能性,我们有责任也有义务去推动新标准的发展和普及,诚然在商业的大环境下我们不愿放弃每一寸用户的土壤,但携众人之力定将能推动用户终端 的革新。ES7标准的提案纷纷提上日程,用不了多久也将登上前端大舞台。也感谢午川同学友情提供译文《深入浅出ES6(十):集合 Collection》,让我在困难时期得以顺利过渡。最后祝愿国内前端社区向着更光明美好的未来蓬勃生长!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

励志前端小黑哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值