Node.js 中 Require 和 Import 的区别

2025 年 2 月 11 日 | 阅读 4 分钟

在本文中,我们将讨论 Node.js 中的 "require""import"。Node.js 包含几种应用程序编程软件构造,其中包括 require 和 import。需要指出的是,这些是模块化过程,我们可以通过它们在 Node.js 应用程序中使用模块。它们帮助我们访问外部 JavaScript 文件或模块。这些文件中定义的所有函数都可以立即实现。此外,require 和 import 在语法和/或行为方式上存在差异。识别这些差异是使用 Node.js 项目中的依赖项不可或缺的一部分。

Require 是什么?

require 是 Node.js 提供的一个函数,它帮助我们加载模块。它是 Node.js 中集成外部包的最古老的方法。它基于 CommonJS 模块系统,该系统在 Node.js 中用作默认模块系统。

语法

它具有以下语法:

在此,module-name 指的是要包含的模块的名称或路径。它可以是核心模块、已安装的 NPM 模块,或者是在您的应用程序中定义的模块。

使用 require 时,Node.js 会在以下位置搜索模块:

  • 核心模块:使用 Node.js,我们可以获得一组内置模块,无需单独安装即可导入。
  • node_modules 目录:如果模块不是核心模块,它会在应用程序的 node_modules 目录中搜索。
  • 相对路径:我们可以提供相对路径或绝对路径来运行应用程序中的特定文件或模块。

当模块加载完成后,我们将能够通过 module 对象访问其导出的功能。

Import 是什么?

importECMAScript (ES) 模块语法,在比 (ES2015 或更高版本) 更新的 JavaScript 版本中引入。它创建了一种统一的导入模块的方式,并且在 Node.js 应用程序中的使用日益增多。

语法

它具有以下语法。

与 'require' 一样,'module-name' 是应该导入的库的名称或路径。但是,require 和 import 之间存在一些差异。

  • import 更具声明性:它明确地将导入的模块放置在文件开头,以便更容易理解它具有的依赖关系。
  • import 支持命名导入:有多种方式,您可以使用 import 'name' from 'module-name' 语法,有选择地只导入整个模块的某些部分。
  • import 支持默认导出:模块可以导出一个默认值,可以使用 import module as 'module-name' 来导入。

为了在 Node.js 中使用 import,我们需要在 package.json 文件中设置 "type": "module" 字段,或者为 JavaScript 文件添加 .mjs 文件扩展名。需要强调的是,虽然 import 是现代 JavaScript 中导入模块的首选方式,但 Node.js 中ES modules 的学习版本可能无法与某些模块或第三方库一起使用。

Node.js 中 Require 和 Import 的主要区别

Difference between Require and Import in node.js

Node.js 中 require 和 import 之间存在几个区别。一些主要区别如下:

功能Require进口
语法require 的语法遵循 CommonJS 风格。我们可以这样使用它:import const module = require('module-name');语法是 ES6 模块。我们可以这样使用它:import module from 'module-name';
动态/静态动态加载模块,无需重新加载整个系统。这表明模块仅在调用 require 函数时才加载。在编译时静态加载模块。这意味着模块在代码的编译阶段被加载和解析。
异步/同步默认情况下,它以同步方式运行,这意味着它会阻塞进一步的执行,直到加载完所需的模块。import 基本上默认以异步方式设置,这使得应用程序在导入模块时可以继续运行。这是一种非阻塞行为。
访问导出该模块确保我们能够导出要用于实际情况的站点。exports 对象公开导出的功能。默认情况下,导入将按原样分配,无需使用 module.exports 等任何额外属性。为了使用命名导出,它们通过解构赋值 ({ exportName }) 来访问。
兼容性这些需求在所有 Node 版本中都得到满足。ESL 也一样,因为它遵循 CommonJS 模块模式。import 仅是 Node 最新版本中允许使用的功能。它允许使用基于 ES6 模块语法的单元测试框架在 Node.js v12 中实现。
缓存首次调用 require() 会将模块缓存。后续调用会转移到缓存的模块。此外,模块在首次导入后也会被缓存。在后续加载中,模块缓存会被调用以返回与 require() 相同的情况下的缓存模块。

结论

总而言之,importrequire 都提供了一种在 Node.js 应用程序中包含模块的方式,它们在语法、行为以及与浏览器的兼容性上存在差异。另一方面,require 是一种适用于从早期版本到最新版本的 Node 所有版本的旧方法。Node.js 也可以使用,但 import 被认为是更现代的方法,适用于支持 ES6 模块标准的较新版本。选择哪一个取决于项目规范、兼容性问题和个人偏好。