什么是ESbuild

上一篇文章中我们提到了Tsup是由esbuild驱动的打包工具,它的特点是不用我们配置esbuild繁琐的内容

Tsup编译ts文件-一个由esbuild驱动的新型打包库Tsup 是基于 esbuild 开发的一个新型打包工具(比 rollup 还新)。内置了 TypeScript 支持,零配置、开箱即用,帮助你高效创建现代 TypeScript/JavaScript 库

这篇文章我们来聊聊什么是esbuild 系统学习过前端框架的小伙伴可能知道 webpack 对的,就是那个编译要好几分钟的webpack,这里手动圈一下@webpack,在前期,在vue2时期,vite使用的是webpack来打包的,项目比较小的可能编译几十秒就能完成,但是如果是大型项目,动则五六分钟,甚至十几分钟,屎都拉完了他还在编译,后期vite更换了新一代的构建工具,rollup,但是对于大型项目来说还是特别慢 ESBuild是基于Go语言开发的JavaScript Bundler,后面也被vite广泛使用

什么是SWC

提到SWC小伙伴可能会很陌生,但是提到一个库小伙伴们就不会很陌生了@babel/core没错,这是用来转移es5代码的,总所周知,在大部分项目中还是需要转译成es5代码的,而SWC也是用于转译代码的 我们为什么要用SWC 没错@babel/core和webpack一样慢,很慢,所以我们需要使用新一代构建工具SWC,SWC是基于Rust的JavaScript Compiler(其生态中也包含打包工具spack),rust和go的速度大家都是知道的,是非常快的

如何正确食用TS

基本包安装

Bash
npm install @swc/core #swc核心包
npm install esbuild #esbuild
npm install ts-node # 执行ts命令需要

构建项目

Bash
tsc --init #构建tsconfig文件
npm init -y #构建npm配置文件

修改配置 我们需要在tscofing.json文件中修改如下几条 需要修改这三个

  • "target": "ESNext"
  • "module": "ESNext"
  • "moduleResolution": "Node" 懂ts的小伙伴想必已经知道这是干什么的,这里我给ts基础不是那么好的小伙伴解释一下
  • target:指定ts文件被编译为的es版本 这里我们用esnext
  • module:指定使用的模块化规范 这里我们用esnext
  • moduleResolution 模块导入解析策略,这里有两个选择 classicnode classic是typescript默认的解析方式,但是这里我们使用node就行了 我们需要在package.json文件中修改如下代码
JSON
"scripts": {
    "build": "node config.js"
  },
"type": "module"

配置esbuild

在根目录创建config.js文件,在文件里写入如下的esbuild配置代码

JavaScript
import esbuild from 'esbuild';
import swc from '@swc/core'
import fs from 'node:fs'
await esbuild.build({
    entryPoints: ['./src/main.ts'],
    bundle: true,
    loader: {
        '.js': 'js',
        '.ts': 'ts',
        '.jsx': 'jsx',
        '.tsx': 'tsx'
    },
    treeShaking: true,
    define: { "process.env.NODE_ENV": '"production"', },
    plugins: [
        {
            name: 'swc-loader',
            setup(build) {
                build.onLoad({ filter: /\.(js|ts|tsx|jsx)$/ }, (args) => {
                    const content = fs.readFileSync(args.path, 'utf-8')
                    const {code} = swc.transformSync(content, {
                        filename: args.path
                    })
                    return {
                        contents: code
                    }
                })
            }
        }
    ],
    outdir: 'dist'
})

我们来解释一下都配置了什么东西

  • entryPoints:人口文件
  • bundle:模块是否单独打包
  • loader:编译的文件类型
  • plugins:这个是esbuild的特性,可以添加插件进去,使用我们利用这个特性修改了自定义loader也就是swc
  • outdir:导出文件夹名称

写点东西玩玩

配置好这些以后就可以尽情玩耍了,写点东西玩玩吧

TypeScript
export const a: number = 1;
export const b: string = "ikun";
function test(value: any) {
    console.log(value);
}

export default{
    test
}
let x = 1;
let fn = () => 123;
console.log(x, fn);

然后我们执行如下命令打包成js

Bash
npm run build

还是很快的,虽然代码量不多,但是相比webpack没那么复杂的配置,也没那么慢,虽然esbuild确实要配置一些文件,如果你对esbuild的配置看不懂的话,我们下次讲esbuild和rollup相关的知识 这是打包后的文件

JavaScript
"use strict";
(() => {
  // src/main.ts
  var a = 1;
  var b = "ikun";
  function test(value) {
    console.log(value);
  }
  var main_default = {
    test
  };
  var x = 1;
  var fn = function() {
    return 123;
  };
  console.log(x, fn);
})();

esbuild的高级玩法就自己去探索一下了,它拥有如下玩法

下面是我复制的!!!

  1. 插件系统 swc 和 esbuild 都提供了插件系统,可以通过插件来扩展其功能。例如,swc 的插件可以用于优化代码,提高性能。esbuild 的插件则可以用于处理特定类型的文件,或自定义转换规则。
  2. 缓存系统 swc 和 esbuild 都提供了缓存系统,可以减少重复编译时间。当文件内容没有发生变化时,swc 和 esbuild 会从缓存中读取已编译的代码,以提高构建速度。
  3. Watch 模式 swc 和 esbuild 都支持 Watch 模式,可以在文件发生变化时自动重新编译代码。Watch 模式可以减少手动运行构建命令的频率,提高开发效率。
  4. 自定义插件 最后,我们可以通过编写自定义插件来扩展 swc 和 esbuild 的功能。例如,可以编写一个插件来自动引入 CSS 文件,或者优化 JavaScript 代码。自定义插件可以根据实际需求进行编写,以更好地满足项目的构建需求。