当我尝试使用ES6模块的新Node.js支持时(例如使用node --experimental-modules script.mjs
),为什么会出现类似这样的错误?
// script.mjs
import * as fs from 'fs';
// TypeError: fs.readFile is not a function
fs.readFile('data.csv', 'utf8', (err, data) => {
if (!err) {
console.log(data);
}
});
// TypeError: fs.readdirSync is not a function
fs.readdirSync('.').forEach(fileName => {
console.log(fileName);
});
答案 0 :(得分:3)
您必须使用import fs from 'fs'
,而不是import * as fs from 'fs'
。
这是因为(至少从mjs文件的角度来看)'fs'
模块只导出一件事,称为default
。因此,如果您撰写import * as fs from 'fs'
,则fs.default.readFile
存在但fs.readFile
不存在。所有Node.js(CommonJS)模块也许如此。
令人困惑的是,在TypeScript模块中(带有@ types / node和ES5输出),import fs from 'fs'
会产生错误
error TS1192: Module '"fs"' has no default export
因此在TypeScript中,您必须默认编写import * as fs from 'fs';
。看来这可以更改为匹配mjs文件使用tsconfig.json中的新"esModuleInterop": true
option工作的方式。
答案 1 :(得分:0)
我们可以简单地在我们的代码中像这样导入
import * as fs from 'fs';
它非常适合我,试一试