首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"require(x)“和"import x”之间的区别

"require(x)“和"import x”之间的区别
EN

Stack Overflow用户
提问于 2017-10-11 08:04:38
回答 6查看 242.5K关注 0票数 407

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

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

代码语言:javascript
复制
import express from "express";

但是,下面的代码可以工作:

代码语言:javascript
复制
const express = require("express");

所以我的问题是,导入和变量/请求方法的功能有什么不同?我想修复项目中困扰我的导入的任何问题,因为它似乎可能会导致其他问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-10-11 08:38:08

这个简单的图表将帮助您理解requireimport之间的区别。

除此之外,

使用require,你不能选择性地加载你需要的部分,但是使用import,你可以有选择地加载你需要的部分,这可以节省内存。

对于require,加载是分步进行的( synchronous(step ),而另一方面,import可以是异步的(无需等待之前的导入),因此它可以比require执行得更好一些。

票数 494
EN

Stack Overflow用户

发布于 2017-10-11 10:03:36

requireimport之间的主要区别在于,require会自动扫描node_modules来查找模块,而来自ES6的import则不会。

大多数人使用babel来编译importexport,这使得import的行为与require相同。

Node.js的未来版本可能会支持import本身(实际上是the experimental version already does),根据Node.js的说明判断,import不会支持node_modules,它基于ES6,并且必须指定模块的路径。

所以我建议你不要和巴别塔一起使用import,但是这个功能还没有得到确认,它将来可能会支持node_modules,谁会知道呢?

作为参考,下面是babel如何将es6es6的import语法转换为CommonJS的require语法的示例。

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

代码语言:javascript
复制
import format from 'date-fns/format';

这是一个从节点包date-fns导入format函数的指令。

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

代码语言:javascript
复制
"scripts": {
    "start": "node app.js",
    "build-server-file": "babel app_es6.js --out-file app.js",
    "webpack": "webpack"
}

相关的.babelrc文件可能如下所示:

代码语言:javascript
复制
{
    "presets": [
        [
            "env",
            {
                "targets":
                {
                    "node": "current"
                }
            }
        ]
    ]
}

package.json文件中定义的这个build-server-file脚本是让babel解析app_es6.js文件并输出文件app.js的指令。

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

代码语言:javascript
复制
var _format = require("date-fns/format");

var _format2 = _interopRequireDefault(_format);

这些文件的大部分对大多数人来说都是令人费解的,但计算机却能理解它。

同样作为参考,作为如何创建模块并将其导入到项目中的示例,如果您安装date-fns,然后打开node_modules/date-fns/get_year/index.js,您可以看到它包含:

代码语言:javascript
复制
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文件可以包含:

代码语言:javascript
复制
import getYear from 'date-fns/get_year';

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

而babel会将导入转换为:

代码语言:javascript
复制
var _get_year = require("date-fns/get_year");

var _get_year2 = _interopRequireDefault(_get_year);

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

票数 149
EN

Stack Overflow用户

发布于 2018-08-09 13:29:35

让我给出一个示例,说明如何在require & import中包含express模块

-require

代码语言:javascript
复制
var express = require('express');

-import

代码语言:javascript
复制
import * as  express from 'express';

因此,在使用上面的任何语句之后,我们将拥有一个名为“express”的变量。现在我们可以将'app‘变量定义为,

代码语言:javascript
复制
var app = express(); 

因此,我们将'require‘与'CommonJS’一起使用,将'import‘与'ES6’一起使用。

有关'require‘和'import’的更多信息,请阅读下面的链接。

require Requiring modules in Node.js: Everything you need to know

导入- An Update on ES6 Modules in Node.js

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46677752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档