如何在 Node 中读取本地 Markdown 文件?

rus*_*nia 3 javascript fs node.js ecmascript-6

我正在使用一个名为react-markdown. 如果您了解 React,它的实现非常简单。

import React from 'react';
import ReactDOM from 'react-dom';
import ReactMarkdown from 'react-markdown';

var content = '# This is a header\n\nAnd this is a paragraph';

ReactDOM.render(
  <ReactMarkdown source={content} />,
  document.getElementById('root')
);
Run Code Online (Sandbox Code Playgroud)

该库的演示仅讨论将 Markdown 字符串创建为变量,而不是本地文件。对我来说显而易见的事情是fs在 Node.js 中使用。所以我写了以下内容:

import React from 'react';
import ReactDOM from 'react-dom';
import ReactMarkdown from 'react-markdown';
import * as fs from 'fs';
import content from './content/generic.md';

fs.readFile(content, (err, data) => {
  if (err) throw err;
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

在我可以为ReactMarkdown元素提供内容之前,Webpack 抱怨这readFile不是一个函数!

具体来说,它突出显示了该fs.readFile行并说:

TypeError: __WEBPACK_IMPORTED_MODULE_5_fs___default.a.readFile is not a function
Run Code Online (Sandbox Code Playgroud)

如果我使用会发生同样的错误,import {readFile } from 'fs'当我使用 fs.stat 或 fs.open 时也会发生同样的错误。fs 不是 node 的默认库吗?它应该包含在 webpack 的 package.json 中吗?即使我运行npm install --save fs我仍然无法访问这些功能。(PS 我正在使用 create-react-app)

此外,如果我不能这样做fs,还有另一种方法吗?

Li3*_*357 7

fs模块没有默认导出,因此使用默认导入语法导入它是行不通的。该fs模块仅导出命名导出,因此以如下名称导入所有导出fs

import * as fs from 'fs'
Run Code Online (Sandbox Code Playgroud)

这会将所有命名的导出导入为一个名为 的对象的属性fs。这将允许你做fs.readFile。更重要的是,你可以使用名为导出导入到进口只是你需要的功能:

import { readFile } from 'fs'
Run Code Online (Sandbox Code Playgroud)

其次,传递给 Markdown 文件readFile路径,不要直接用 import 语法导入:

fs.readFile('./content/generic.md', 'utf8', (err, data) => {
    ...
});
Run Code Online (Sandbox Code Playgroud)

除非您有正确的加载程序来导入文件,否则不要使用require或导入它import。Node 会将其视为 JavaScript 文件,并尝试将 Markdown 解释为 JavaScript。将 Markdown 文件的路径直接传递给readFile. 还要确保指定编码utf8以获取文件的字符串内容。