esbuild中文文档-路径解析配置项(Path resolution - External、Main fields)

2023-09-19 09:34:01


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

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

esbuild简单介绍

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

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

路径解析配置项 Path resolution

外部模块 External

Supported by: Build

您可以将文件或包标记为外部,可以将它们从build中排除。导入语句将被保留(对iifecjs格式使用require的导入,对esm格式使用import的导入),而不会被打包,并且这些保留的语句将在运行时进行计算。

这有几个用途。首先,它可以从您的打包中修剪不必要的代码,这些代码是您明确知道的永远不会执行的代码。例如,一个包可能包含某些仅在node中运行的代码,但您只计划在浏览器中使用该程序包。它还可以用于在运行时从无法打包的package中导入node代码。例如,fsevents包包含一个esbuild不支持的本机扩展。将某个东西标记为外部,如下所示:

$ echo 'require("fsevents")' > app.js
$ esbuild app.js --bundle --external:fsevents --platform=node

// app.js
require("fsevents");

您也可以在外部路径中使用*通配符,将所有匹配到的文件标记为外部文件。例如,可以使用*.png删除所有.png文件,也可以使用/images/*删除以/images/开头的所有路径:

esbuild app.js --bundle "--external:*.png" "--external:/images/*"

外部路径在路径解析之前和之后都会应用,这使您可以与源代码中的导入路径和文件系统的绝对路径进行匹配。一个路径在与任意一种情况匹配时,该路径会被视为外部路径。具体行为如下:

  • 在开始路径解析之前,将根据所有外部路径检查导入路径。此外,如果外部路径看起来像包路径(即不是以/./../开头),则会检查导入路径,以查看它们是否将该包路径作为路径前缀。

这意味着--external:@foo/bar隐含地也意味着--external:@foo/bar/*,它与导入路径@foo/bar/baz匹配。因此,它也将@foo/bar包内的所有路径标记为外部路径。

  • 路径解析结束后,将对照所有看起来不像包路径的外部路径(即以/./../开头的路径)检查解析的绝对路径。但在检查之前,外部路径将与当前工作目录连接,然后进行规范化,生成绝对路径(即使它包含*通配符)。

这意味着您可以使用--external:./dir/*将目录dir中的所有内容标记为外部模块。请注意,前缀./很重要。如果没有前缀,直接使用--external:dir/*会被视为包路径,在路径解析结束后不会再进行检查。

主字段 Main fields

Supported by: Build

node中导入包时,该包的package.json文件中的main字段确定了要导入的文件(以及许多其他规则)。包括esbuild在内的大多数JavaScript打包器允许您在解析包时指定额外的package.json字段。通常使用的此类字段至少有三个:

  • main

这是要与node一起使用的所有包的标准字段。名称main被硬编码到node的模块解析逻辑中。因为它是用于node的,所以可以明确地预知到该字段中的文件路径是CommonJS风格的模块。

  • module

这个字段来自一个关于如何将ECMAScript模块集成到node中的提议。因此,可以明确地预知该字段中的文件路径是ECMAScript样式的模块。这个提议没有被node采用(node使用“type”:“module”),但它已被大多数的bundler采用了,因为ECMAScript风格的模块可以更好地进行树抖动或删除死代码。

对于包作者:有些包错误地将module字段用于浏览器的代码,而将node的代码用于main字段。这可能是因为node忽略了module字段,并且人们通常只对特定于浏览器的代码使用bundler。然而,对于node代码进行打包也很有价值(例如,它减少了下载和启动时间),并且将浏览器的代码放在module中的包阻止了打包器有效地进行树抖动。如果试图在包中发布特定于浏览器的代码,请改用浏览器字段。

  • browser

该字段来自一项提案,该提案允许打包器用browser友好的替换基于node的文件或模块。它允许您指定浏览器的备用入口点。请注意,包可以同时使用browsermodule字段(请参阅下面的注释)。

默认的main字段取决于当前platform设置。这些默认值是与现有软件包生态系统最广泛兼容的。但是,您也可以自定义:

esbuild app.js --bundle --main-fields=module,main

对于包的开发者

如果您想编写一个将browser字段与module字段结合使用的包,那么您可能需要填写完整的CommonJS-vs-ESMbrowser-vs-node矩阵中的所有四个条目。为此,您需要使用browswer字段的扩展形式,它是一个map,而不仅仅是一个字符串:

{
  "main": "./node-cjs.js",
  "module": "./node-esm.js",
  "browser": {
    "./node-cjs.js": "./browser-cjs.js",
    "./node-esm.js": "./browser-esm.js"
  }
}

main字段期望使用CommonJS格式,而module字段期望使用ESM格式。关于使用哪种格式,取决于使用浏览器的变体还是node的变体。如果你省略了这四个条目中的一个,那么你就有可能选择到错误的变体。例如,如果您省略了CommonJSbrowser构建的条目,那么就可能选择到CommonJSnode构建。

请注意,使用main、modulebrowser是执行此操作的旧方法。还有一种新的方法可以做到这一点,你可能更喜欢使用它:package.json中的exports字段。它提供了一组不同的设置方法。例如,它使您能够更精确地控制包中所有子路径的导入(而main字段仅使您能够控制入口点),但它可能会导致包被多次导入,具体取决于您如何配置它。

结语

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

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

(本文完)

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

更多推荐

125. 验证回文串 【简单题】

题目如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。给你一个字符串s,如果它是回文串,返回true;否则,返回false。示例1:输入:s="Aman,aplan,acanal:Panama"输出:true解释:"a

amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子

S905L3带有投屏的功能,并通过com.droidlogic.mediacenter.dlna.MediaCenterService服务的启动和停止来开启和关闭DLNA功能,但是在测试中发现机顶盒关闭DLNA后,手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子,有时却很容易搜索到。通过查看日志,发现打开

C语言每日一题(10):无人生还

文章主题:无人生还🔥所属专栏:C语言每日一题📗作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶个人主页:[₽]的个人主页🏄🌊目录前言编程起因项目介绍情节简介讨论内容找出凶手设计思路1.整体逻辑方法一方法二2.具体逻辑方法一方法二代码展示方法一:依次假设法(最容易想到的方法)方法二:逻

【ABAP】如何理解SAP中的CLIENT (客户端)

💂作者简介:THUNDER王,阿里云社区专家博主,华为云·云享专家,腾讯云社区认证作者,CSDNSAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAPABAP开发和数据库具有较深入的研究。💅文章概要:MANDT集团永远是无数SAP入门人员无

【STM32】SDIO—SD 卡读写01

基于stm32f103基于零死角玩转STM32—F103指南者简介1.SD卡总共有8个寄存器,用于设定或表示SD卡信息。2.SD卡的寄存器不能像STM32那样访问,而是利用命令访问,SDIO定义了64个命令。SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以

认识微服务、服务拆分和远程调用

文章目录1.认识微服务2.微服务架构的特征3.SpringCloud4.服务拆分5.远程调用6.提供者与消费者1.认识微服务单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务架构优点缺点单体架构架构简单,部署成本低,耦合度高

C与C++字符串方法示例

C和C++中的字符串处理方法有所不同。在C语言中,字符串被表示为字符数组,使用字符数组来处理字符串。C语言提供了许多用于处理字符串的库函数,如strcpy,strcat,strcmp等。这些函数可以用于复制,连接和比较字符串等操作。在C++中,字符串被表示为字符串对象,使用字符串对象来处理字符串。C++中的字符串类提供

hadoop HDFS分布式计算概述,MapReduce概述,YARN概述

1、分布式计算概述1.1、什么是(数据)计算我们一直在提及:分布式计算,分布式暂且不论,“计算”到底是指什么呢?大数据体系内的计算,举例:销售额统计、区域销售占比、季度销售占比利润率走势、客单价走势、成本走势品类分析、消费者分析、店铺分析等等一系列,基于数据得出的结论。这些就是我们所说的计算。1.2、分布式(数据)计算

Spire.OCR for .NET 1.9.0 Crack

Spire.OCRfor.NET是一个专业的OCR库,用于从JPG、PNG、GIF、BMP和TIFF格式的图像中读取文本。开发人员可以轻松地在C#和VB.NET的.NET应用程序中添加OCR功能。它支持常用的图像格式,并提供从图像中​​读取多个字符和字体、粗体和斜体样式、扫描整个图像等功能。Spire.OCRfor.N

轮转数组:解决数组元素向右轮转的高效算法

轮转数组:解决数组元素向右轮转的高效算法leetcode189.轮转数组在计算机编程中,经常会遇到数组操作的问题,其中之一就是将数组中的元素向右轮转k个位置。这篇技术博客将详细介绍这个问题,探讨解决方案,并提供实际的Python代码来解决这个问题。问题描述给定一个整数数组nums,需要将数组中的元素向右轮转k个位置,其

【Java 基础篇】Java Lambda表达式详解

Lambda表达式是Java编程语言中引入的一个强大的特性,它使得编写更加简洁、可读性更强的代码变得更容易。本文将详细介绍Lambda表达式的概念、语法、用法以及示例,以帮助基础的Java开发者理解和应用Lambda表达式。什么是Lambda表达式Lambda表达式,也称为闭包,是一种匿名函数,它可以传递到方法作为参数

热文推荐