我刚刚开始研究一个小节点项目,它将与MongoDB接口。然而,我似乎不能正确地导入相关的节点模块,即使我已经通过npm正确地安装了它们。
例如,下面的代码抛出一个错误,告诉我“express没有默认导出”:
import express from "express";
然而,这段代码可以工作:
const express = require("express");
我的问题是,import和variable/require方法的功能有什么不同?我想修复在项目中困扰我的导入的任何问题,因为它似乎可能会导致后续的其他问题。
我说得简单点,
导入和导出是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');
我说得简单点,
导入和导出是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');
import来自ES6是对旧CommonJs模块的更新,其中require来自CommonJs模块。接下来,我将区分语法差异但现在,让我们理解他们为什么更新这个。
require是在运行时执行的函数,这意味着它的行为和其他JavaScript函数一样,如果你在脚本中间定义它,脚本的上述部分不会识别它,或者如果你把它放在if语句中,它只会在if表达式为真时执行,或者如果你把它放在另一个函数中,它只会在函数执行时执行,等等。
另一方面,import在静态级别上执行,它有一些规则,它应该总是在根级别上,不应该在任何条件语句或函数中。由于JavaScript对导入进行静态分析,如果您这样做,它将抛出编译时错误。
这些优点是由于团队改变了导入包到ES6的方式。
当ES6更好的时候,node为什么还在使用CommonJs模块?
节点中有大量使用CommonJs模块的代码库,由于对ES6的多年支持,因此很难将其转换为ES6。但是有很多工具可以让我们在node中编写ES6代码,但是这些工具会把它转译成CommonJs。
语法差异:
Import完全取决于从包装中导出东西的方式。
如果在导出函数或变量时使用默认的导出方式。等模块。export = commondj中的functionName或在ES6中导出默认的functionName,然后导入将如下所示。
在CommonJs vs ES6中导入
const functionName = require("package/exampleFile"); // CommonJs
import functionName from "package/expampleFile.js"; // ES6.
// here you can see that we need to add .js at the end of the file
如果像module一样导出多个函数。在CommonJs中exports = {functionName1, functionName2}或在ES6中export functionName1 export functionName2,那么导入将如下所示。
const {functionName1, functionName2} = require("package/exampleFile"); // CommonJs
import {functionName1, functionName2} from "package/expampleFile.js"; // ES6.