我刚刚开始研究一个小节点项目,它将与MongoDB接口。然而,我似乎不能正确地导入相关的节点模块,即使我已经通过npm正确地安装了它们。
例如,下面的代码抛出一个错误,告诉我“express没有默认导出”:
import express from "express";
然而,这段代码可以工作:
const express = require("express");
我的问题是,import和variable/require方法的功能有什么不同?我想修复在项目中困扰我的导入的任何问题,因为它似乎可能会导致后续的其他问题。
让我举一个用require & import包含express模块的例子
需要
var express = require('express');
进口
import * as express from 'express';
因此,在使用上述任何语句后,我们将拥有一个名为“express”的变量。现在我们可以将app变量定义为,
var app = express();
所以我们在'CommonJS'中使用'require',在'ES6'中使用'import'。
有关'require'和'import'的更多信息,请阅读下面的链接。
require -在Node.js中需要模块:你需要知道的一切
import - ES6模块在Node.js中的更新
这些工具属于不同的时代。
require只存在于CommonJS中(创建Node.js用于导入和导出应用程序中的模块的方式),import是ES6,即浏览器JavaScript和服务器JavaScript (Node.js)都可以使用的新工具。
除了历史上的差异之外,在使用上也有差异,其中import比所需的更灵活、更现代和更强大。
然而,重要的是要考虑到一些浏览器仍然不支持ES6,因此在使用它之前可能有必要进行编译。
Require使用模块。Exports,这是导出模块的“旧”(但仍然有效)语法,它可以是我们想要的任何东西,一个对象,一个字符串等。
导入两者都使用,即可以使用模块。导出和导出,它允许你像模块一样导出不同的代码段。出口了。进口的好处之一是,它只能进口出口的一部分:
例子:
导出文件:
// A.js file
// CommonJS syntax
module.exports = {
foo: function(){ return 'bar';},
baz: 123
}
// ES6 syntax
export function foo(){ return 'bar';}
export const baz = 123;
// or
function foo(){ return 'bar';}
const baz = 123;
export default {foo, baz};
导入文件:
// B.js file
// CommonJS syntax
const A = require('./A.js');
const foo = A.foo;
const baz = A.baz;
// ES6 syntax
import * as A from './A.js';
const foo = A.foo;
const baz = A.baz;
// or only
import {foo, baz} from './A.js';
当您使用导出默认值(ES6语法)时,这意味着每个文件只能导出一个东西。如果它是一个对象,import只能导入片段。但如果它是一个函数,那么你可以使用import foo from './A.js';不需要{}或*作为foo。
来源:https://pt.stackoverflow.com/a/213938/317251
我说得简单点,
导入和导出是ES6的特性(下一代JS)。
Require是从其他文件导入代码的老式方法
主要的区别在于require,整个JS文件被调用或包含。即使你根本不需要。
var myObject = require('./otherFile.js'); //This JS file will be included fully.
而在导入中,你只能提取所需的对象/函数/变量。
import { getDate }from './utils.js';
//Here I am only pulling getDate method from the file instead of importing full file
另一个主要区别是你可以在程序的任何地方使用require,而as import应该总是在文件的顶部
编辑:在最新的节点版本中,您可以使用解构。就像这样
const { getDate } = require('./date.js');