在我的 index.mjs 文件中,我有一个连接和缩小 JS 实用程序文件的函数。我是这样设置的:
import fs from "fs";
import { minify } from "terser";
function concatenateAndMinifyJsFiles() {
const jsDir = "./js/";
const mainJsFile = "./js/main.min.js";
// Concatenate and minify .js files
fs.readdir(jsDir, { withFileTypes: true }, (err, files) => {
if (err) {
console.error(`Error reading directory ${jsDir}: ${err}`);
return;
}
const jsFiles = files.filter((file) => file.isFile() && file.name.endsWith(".js"));
if (jsFiles.length === 0) {
console.log(`No .js files found in ${jsDir}`);
return;
}
const concatenatedJs = jsFiles.map((file) => fs.readFileSync(`${jsDir}${file.name}`, "utf8")).join("\n");
const minifiedJs = minify(concatenatedJs).code;
fs.writeFile(mainJsFile, minifiedJs, (err) => {
if (err) {
console.error(`Error writing file ${mainJsFile}: ${err}`);
} else {
console.log(`File ${mainJsFile} has been created`);
}
});
});
}
我收到以下类型错误消息:
node:internal/fs/utils:885
throw new ERR_INVALID_ARG_TYPE(
^
TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received undefined
一次注释掉每个部分后,似乎使用
writeFile
命令的部分:
fs.writeFile(mainJsFile, minifiedJs, (err) => {
if (err) {
console.error(`Error writing file ${mainJsFile}: ${err}`);
} else {
console.log(`File ${mainJsFile} has been created`);
}
});
mainJsFile
值是一个字符串。 Terser minify 函数中的 minifiedJs
值也是一个字符串(来自 concatenatedJs
变量)。
我使用的是 Node 版本 16.15.1。我在代码中看不到任何与 Node 文档 不相称的内容。关于为什么会抛出这个错误有什么想法吗?
您从 fs 模块看到的错误是正确的。您为数据参数传递的值不是允许的类型之一。
根据 Terser 的文档(位于 https://www.npmjs.com/package/terser),minify 函数是异步的,因此您必须在调用之前添加
await
。 writeFile
调用会抱怨,因为数据类型实际上是 Promise<string>
,而不是 string
。
尝试使用以下方法:
const result = await minify(concatenatedJs);
const minifiedJs = result.code;
请注意我如何将其拆分为两个变量(主要是为了清楚起见),因为在等待结果之前您无法访问
code
属性。