esbuild中文文档-基础配置项(General options - Bundle).

文章目录

  • 基础配置项 General options - 打包(Bundle)
    • 不可解析的导入(Non-analyzable imports)
    • Glob模式的导入(Glob-style imports)
  • 结语

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

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

最近开始翻译esbuild,欢迎大家点赞收藏我的专栏:esbuild中文文档专栏,专栏内容完全免费,收藏以备不时之需

基础配置项 General options - 打包(Bundle)

Supported by: Build

打包文件意味着将任何导入的依赖项内联到文件本身中。此过程是递归的,因此依赖项的依赖项(等等)也将被内联。默认情况下,esbuild不会打包输入文件。打包必须显式启用,如下所示:

esbuild in.js --bundle

请注意,打包不同于文件拼接。传递给esbuild多个需要打包的输入文件将生成多个单独的打包文件,而不是将输入文件拼接在一起。要使用esbuild将一组文件拼接在一起,请将它们全部导入到一个入口文件中,并将这个入口文件传递给esuild打包。

不可解析的导入(Non-analyzable imports)

使用esbuild打包仅适用于静态定义的导入(即,当导入路径是字符串文本时)。在运行时定义的导入(即依赖于运行时run-time代码求值的导入)不会被打包,因为打包是编译时compile-time操作。例如:

// 可解析的导入 (将被esbuild打包)
import 'pkg';
import('pkg');
require('pkg');

// 不可解析的导入 (不会被esbuild打包)
import(`pkg/${foo}`);
require(`pkg/${foo}`);
['pkg'].map(require);

解决此问题的方法是将包含此问题代码的包标记为外部包external,以便它不包含在打包文件中。然后,您需要确保在运行时,打包后的代码可以访问到这个外部包的副本。

一些打包工具(如Webpack)试图通过在打包过程中包含所有可能访问到的文件,然后在运行时模拟文件系统来支持这一点。但是,运行时文件系统仿真超出了范围,不会在esbuild中实现。如果您确实需要打包时实现这一点,则可能需要使用另一个打包器而不是esbuild

Glob模式的导入(Glob-style imports)

在运行时计算导入路径,现在可以在某些特定的情况下进行打包了。导入路径表达式必须是字符串串联的形式,并且必须以./../开头。字符串串联中的每个非字符串表达式都成为glob模式中的通配符。一些示例:

// These two forms are equivalent
const json1 = require('./data/' + kind + '.json')
const json2 = require(`./data/${kind}.json`)

执行此操作时,esbuild将在文件系统中搜索与模式匹配的所有文件,并将所有文件路径存储到一个map中。导入表达式将替换为对该map的查找。如果map中不存在导入路径,则运行时将引发错误。生成的代码如下所示(为了简洁起见,省略了不重要的部分):

// data/bar.json
var require_bar = ...;

// data/foo.json
var require_foo = ...;

// require("./data/**/*.json") in example.js
var globRequire_data_json = __glob({
  "./data/bar.json": () => require_bar(),
  "./data/foo.json": () => require_foo()
});

// example.js
var json1 = globRequire_data_json("./data/" + kind + ".json");
var json2 = globRequire_data_json(`./data/${kind}.json`);

此功能适用于require(…)import(..),因为它们都可以接受运行时表达式。它不适用于importexport语句,因为它们不能接受运行时表达式。如果要阻止esbuild尝试打包这些导入,则应将字符串串联表达式从require(…)import(..)移除。比如:

// This will be bundled
const json1 = require('./data/' + kind + '.json')

// This will not be bundled
const path = './data/' + kind + '.json'
const json2 = require(path)

请注意,使用此功能意味着esbuild可能会执行大量文件系统I/O操作,以便查找所有可能与模式匹配的文件。这是经过设计的,不是bug。如果这是一个问题,有两种方法可以减少esbuild所做的文件系统I/O量:

  1. 最简单的方法,是将要动态导入的所有文件放在一个子目录中,然后将该子目录包括在匹配模式中。这将esbuild限制在该子目录中搜索,因为esbuild不会考虑..模式的路径元素。

  2. 另一种方法是防止esbuild搜索任何子目录。esbuild使用的模式匹配算法只允许通配符匹配包含/路径分隔符的内容,前提是该通配符在模式中的前面有/。例如./data/'+x+'.json'x与所有子目录中的所有内容匹配,而'./data-'+x+'.json'只会将x与顶级目录中的所有内容匹配(但不会与所有子目录中的内容匹配)。

结语

我的CSDN专栏:esbuild中文文档专栏,正在不断的更新完善中,欢迎大家关注、校正!

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

你可能感兴趣的:(esbuild中文文档,软件构建,go,javascript)