in esbuild.base.ts [71:130]
async setup(build) {
const distFile = [];
const esFile = [];
build.onLoad({ filter: /(\.tsx)$/ }, async (args) => {
const distPath = args.path
?.replace('src', 'dist')
.replace('tsx', 'js');
const esPath = args.path
?.replace('src', 'es')
.replace('tsx', 'js');
distFile.push(distPath);
esFile.push(esPath);
});
build.onEnd(async (buildResult) => {
if (buildResult.errors?.length) {
return null;
}
const { outputs } = buildResult?.metafile || {};
const assets = Object.keys(outputs);
assets.forEach((asset) => {
if (asset.endsWith('.js')) {
const assetPath = `${process.cwd()}/${asset}`;
fs.readFile(assetPath, 'utf8', (readErr, data) => {
if (readErr) console.error(`构建失败: ${readErr}`);
if (!data) return;
if (
data.match(
/(import_react\.default\.memo|import_react\.default\.forwardRef|React\.forwardRef|React\.memo|\.less)/gm,
)
) {
/**
* 1、将js中less改css引入
* 2、处理esbuild构建在forwardRef、memo场景不会注入PURE
* https://github.com/evanw/esbuild/issues/3492
*/
const result = data
.replace('.less', '.css')
.replace(
/(import_react\.default\.memo|import_react\.default\.forwardRef|React\.forwardRef|React\.memo)/gm,
`/* @__PURE__ */ $1`,
);
fs.writeFile(assetPath, result, (writeErr) => {
if (writeErr) console.error(`构建失败: ${writeErr}`);
});
}
});
if (
asset.endsWith('.types.js') &&
assetPath.includes('/es/')
) {
fs.writeFile(assetPath, 'export {};', (writeErr) => {
if (writeErr) console.error(`构建失败: ${writeErr}`);
});
}
}
});
});
},