当我查看“path”模块的 Node.JS 文档时,它明确指出您必须通过执行以下操作导入模块:const path = require('path');
当我查看文件系统“fs”模块的 Node.JS 文档时,它没有提及执行此操作,const fs = require('fs);而是讨论使用 import 方法import { mkdir } from 'fs';,但是当我尝试使用 import 方法时,出现语法错误:SyntaxError: Cannot use import statement outside a module
使用const fs = require('fs');工作得很好,但我想确保我的代码是一致/正确的,所以我应该使用哪一个,为什么?如果不需要某些模块对我来说很重要,我想弄清楚如何使其正常工作。
jfr*_*d00 20
概括
import是 Nodejs 和浏览器中 Javascript 语言的未来,在 ECMAScript 模块(ESM 模块)中用于静态或动态加载其他模块。
require()是nodejs加载模块的原始方式,并在CommonJS模块中使用。 require()在 Nodejs 中原生支持,但在浏览器中不支持(尽管有一些第三方库为浏览器提供类似 require 的模块加载器)。
选一个
您通常会希望选择一种机制并将其用于整个项目,因为它使混合/匹配的事情变得复杂。 import在nodejs中有一段时间遇到了一些成长的烦恼,但现在实现已经相当完成了。无论哪种方式,您可能会遇到一些不属于您为项目选择的类型的模块,并且必须学习如何处理它。
如果我要开始一个新项目,我预计会持续一段时间并为此工作多年,我会选择 ESM 模块,因为import这是 Javascript 模块的当前/未来架构。
如果我正在编写一个快速的“完成它”类型的脚本,该脚本依赖于一堆仅在 CommonJS 中可用的脚本,我可能会使用 CommonJS require()。
如果我正在编写想要在 Nodejs 和浏览器之间共享的模块,我会选择 ESM,因为两者都支持它。
你的问题
当我查看文件系统“fs”模块的 Node.JS 文档时,它没有提到执行 const fs = require('fs); 相反,它讨论使用导入方法 import { mkdir } from 'fs'
当前版本的fs文档允许您选择是否希望代码示例显示 CJS 或 ESM 模块语法。当它显示 ESM 语法时,您显然正在查看该文档。你可以切换它。两者都可以。
当你看到这张图片时
在文档中,它允许您将文档中的示例代码从 CJS 切换到 ESM 或返回。
语法错误:无法在模块外部使用 import 语句
在nodejs中,您必须以某种方式告诉nodejs您的顶级模块是CJS还是ESM。默认情况下,.js文件被视为 CJS,.mjs文件被视为 ESM。如果nodejs认为您有CJS文件,则无法使用import(仅适用于ESM模块)。
您还可以修改package.json控制特定脚本的文件("type": "module"如果需要,可以通过添加并强制将文件添加到 ESM 模块(这允许您将.js文件用作 ESM 模块)。
使用
const fs = require('fs');效果很好
是的,如果nodejs认为你正在使用CJS模块。
我想确保我的代码是一致/正确的,所以我应该使用哪一个,为什么?
请参阅我之前关于何时选择每种模块类型的解释。如果你刚刚学习,我建议你学习如何告诉nodejs你正在使用ESM模块并使用,import因为这是该语言的未来方向。 require()不会很快消失,但如果我们开始看到新的 NPM 包(可共享模块)仅支持较新的 ESM 语法并且只能从 ESM 模块加载,我不会感到惊讶。可以(经过一些仔细的工作)制作一个可由 ESM 模块或 CJS 模块加载的可共享模块。
await此外,ESM 模块正在获得一些CJS 模块永远无法获得的功能(例如顶级)。
更多细节
想要了解更多详情,我建议阅读这篇文章:
战争中的 Node 模块 - 为什么 CommonJS 和 ESM 模块不能相处
| 归档时间: |
|
| 查看次数: |
18585 次 |
| 最近记录: |