vite核心之esbuild

757 阅读2分钟

前言

  • ESbuild是一款基于Golang开发的打包工具,相比传统的打包工具,主打性能优势,在构建速度上可以快10~100倍

安装

  • npm install esbuild

esbuild的使用

创建入口文件main.js

Image.png

创建一个js文件,对main.js进行打包

Image.png

  • 调用esbuild包的buildSync方法
  • 第一个参数entryPoints,入口点,配置入口文件,会以当前目录进行查找
  • 第二个参数outfile,输出文件名称

用node执行当前js文件

Image.png

  • 打包后输出的内容跟源文件内容一样

加载器

  • 每个内容类型都有一个关联的加载器,它告诉esbuild如何解释文件内容。
  • 也就是类似webpack中的loader

加载器示例

Image.png

  • 修改main.js内容

重新打包,执行打包文件

Image.png

  • 我们会发现报错了,JSX扩展名没有被支持,要想支持必须配置loader

配置loader

Image.png

  • 为js文件配置jsx loader,这个jsxloader是内置的

配置bundle参数进行打包

Image.png

重新执行打包文件

Image.png

plugin插件

  • 一个esbuild插件是一个包含name和setup函数的对象

实现一个esbuild插件-- esbuild-plugin-env

Image.png

Image.png

onResolve

  • onResolve在查找文件路径时触发
  • onResolve第一个参数是过滤器,当你其它文件里引入的模块路径匹配上了这个正则,就会触发这个钩子
  • 第二个参数返回一个对象,path代表此模块的路径,表示未解析的模块路径
  • namespace命名空间,如果不写的话,默认是 file,表示该esbuild在file命名空间运行,对应文件系统上的文件
  • 但是esbuild也可以处理在文件系统上没有对应位置的“虚拟”模块
  • 我们这里可以创建虚拟模块,也就是env。虚拟模块通常使用命名空间而不是file将它们与文件系统模块区分开来,通常命名空间特定于创建它们的插件
  • 我们这个钩子的作用就是拦截env的导入路径,让esbuild不把它们映射到文件的系统中,用env-ns命名空间来标记它们,以使后面的插件可以处理它们

onLoad

  • onLoad,决定模块内容
  • 第一个参数是一个也是过滤器,它也是一个正则,当路径与这个正则不匹配时,将跳过注册的回调
  • 第一个参数种也可以配置命名空间,namespace是可选的。如果提供,回调仅在提供的命名空间中的模块内的路径上运行。也就是说我们提供了命名空间,只会处理匹配到onResolve中注册的相同命名空间所对应的模块
  • 第二个参数回调会返回一个对象,对象中返回内容contents和loader

main.js中借助刚才我们写的插件获取环境变量

Image.png

重新执行打包文件,会发现打包成功