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

13 浏览
0 Comments

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

当我查看Node.JS的\"path\"模块的文档时,它明确说明你必须通过以下方式导入该模块:const path = require(\'path\');

当我查看Node.JS的文件系统\"fs\"模块的文档时,它并没有提到使用 const fs = require(\'fs\'); ,而是讨论了使用导入方法 import { mkdir } from \'fs\';,但是当我尝试使用导入方法时,会出现语法错误:SyntaxError: Cannot use import statement outside a module

使用 const fs = require(\'fs\'); 可以正常工作,但我想确保我的代码一致/正确,所以我应该使用哪一个?如果不要求我使用某些模块很重要,我想找出如何正确地使它工作。

admin 更改状态以发布 2023年5月21日
0
0 Comments

概述

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

require() 是 node.js 加载模块的最初方式,并用于 CommonJS 模块。 require() 在 node.js 中有本地支持,但在浏览器中不支持(尽管有一些第三方库具有类似 require 的模块加载器)。

选择一种

一般来说,你需要选择一种机制,并在整个项目中使用它,这样会将事情变得复杂。在 node.js 中,import 曾经经历了一些增长的烦恼,但现在实现已经相当完整。无论如何,你可能会遇到一些不属于你选择的项目类型的模块,必须学会如何处理它们。

如果我正在开始一个我希望持续一段时间并将在多年内开发的新项目,我会选择具有 import 的 ESM 模块,因为这是 Javascript 模块的当前/未来结构。

如果我正在编写依赖于一堆仅在 CommonJS 中可用的脚本的快速“完成它”的脚本,我可能会使用 CommonJS 的 require()

如果我正在编写想要在 node.js 和浏览器之间共享的模块,则会选择 ESM,因为它在两者中都得到支持。

你的问题

当我查看 Node.JS 的文件系统“fs”模块的文档时,它没有提到 const fs = require('fs'); 而是谈到使用 import 方法 import { mkdir } from 'fs'

当前版本的fs文档允许您选择代码示例显示CJS或ESM模块语法。您显然是在文档显示ESM语法时查看文档的。您可以切换。两种语法都可以使用。

当您在文档中看到此图像enter image description here时,这允许您在文档中切换示例代码从CJS到ESM或反向切换。

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

您还可以修改控制您特定脚本的package.json文件(通过添加"type": "module")如果您想要将您的文件强制变为ESM模块(这允许您使用.js文件作为ESM模块)。

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

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

另外,ESM模块正在获得一些功能(如顶级await),而CJS模块永远不会获得。

更多细节

要了解更多细节,建议阅读这篇文章:

Node Modules at War - 为什么CommonJS和ESM模块无法相处

0