如何修复找不到模块'fs'

Posted

技术标签:

【中文标题】如何修复找不到模块\'fs\'【英文标题】:How to fix cannot find module 'fs'如何修复找不到模块'fs' 【发布时间】:2019-10-19 15:57:31 【问题描述】:

当我尝试使用 writeFile angular 从 fs 导入它时,我尝试运行 ng serve 并得到 ERROR in src/app/app.component.ts(2,27): error TS2307: Cannot find module 'fs'.

我猜我错过了一个简单的选项,比如当你想使用 ng-model 时,你需要在 app.modules.ts 中导入 formsModule

我正在使用:

vscode: 1.34

Angular CLI: 8.0.1
Node: 10.15.3
OS: win32 x64
Angular: 8.0.0
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.800.1
@angular-devkit/build-angular     0.800.1
@angular-devkit/build-optimizer   0.800.1
@angular-devkit/build-webpack     0.800.1
@angular-devkit/core              8.0.1
@angular-devkit/schematics        8.0.1
@angular/cli                      8.0.1
@ngtools/webpack                  8.0.1
@schematics/angular               8.0.1
@schematics/update                0.800.1
rxjs                              6.4.0
typescript                        3.4.5
webpack                           4.30.0

我的tsconfig 看起来像这样:


  "compileOnSave": false,
  "compilerOptions": 
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "esnext",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es2015",
    "typeRoots": ["node_modules/@types"],
    "lib": ["es2018", "dom"],
    "types": ["node"]
  

【问题讨论】:

fs 是一个 NodeJS 库。它需要访问操作系统,而浏览器 javascript 则没有。你不能在 Angular 中使用它。 Angular 应用程序在浏览器中运行,而不是在 NodeJS 中的服务器中。您不能在 Angular 应用程序中使用文件系统。 @JBNizet 从技术上讲,如果您使用的是电子,则可以在浏览器实例中使用 fs。不过,情况略有不同。 @briosheje 从技术上讲,electron 不是浏览器,而是一个完整的桌面应用程序,它可以访问操作系统! @Maryannah 是的,虽然浏览器实例实际上是一个浏览器,但只是想指定这一点,因为 OP 没有指定角度应用程序是在浏览器上运行还是在电子上的铬上运行;)。 【参考方案1】:

你指的是NodeJS模块fs吗?如果是这样,那么该模块仅在 NodeJS 运行时可用。

我假设您正在为 Web 编译 Angular 应用程序。如果是这种情况,请记住浏览器没有 fs 或任何其他 Node 模块;就像 Node 没有 fetchwindow 对象或 API 一样。

作为应用程序捆绑过程的一部分,Angular 编译器无法将 fs 解析为引用的包或已知的 Web API,从而导致您看到消息。

如果您需要类似客户端文件的功能,请考虑使用类似的 Web API,例如 localStorage

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

如果您需要对磁盘和文件系统进行低级访问,那么您需要一些“后端”运行时/SDK/语言,例如 NodeJS、Python 等。

可以在客户端 Javascript 中处理文件。您只需要在浏览器允许的范围内工作。例如,您可以通过使用<input type="file"> 标记然后处理FileList 对象来访问文件的内容。

https://developer.mozilla.org/en-US/docs/Web/html/Element/input/file

同样,您可以启动客户端“下载”以让用户保存文件。

https://npmjs.com/package/file-saver

【讨论】:

谢谢,我想我需要另一种方式来写入文件,我只是想对文件进行排序,我不得不使用 python。 当然,或者 NodeJS 应用程序...但是,如果您需要对磁盘和文件系统进行低级访问,那么您需要一些“后端”运行时/SDK /语言。您可以在客户端 Javascript 中处理文件。您只需要在浏览器允许的范围内工作:例如,您可以通过使用<input type="file"> 标记访问文件内容,然后处理FileList 对象(developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file)。同样,您可以启动客户端“下载”(npmjs.com/package/file-saver)【参考方案2】:
fs is only available in NodeJs runtime. If you want to read and write to a file locally using Angular please refer to 

https://github.com/NativeScript/NativeScript/issues/4465#issuecomment-311618840

【讨论】:

我正在尝试写入未读取的文件,我可以通过简单地使用 fetch 读取文件。 您可以使用该示例进行读写。

以上是关于如何修复找不到模块'fs'的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“错误:找不到模块'@endb/sqlite'”

如何修复“找不到模块'@angular-devkit/schematics'”

找不到模块:错误:无法解析模块“fs”

使用 webpack 时 Node 找不到模块“fs”

使用 webpack 时节点找不到模块“fs”

如何修复material-kit-react'找不到模块:webpack loader错误'