为什么没有' fs'导入为ES6模块时的工作?

时间:2018-06-02 21:59:53

标签: node.js fs es6-modules

当我尝试使用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);
});

2 个答案:

答案 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';

它非常适合我,试一试