代码之家  ›  专栏  ›  技术社区  ›  Qwertie

为什么导入为ES6模块时“fs”不起作用?

  •  4
  • Qwertie  · 技术社区  · 8 年前

    为什么在尝试对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);
    });
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Qwertie    8 年前

    你必须使用 import fs from 'fs' import * as fs from 'fs' .

    这是因为( 至少从MJS文件的角度来看 ) 'fs' 模块只导出一个东西,称为 default . 所以如果你写信 从“fs”导入*作为fs , fs.default.readFile 存在,但是 fs.readFile 没有。可能所有node.js(commonjs)模块也是如此。

    令人困惑的是,在typescript模块中(带有@types/node和es5输出) 从“fs”导入fs 产生错误

    error TS1192: Module '"fs"' has no default export
    

    所以在打字时你必须 import * as fs from 'fs'; 默认情况下。这似乎可以更改为与使用新的 "esModuleInterop": true option 在tsconfig.json中。