"要求(x)"之间的区别并导入x

时间:2017-10-11 00:04:38

标签: node.js typescript import require

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

例如,以下代码抛出并出错,告诉我" express没有默认导出":

import express from "express";

但是,此代码有效:

const express = require("express");

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

7 个答案:

答案 0 :(得分:40)

帮助我理解requireimport之间差异的答案是Using Node.js require vs. ES6 import/export,其中包含一个简单的图表:

enter image description here

答案 1 :(得分:16)

requireimport之间的主要区别在于require会自动扫描node_modules以查找模块,但import来自ES6,惯于。但现在大多数人会使用 babel 来编译importexport,这会使importrequire的行为相同,但未来的版本Node.js可能支持import本身(实际上,实验版本已经做过),并且根据Node.js的说明判断,import将不支持node_modules,它基于ES6,并且必须指定模块的路径。

所以我建议您不要将import与babel一起使用,但此功能尚未确认,将来可能会支持node_modules,谁知道呢?

答案 2 :(得分:5)

让我举一个包含require&import的Express模块​​示例

-需要

var express = require('express');

-导入

import * as  express from 'express';

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

var app = express(); 

因此,我们将'require'与'CommonJS'结合使用,并将'import'与'ES6'结合使用。

有关“要求”和“导入”的更多信息,请仔细阅读以下链接。

需要-Requiring modules in Node.js: Everything you need to know

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

答案 3 :(得分:2)

我将简化它,

  • 导入和导出是ES6功能(下一代JS)。
  • Require是从其他文件导入代码的传统方法

主要需求不同,整个JS文件被调用或导入。即使您不需要其中的一部分。

var myObject = require('./otherFile.js'); //This JS file will be imported fully.

在导入时,您只能提取所需的对象/函数/变量。

import { getDate }from './utils.js'; 
//Here I am only pulling getDate method from the file instead of importing full file

另一个主要区别是您可以在程序中的任何地方使用require,因为import应该始终位于文件顶部

答案 4 :(得分:1)

新版ES6:

'import'应该与'export'关键字一起使用,以在js文件之间共享变量/数组/对象:

export default myObject;

//....in another file

import myObject from './otherFile.js';

老套子:

'require'应该与'module.exports'一起使用

 module.exports = myObject;

//....in another file

var myObject = require('./otherFile.js');

答案 5 :(得分:0)

这里没有答案,更像是评论,对不起,但我无法评论。

在节点V10中,可以使用标志SELECT sensor_1 FROM sensor_table WHERE timestamp >= UNIX_TIMESTAMP($date_start) AND timestamp < UNIX_TIMESTAMP($date_stop) AND ((timestamp - UNIX_TIMESTAMP($date_start)) % 600) BETWEEN 0 AND 4 ORDER BY timestamp; 来告诉Nodejs您要使用--experimental-modules。但是您的输入脚本应以import结尾。

请注意,这仍然是实验性的事情,不应用于生产。

.mjs
// main.mjs
import utils from './utils.js'
utils.print();

Ref 1 - Nodejs Doc

Ref 2 - github issue

答案 6 :(得分:0)

import用于typescript(角度)。 在ES6(ExpressJs)中使用了require