• esbuild 学习(1)


    介绍

    ☀️esbuild是一种类似于webpack 的 极速 JavaScript 打包器

    ❄️特性:

    • 极快的速度,无需缓存
    • 支持 ES6 和 CommonJS 模块
    • 支持对 ES6 模块进行 tree shaking
    • API 可同时用于 JavaScript 和 Go
    • 兼容 TypeScript 和 JSX 语法
    • 支持 Source maps
    • 支持 Minification
    • 支持 plugins

    安装

    首先本地安装 esbuild,执行npm install esbuild命令,此命令会将 esbuild 安装到你本地的 node_modulesnode_modules里面会有个esbuild的 原生可执行文件

    执行 ./node_modules/.bin/esbuild 可以看到esbuild的好多命令,也可以执行./node_modules/.bin/esbuild --version可以查看我们安装的esbuild的版本是0.14.2

    构建脚本

    1. 构建

    我们创建一个test.jsx 文件,然后用esbuild去构建

    ./node_modules/.bin/esbuild test.jsx --bundle --outfile=out.js
    

    会输出一个名叫out.js的文件,然后我们用node out.js去运行,得出:

    <div>5</div>
    

    注:esbuild 除了 jsx 扩展名, 无需任何配置就能够将 JSX 语法转换为 JavaScript。 尽管 esbuild 可以进行配置, 但它试图提供合理的默认值,以便在常见的情况下自动完成构建。 如果你想在 .js 文件中使用 JSX 语法,你可以通过设置 --loader:.js=jsx 选项, 来告诉 esbuild 对 js 文件进行 JSX 的编译。

    因为我们要反复要执行构建命令,必须要写esbuild可执行文件的相对路径,比较繁琐。所以我们需要简化它。我们可以建个 package.json 中添加构建脚本, 具体代码如下:

    {
        "script": {
            "build": "esbuild test.jsx --bundle --outfile=out.js"
        }
    }
    

    注:这里直接使用 esbuild,没用相对路径。 这能够生效的原因是 "scripts" 中执行的内容 会去寻找当前环境下的 esbuild 命令并执行。 (前提是,你已经安装了 esbuild)

    然后我们直接可以去执行 npm run build 即可

    2. 构建方式

    构建方式可以有两种:命令行和调用javascript API,上边我们用的都是命令行方式。

    ⁉️那我们什么情况下会用到调用 javascript API 方式呢?

    ✅如果我们需要向esbuild传更多的配置项,这会让命令看起来很复杂,笨重。这时我们就需要直接调用javascript API 方式:

    建个esbuild.config.js文件,在里面编写脚本:

    require('esbuild').build({
        entryPoints: ['test.jsx'],
        bundle: true,
        outfile: 'out.js'
    })
    

    esbuild 的API

    在学习esbuild的基础配置之前,我们先看看esbuild常用的API有哪些:

    1. transform
    2. transformSync
    3. build
    4. buildSync
    5. serve

    调用esbuild API的方式有三种:在命令行中调用,在 JavaScript 中调用, 在 Go 中调用。作为前端,我们只需要关心命令行和javascript两种调用方式

    最常用的两种API调用就是transform和build

    1. transform API

    transform API 是操作单个字符串,而不是访问文件系统的。这个可以是在没有文件系统的环境(比如浏览器)下,使用,也可以作为另一个工具链的一部分。

    举个栗子:

    命令行调用

    echo 'console.log(5555)' | esbuild // 输出 console.log(5555)
    

    ⁉️大家是不是有个问题,我这echo 'console.log(5555)' | esbuild 里面既没有 build关键字也没有transform关键字,我怎么知道这个命令就是调用的transform API呢?

    ✅答案:如果没有提供输入的文件并且没有 --bundle 标志的话,命令行接口就会调用此 API。这个用例中,输入的字符串来自标准输入(stdin),并且输出字符串转到标准输出(stdout)。

    javascript 调用

    require('esbuild').transform('console.log(5555)', {
      loader: 'js',
    }).then((res) => {
      console.log(res.code);
    });
    
    • transform API 参数
    参数 类型 描述
    input string 需要转换的代码
    options object transformOptions(见下文)

    transformOptions 参数可以使用的配置项:

    • Define
    • Format
    • Loader
    • Minify
    • Sourcemap
    • Target

    transform 和 transformSync的区别:

    transform是异步,transform(...)返回的是个Promise对象

    transformSync是同步的,transformSync(...)返回的是结果集

    2. build API

    调用 build API 操作文件系统中的一个或多个文件。 它允许文件互相引用并且打包在一起。

    举个栗子:
    建一个test2.js,在test2.js里面引入test.js,然后打包输出 test2.js

    命令行调用

    esbuild test2.js --bundle --outfile=out.js  // 输出的out.js文件里面包含了test.js和test2.js两个文件里面的内容
    

    注:如果至少提供一个输入文件或者存在 --bundle 标志, 那么命令行接口会调用该 API。 请注意 esbuild 不会 默认打包。 你必须传递 --bundle 标志启用打包。 如果没有提供输入文件,则从标准化输入(stdin)读取单个输入文件。

    javascript API 调用

    require('esbuild').build({
      entryPoints: ['test2.js'],
      bundle: true,
      outfile: 'out.js'
    })
    
    • build API 参数
    参数 类型 描述
    options object buildOptions(见下文)

    buildOptions 参数可以使用的配置项:

    • Bundle
    • Define
    • Entry points
    • External
    • Format
    • Inject
    • Loader
    • Minify
    • Outdir
    • Outfile
    • Platform
    • Serve
    • Sourcemap
    • Target
    • Watch
    • Write

    build 和 buildSync的区别:

    build 是异步,build(...)返回的是个Promise对象

    buildSync是同步的,buildSync(...)返回的是结果集

    3. serve API

    serve API 与 build API 调用很相似, 但是它不会将生成的代码写入到文件系统中,它启动一个 long-lived 本地 web 服务器来为最新构建生成的代码提供服务。 每批新的请求都会导致 esbuild 在响应请求之前重新运行构建命令,这样你的文件就总是最新的。

    serve API 在命令行的模式下有两种使用方式:

    第一种:为 esbuild 构建出的所有内容提供服务。用servedir参数指定构建出的输出文件所在的目录

    举个栗子:

    命令行调用

    esbuild test.jsx --servedir=www --outdir=www/js --bundle  // 文件系统里面并没有www文件夹,但是我们可以在浏览器访问http://127.0.0.1:8000/js/test.js
    

    转成 javascript API 调用

    require('esbuild').serve({
      servedir: 'www',
    }, {
      entryPoints: ['test.jsx'],
      outdir: 'www/js',
      bundle: true,
    }).then((serve) => {
      console.log(serve, 'watch...');
    });
    

    第二种:仅为 esbuild 生成的文件提供服务。用serve参数指定访问的端口,可以直接去访问esbuild指定生成的文件

    命令行调用

    esbuild test.jsx --outfile=out.js --bundle --serve=8000 // 文件系统里面并没有www文件夹,但是我们可以在浏览器访问http://127.0.0.1:8000/out.js
    

    转成 javascript 调用

    require('esbuild').serve({
      port: 8000
    }, {
      entryPoints: ['test.jsx'],
      bundle: true,
      outfile: 'out.js'
    }).then(serve => {
      console.log(serve, 'watch...')
    })
    
    • serve API 的参数
    require('esbuild').serve({
      // serveOptions
    }, {
      // buildOptions
    }).then(serve => {
      // 输出serve对象
    })
    

    第一个参数是带有特定于 serve 的配置项的配置项对象

    字段 类型 描述
    port number 配置 HTTP 端口, 默认 8000,在命令行中可以使用 --serve=8000
    host string 配置 IP 地址,默认 0.0.0.0 在命令中可以使用--serve=127.0.0.1:8000
    servedir string esbuild 的 HTTP 服务器提供的额外内容目录,当请求路径与生成的任何输出文件路径不匹配时,它将返回 404
    onRequest callback 请求完成后调用,需要在请求完成后做操作,可以在onRequest里面做

    第二个参数是每个请求都会调用的底层 # build API 的常规配置项对象。

    注:serve API 在build时不能使用watch 配置项

    下期见 esbuild 的基本配置项

  • 相关阅读:
    20145209 《信息安全系统设计基础》第5周学习总结
    20145209 《信息安全系统设计基础》第3周学习总结
    20145209 《信息安全系统设计基础》第1周学习总结
    20145209 《信息安全系统设计基础》第0周学习总结
    单调栈&单调队列入门
    GYM 101617 F
    codeforces 13 D
    codeforces 13 b
    G102040I
    19南昌网络赛L
  • 原文地址:https://www.cnblogs.com/yyh1/p/15654228.html
Copyright © 2020-2023  润新知