当前位置: 首页 > 知识库问答 >
问题:

“要求(x)”和“导入x”之间的区别

翁良弼
2023-03-14

我刚刚开始了一个小节点项目,它将与MongoDB接口。然而,我似乎无法正确地导入相关的节点模块,即使我已经通过npm正确地安装了它们。

例如,以下代码抛出一个错误,告诉我“express没有默认导出”:

import express from "express";

但是,此代码的工作原理:

const express = require("express");

所以我的问题是,import和variable/require方法的功能有什么不同?我想在这个项目上解决困扰我导入的任何问题,因为它似乎可能会在将来引起额外的问题。

共有3个答案

喻高寒
2023-03-14

让我举一个例子,说明如何将express模块包含在require中

-要求

var express = require('express');

-进口

import * as  express from 'express';

因此,在使用上述任何语句后,我们将有一个名为“表达式”的变量。现在我们可以定义'app'变量为,

var app = express(); 

因此,我们将要求和ES6结合使用。

有关要求的更多信息

需要-需要Node.js模块:你需要知道的一切

ode.js中ES6模块的更新

尚景焕
2023-03-14

requireimport之间的主要区别在于require将自动扫描node\u模块以查找模块,但来自ES6的import不会。

大多数人使用Babel编译导入导出,这使得导入的行为与要求相同。

Node.js的未来版本可能支持import本身(实际上,实验版本已经支持了),并且根据Node.js的注释判断,import不支持Node\u模块,它基于ES6,并且必须指定模块的路径。

所以我建议你不要在Babel中使用导入,但是这个功能还没有确定,将来可能会支持node_modules,谁会知道呢?

以下是babel如何将ES6的import语法转换为CommonJS的require语法的示例,以供参考。

假设文件app_es6.js包含此导入:

import format from 'date-fns/format';

这是从节点包日期fns导入格式函数的指令。

相关的package.json文件可能包含如下内容:

"scripts": {
    "start": "node app.js",
    "build-server-file": "babel app_es6.js --out-file app.js",
    "webpack": "webpack"
}

相关的. babelrc文件可以是这样的:

{
    "presets": [
        [
            "env",
            {
                "targets":
                {
                    "node": "current"
                }
            }
        ]
    ]
}

package.json文件中定义的构建服务器文件脚本是巴贝尔解析app_es6.js文件并输出文件app.js指令

运行build-server-file脚本后,如果打开app.js并查找date-fns导入,您将看到它已转换为以下内容:

var _format = require("date-fns/format");

var _format2 = _interopRequireDefault(_format);

尽管计算机能理解,但对大多数人来说,这些文件的大部分内容都是胡说八道。

另外,作为如何创建模块并将其导入项目的示例,如果您安装日期fns,然后打开节点\u模块/date fns/get\u year/index.js,您可以看到它包含:

var parse = require('../parse/index.js')

function getYear (dirtyDate) {
  var date = parse(dirtyDate)
  var year = date.getFullYear()
  return year
}

module.exports = getYear

使用上述babel过程,您的app_es6.js文件可以包含:

import getYear from 'date-fns/get_year';

// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014

巴贝尔会将进口转换为:

var _get_year = require("date-fns/get_year");

var _get_year2 = _interopRequireDefault(_get_year);

并相应地处理对函数的所有引用。

韦阳晖
2023-03-14

这个简单的图表将帮助您理解要求导入之间的区别。

除此之外,

您不能使用require有选择地仅加载所需的片段,但使用import可以有选择地仅加载所需的片段,这样可以节省内存。

对于require加载是同步的(一步一步),另一方面import可以是异步的(无需等待以前的导入),因此它的性能比require稍好。

 类似资料:
  • 问题内容: 在Python中,我不太清楚以下两行代码之间的区别: 要么 他们不是都只是从模块X导入所有内容吗?有什么不同? 问题答案: 之后,你可以参考的东西一样。之后,您可以像一样直接引用事物。因为第二种形式将名称直接导入到本地名称空间,所以如果您从许多模块中导入内容,则可能会产生冲突。因此,不鼓励使用。 您也可以执行,仅将导入到本地名称空间,而不导入中的所有内容。这样做会更好,因为如果您列出了

  • 问题内容: 我有一个用ES6编写的node.js库(与Babel一起编译),在其中导出了以下子模块: 如果从我的主要项目中,我包括这样的图书馆 我可以看到正确的输出,并且可以按预期工作。但是,如果我尝试包含这样的库: 会的。 有人可以解释这里发生了什么吗?这两种导入方法不应该等效吗?如果没有,我想念什么? 问题答案: 正在请求一个具有所有“ lib”命名出口的对象。 被命名为exports,这就是

  • 但是,这段代码是有效的: 所以我的问题是,import和variable/require方法的作用有什么不同?我想解决困扰我在项目上的导入的任何问题,因为这似乎可能会导致更多的问题。

  • 问题内容: 回到大学,我的一位教授。告诉我们要做的只是从基本类型到字符串的快速转换。 我不记得我在Java和C ++课程中上过什么课(我已经有一段时间没有使用过了),但是我现在在C#/。Net中使用它,这正是我主要在开发的课程在最近。 将int,decimal,float等基本类型使用over 有优势吗?什么情况会更好? 注意:还向我展示了该教授,因为它比较短,所以我才建议这样做,从那时起我就一直

  • 问题内容: Java中的x 和 x之间有区别吗? 问题答案: 称为预增量,而称为后增量。

  • 本文向大家介绍MongoDB中NumberLong(x)和 NumberLong("x")之间的区别,包括了MongoDB中NumberLong(x)和 NumberLong("x")之间的区别的使用技巧和注意事项,需要的朋友参考一下 NumberLong(x)超出其限制值并四舍五入,而NumberLong("x")没有。 现在,我们将看一个数字,并将其用于NumberLong(x)和Number