想实现一个 plugin,在 esbuild build 某个 .less 文件时,在 bundle 之前拿到输出的 .css 文件并复制到另外的文件夹。
当前项目中在 angular build 之后另外用 gruntfile.js 进行了 build,想实现一个 esbuild plugin 基于 custom-esbuild 在 angular build 过程中直接完成这个操作,因为 angular build 时已经对对应的 .less 文件进行了 build
module.exports = function (grunt) {
grunt.initConfig({
cssmin: {
options: {
mergeIntoShorthands: false,
roundingPrecision: -1,
},
target: {
files: {
'./dist/assets/code-sandbox.css': ['./dist/assets/code-sandbox.css']
},
},
},
less: {
production: {
files: {
'./dist/assets/code-sandbox.css': './src/styles/code-sandbox.entry.less'
},
options: {
compress: true,
javascriptEnabled: true,
},
},
},
});
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default', ['less', 'cssmin']);
};
参考 github 上的 issue 中的代码打印了 outputFiles 中的文件路径
const copyArtifacts: Plugin = {
name: 'copy-artifacts',
setup(build: PluginBuild) {
build.onEnd(async ({ errors, outputFiles }) => {
if (!errors.length && outputFiles?.length) {
await Promise.all(
outputFiles.map(async (out) => {
console.log(out.path);
})
);
}
});
},
};
除了1个 less 文件
media\tinymce5.content-YPBG7PHA.less
4个png文件
media\success-LS5EBYM3.png
media\warning-65PU5SZA.png
media\info-SF3MXQYN.png
media\error-65PU5SZA.png
其他全是下面这样的js文件,有很多
chunk-QAP4OU6J.js
chunk-YMHKQMDZ.js
chunk-VPY36POI.js
chunk-V5XISDFL.js
chunk-DJBDPZBN.js
chunk-JZ7BW5K6.js
chunk-QDS4EWGT.js
要实现一个 esbuild
插件,在处理 .less
文件时获取输出的 .css
文件并将其复制到另一个文件夹,你可以使用 onEnd
钩子来检测构建的输出文件。你已经找到了使用 outputFiles
来获取输出文件路径的方法。下面是一个具体的实现示例。
以下是一个实现这个功能的 esbuild
插件的代码示例。假设你已经在你的项目中正确安装并配置了 esbuild
。
const fs = require('fs');
const path = require('path');
const copyArtifacts = {
name: 'copy-artifacts',
setup(build) {
build.onEnd(async ({ errors, outputFiles }) => {
if (!errors.length) {
// 遍历所有输出文件
outputFiles.forEach(out => {
const filePath = out.path;
// 检查文件扩展名,如果是 .css 文件
if (filePath.endsWith('.css')) {
// 定义目标复制路径,可以根据需求自定义
const targetDir = path.join(__dirname, 'dist/css');
const targetPath = path.join(targetDir, path.basename(filePath));
// 确保目标目录存在
fs.mkdirSync(targetDir, { recursive: true });
// 写入文件
fs.writeFileSync(targetPath, out.contents);
console.log(`Copied ${filePath} to ${targetPath}`);
}
});
}
});
},
};
module.exports = copyArtifacts;
在你的构建脚本中,将这个插件与 esbuild
一起使用。例如:
const esbuild = require('esbuild');
const copyArtifacts = require('./path/to/copyArtifacts');
esbuild.build({
entryPoints: ['./src/styles/code-sandbox.entry.less'],
bundle: true,
outdir: 'out',
plugins: [copyArtifacts],
}).catch(() => process.exit(1));
获取输出文件: 在 build.onEnd
钩子中,你可以得到构建产生的所有输出文件。我们遍历这些文件,检查它们的扩展名,如果是 .css
文件,则进行后续操作。
创建目标目录: 使用 fs.mkdirSync
确保要复制到的目录存在,{ recursive: true }
选项确保可以创建多层目录。
复制文件: 使用 fs.writeFileSync
方法将输出内容写入到指定目录中。
使用插件: 在 esbuild
的 build
方法中,将自定义插件添加到 plugins
数组中。
通过运行你的 esbuild
构建脚本后,如果你的 .less
文件被处理并输出了 .css
文件,插件将自动复制这些文件到指定的 dist/css
目录中。
esbuild
,并且项目依赖已经正确配置。