如何编写 esbuild 插件

简介: 如何编写 esbuild 插件

image.png


esbuild 是一个新的 web 构建工具,它是使用 go 语言编写的。它最大的特点就是快。更多内容可以通过官网了解 https://esbuild.github.io/


今天我们的重点在于如何编写 esbuild 插件。因为 esbuild 比较新,生态还是比较少的,所以遇到一些需求,我个人更倾向于自己实现插件。


esbuild 的插件 api 还是比较简单的,只有 onResolve 和 onLoad,一个用来处理路径相关的问题,一个用来处理加载数据。



onResolve

可以用它来处理路径相关的需求。

onResolve({ filter: filter }, async (args) => {    
return {   
path,  
};
});

filter 表示路径的过滤条件,在 onLoad 中也是一样的用法,比如你要处理所有的 md 文件,你可以用 filter: /\.md$/,比如给所有的 md 文件添加前缀就是

onResolve({ filter: /\.md$/ }, async (args) => {
    // 只是演示,给这个路径加前缀没什么实际作用
    const path = `prefix/${args.path}`;
    return {
        path,
    };
});

onResolve 还有一个使用的用法,是在 return 的时候指定 namespace,默认的namespace 一般是 file。你可以通过指定 namespace 把文件归类,这样在 onLoad 中可以针对这些文件做特殊处理。


比如官网中的例子:

onResolve({ filter: /^env$/ }, args => ({
    path: args.path,
    namespace: 'env-ns',
}))
onLoad({ filter: /.*/, namespace: 'env-ns' }, () => ({
    contents: JSON.stringify(process.env),
    loader: 'json',
}))


这样你就可以在项目代码中使用 env,哪怕实际上并不存在这个模块和文件。

import { PATH } from 'env'
console.log(`PATH is ${PATH}`)



onLoad

可以用它来处理内容相关的需求。一般是对文件内容有修改的时候,会用到它。比如上面的例子,就是把本来是不存在内容,指定为 JSON.stringify(process.env) 所以就算本来这个文件不存在,在项目中也可以正常使用。

我们可以用它来实现一些 esbuild 官方还不支持的 loader,比如处理 less 文件,使用 postcss 等。

这里用 less 做个演示:

onLoad({ filter: /\.less$/ }, async (args) => {
    let content = await fs.readFile(args.path, 'utf-8');
    const dir = path.dirname(args.path);
    const filename = path.basename(args.path);
    const result = await less.render(content, {
        filename,
        rootpath: dir,
        paths: [...(lessOptions.paths || []), dir],
    });
    return {
        contents: result.css,
        loader: 'css',
        resolveDir: dir,
    };
});

因为 esbuild 不能识别 less 文件,所以上面的例子中我们用 less.render 将 less 文件转换成 esbuild 能够识别的 css 文件。


当然 less 的实际处理要比上述的复杂的多,这里只是演示,如果需要真正的例子,可以参考 umi-next 中的实现。



目录
相关文章
|
SQL 分布式计算 监控
MaxCompute提供了一些工具以帮助您监控作业和资源使用情况。
【2月更文挑战第4天】MaxCompute提供了一些工具以帮助您监控作业和资源使用情况。
200 8
|
缓存 API 定位技术
使用Python调用百度地图API实现地址查询
使用Python调用百度地图API实现地址查询
889 0
|
架构师 开发者 运维
开发人员各级岗位胜任力模型
上个月,我写了一篇《架构设计师能力模型》,为开发者指出一些发展的方向、架构师的能力要求,以及需要学习的相关知识。 本月,我为公司的人力部门编制了更加量化的《2017年研发人员岗位能力模型 V1.4》。
10408 0
|
机器学习/深度学习
使用LSTM预测结果为一条直线原因总结
使用LSTM预测结果为一条直线原因总结
4016 1
使用LSTM预测结果为一条直线原因总结
|
1月前
|
人工智能 算法 小程序
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。真的是太好用了,一点也不比 Cursor 差。
609 10
|
10月前
|
人工智能 搜索推荐 开发者
ClotheDreamer:上海大学联合腾讯等高校推出的3D服装生成技术
ClotheDreamer是由上海大学、上海交通大学、复旦大学和腾讯优图实验室联合推出的3D服装生成技术,能够根据文本描述生成高保真、可穿戴的3D服装资产,适用于虚拟试穿和物理精确动画。
227 6
ClotheDreamer:上海大学联合腾讯等高校推出的3D服装生成技术
|
存储 数据可视化 API
1688商品详情数据接口:如何通过1688 API实现批量商品数据抓取和分析
使用1688 API进行批量商品数据抓取和分析,首先需注册账号创建应用获取App Key和Secret Key。研究API文档,构建请求URL,如商品详情、搜索、销售量等接口。利用编程语言发送HTTP请求,实时抓取并处理数据,存储到数据库。实施优化策略,处理错误,记录日志。数据可视化展示并确保API安全性。编写文档并持续更新以适应API变化。参考[c0b.cc/R4rbK2]获取API测试和SDK。
|
安全 Java 测试技术
一文帮你搞定JDK8升级11
本文记录了作者从JDK8升级到11的实践过程和升级后的效果以及JDK11新玩法。
386 10
|
存储 NoSQL 大数据
【MongoDB】GridFS机制
【4月更文挑战第2天】【MongoDB】GridFS机制
|
消息中间件 中间件 API
中间件数据转换与处理
【7月更文挑战第6天】
373 6