概述

在Node.js项目中导入包时,您可能遇到了两个关键字,即 require 和 import。嗯,这两个关键字都用于导入Node.js项目中的包或模块。但它们之间存在一定的差异。

介绍

我们先来了解一下Node.js中的模块。模块是封装在单个或多个文件中的代码块,以方便应用程序的相关功能。模块将复杂的长段代码分解为更小的部分,以便于调试和管理。模块还有助于代码的可重用性。

Node.js主要有两个模块系统:

CommonJS 模块和ECMAScript 模块。

CommonJS 是默认的模块系统。

Node.js有三种类型的模块:

核心模块:这些是内置模块,如: http、fs 等。本地模块: 这些模块由程序员在本地创建。第三方模块: 这些模块可在安装后使用 NPM(节点包管理器)使用,例如:express、mongoose 等。

现在,让我们看看在应用程序中包含这些模块的不同方法:

需要Node.js

如上所述,Node.js遵循 CommonJS 模块系统,内置的 require 函数是将模块包含在该系统中的最简单方法。当我们在 Node.js 中调用 require 时,require 函数首先读取一个 JavaScript 文件,执行该文件,然后 require 函数继续返回 exports 对象。

调用 require 函数时,Node 将执行以下一系列步骤:

解析: 在此步骤中,Node 获取模块的绝对路径。它按照以下步骤解析路径:

对于 const test = require('example') 语法:

它首先查找具有该名称的核心模块。如果不存在这样的核心模块,那么它会查找当前文件夹的名称为 node_modules/ 的文件,如果找不到模块,那么它将在当前文件夹的父文件夹中查找它。如果找到具有该名称的文件夹,其中包含index.js文件,则加载该index.js文件。对于路径以 ./ 或 .. 开头的语法。/ 喜欢: const test = require('./lib/example.js') :

此类语法可以包含绝对路径或相对路径。因此,在这种情况下,将加载该位置存在的文件。

注意:如果在执行这些步骤后未找到任何文件,则会引发错误。

加载: 在此步骤中,Node 加载模块并确定文件内容的类型。包装: 加载后,模块代码被包装在一个特殊函数中,该函数将提供对几个对象的访问。它还为变量提供了单独的作用域。评估: 在此步骤中,JavaScript 引擎(通常为 V8)执行包装函数中存在的代码,并导出文件中 module.exports 中提到的函数或变量。缓存: 在评估步骤之后,Node.js模块在首次加载模块时被缓存(即存储以备将来使用)。稍后,如果您下次需要加载相同的节点模块,则node.js不会再次为该模块执行上述步骤,因为它将从缓存中复制该模块。

Node.js中 require 的语法和示例

加载核心模块

语法:

var test = require('module_name')

例:

var http = require('http')

加载本地模块

为了加载本地创建的模块,我们可以通过以下方式提供所需函数的路径。

使用绝对路径

语法:

var test = require('///.../module')

例:

var http = require('/lib/obj/util.js')

使用相对路径

我们还可以使用 ./ 或 .. 提供相对路径。/ 在所需的功能中。

语法:

var test = require('./module_name')

例:

var hello = require('../hello.js')

注意: 您也可以在上面的示例中省略.js扩展名,即如果您不提供任何扩展名,则 Node 会搜索具有该module_name和.js扩展名的文件并加载它。

使用文件夹路径

您也可以仅按文件夹路径加载模块:

var test = require('./folder_name')

例:

var hello = require('./lib')

默认情况下,节点在该文件夹中查找index.js文件并加载它。否则,我们还可以在该文件夹中创建一个package.json文件,在其中我们可以定义默认情况下要加载的节点模块名称。

Node.js导入

根据 CommonJs 模块系统中的需要工作,同样,import 用于将模块包含在 ES6(ECMA 脚本的第 6 版)模块系统中。这意味着 import 用于包含 ES 模块。目前Node.js不支持直接导入 ES6。因此,如果我们尝试使用 import 关键字直接在 node js 中导入模块,它会抛出错误。 那么,我们如何使用 import 来包含模块,那么您可以通过以下方式做到这一点:

使用“.mjs”扩展名

在 Node.js 中使用 ES6 import 语句的第一种方法是保存带有 “.mjs” 扩展名的 JavaScript 文件,而不是使用典型的 “.js” 扩展名。

如上所述,Node.js的默认模块系统是 CommonJs,它支持用于导入模块的 require 函数。因此,如果我们想使用 ECMAScript 模块系统,那么“.mjs”扩展名可以帮助我们实现这一目标。

使用 package.json 文件

通过这种方法,我们可以在使用 ECMAScript 的 import 语句时使用“.js”扩展。为此,我们需要在项目中包含一个package.json文件。package.json的内容应该是这样的:

// package.json

{

"name": "node_import",

"version": "1.0.0",

"description": "",

"main": "index.js",

"type": "module",

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1"

},

"keywords": [],

"author": "",

"license": "ISC"

}

上述package.json文件中的“type”属性有助于确定项目应使用的模块系统。“type”可以是“module”或“commonjs”。如果类型为“module”,则启用 ECMAScript 模块系统,而如果类型为“commonjs”,则它属于 CommonJS 模块系统。

我们可以通过以下方式使用 import 语句:

// Importing the entire module

import * as name from 'module_name'

// Importing the default export from the module

import name from 'module_name'

// Importing a single export from the module:

import { name } from 'module_name'

// Importing multiple exports from the module:

import { name1, name2 } from 'module_name'

Require 和 Import 之间的区别

requireimport它用于 CommonJS 模块系统。它用于 ES6(ECMAScript 版本 6)模块系统。在 require 中加载是同步的(即模块是按顺序导入的)。加载在导入时是异步的(即,导入模块时无需等待先前的模块导入完成)。由于同步加载性能要求不如导入效率。因为导入的异步加载性能比要求的要好。如果我们使用 require 导入一个模块,那么就会导入完整的模块。因此,内存使用量更大。使用 import,我们可以有选择地在模块中加载代码片段。因此,与需要相比,内存使用量更少。需要导入模块导出的组件。import 包括通过模块中的 export 导出的组件。require 可以直接调用,因为它是默认的导入方式。要在我们的项目中使用导入,我们需要在我们的项目中启用 ES6 或 ECMAScript 模块。require 可以在程序中的任何位置调用导入仅在程序顶部有效

结论

模块是封装的代码块,根据其相关功能在外部应用程序中使用。可以使用两种方式将模块包含在项目中:require 或 import。require 是 CommonJS 模块系统提供的内置函数,用于导入模块。import 语句在 ES6 或 ECMAScript 模块系统中用于包含模块。require 包含完整的文件,而通过导入,我们只能包含特定的导出组件。要在项目中使用 ES6 模块系统,请执行以下任一步骤:

使用“.mjs”扩展名代替项目中默认的“.js”扩展名。将package.json文件中“type”属性的值编辑为“module”。

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: