提问者:小点点

何时在Node.JS中使用“import”和何时使用“require”


当我查看 Node 的文档时.JS对于“路径”模块,它明确指出您必须通过执行此操作来导入模块:const path = require('path');

当我查看Node的文档时。对于文件系统“fs”模块,它没有提到执行< code > const fs = require(' fs);相反,它谈到使用导入方法< code >从“fs”导入{ mkdir };但是当我尝试使用import方法时,我得到一个语法错误:< code>SyntaxError:不能在模块外使用import语句

使用const fs=require('fs')工作正常,但我想确保我的代码是一致的/正确的,所以我应该使用哪一个,为什么?如果不需要某些模块对我来说很重要,我想知道如何使其正确工作。


共1个答案

匿名用户

总结

import 是 Javascript 语言在 nodejs 和浏览器中的未来,用于 ECMAScript 模块(ESM 模块)中,用于静态或动态加载其他模块。

要求()是nodejs加载模块的原始方式,并在通用JS模块中使用。要求()在nodejs中是原生支持的,但在浏览器中不受支持(尽管有一些第三方库具有类似浏览器的模块加载器)。

选择一个

您通常希望选择一种机制并将其用于整个项目,因为它会使混合/匹配的事情变得复杂。导入在 NodeJS 中有一些成长的痛苦,但现在实现相当完整。无论哪种方式,您都可能会遇到一些不属于您为项目选择的类型的模块,并且必须学习如何处理它。

如果我开始一个我希望持续一段时间并持续多年的新项目,我会选择带有导入的ESM模块,因为这是Javascript模块的当前/未来架构。

如果我正在编写一个快速的“完成”脚本,它依赖于一堆只有CommonJS才能使用的脚本,那么我可能会使用CommonJSrequire()

如果我正在编写我想在nodejs和浏览器之间共享的模块,我会选择ESM,因为两者都支持它。

您的问题

当我查看文件系统“fs”模块的Node.JS文档时,它没有提到执行const fs=require('fs);相反,它讨论使用import方法从“fs”导入{mkdir}

fs文档的当前版本允许您选择是否希望代码示例显示CJS或ESM模块语法。当文档显示ESM语法时,您显然正在查看文档。你可以切换一下,两者都可以。

语法错误:无法在模块外部使用import语句

在nodejs中,您必须以某种方式告诉nodejs您的顶级模块是CJS还是ESM。默认情况下,.js文件被视为CJS,而.mjs则被视为ESM。如果nodejs认为您有CJS文件,则不能使用import(这仅适用于ESM模块)。

您还可以修改控制特定脚本的package.json文件(通过添加“type”:“module”并根据需要将文件强制到ESM模块(这允许您将.js作为ESM模块使用)。

使用< code > const fs = require(' fs ');工作正常

是的,如果nodejs认为您正在使用CJS模块。

我想确保我的代码是一致的/正确的,那么我应该使用哪一个,为什么?

请参阅我之前关于何时选择每种模块类型的解释。如果您只是在学习,我建议您学习如何告诉nodejs您正在使用ESM模块并使用导入,因为这是该语言的未来方向。要求()不会很快消失,但如果我们开始看到新的NPM包(可共享模块)只支持更新的ESM语法并且只能从ESM模块加载,我不会感到惊讶。(通过一些仔细的工作)可以制作一个可共享模块,可以由ESM模块或CJS模块加载。

此外,ESM模块正在获得一些CJS模块永远不会获得的功能(例如顶级wait)。

更多详细信息

更多细节,我建议阅读这篇文章:

节点模块处于战争状态-为什么CommonJS和ESM模块无法相处