“require(x)”和import x之间的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“require(x)”和import x之间的区别相关的知识,希望对你有一定的参考价值。
我刚刚开始研究一个与MongoDB交互的小节点项目。但是,我似乎无法正确导入相关的节点模块,即使我已通过npm
正确安装它们。
例如,以下代码抛出并出错,告诉我“express没有默认导出”:
import express from "express";
但是,此代码有效:
const express = require("express");
所以我的问题是,import和variable / require方法的功能有何不同?我想解决困扰我项目进口的任何问题,因为这似乎可能会导致其他问题。
帮助我理解require
和import
之间差异的答案是Using Node.js require vs. ES6 import/export,其中包括一个简单的图表:
require
和import
之间的主要区别在于,require
将自动扫描node_modules
以找到模块,但来自ES6的import
不会。
大多数人使用babel来编译import
和export
,这使得import
与require
的行为相同。
Node.js的未来版本可能支持import
本身(实际上是the experimental version already does),并且根据Node.js的说明判断,import
将不支持node_modules
,它基于ES6,并且必须指定模块的路径。
所以我建议你不要使用import
和babel,但这个功能尚未确认,它可能会支持node_modules
,谁会知道?
作为参考,下面是babel如何将ES6的import
语法转换为CommonJS的require
语法的示例。
说文件app_es6.js
包含这个重要的:
import format from 'date-fns/format';
相关的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"
}
}
]
]
}
build-server-file
文件中定义的package.json
脚本是babel解析app_es6.js
文件并输出文件app.js
的指令。
运行build-server-file
脚本后,如果打开app.js
并查找date-fns
导入,您将看到它已转换为:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
对于大多数人来说,大多数文件都是gobbledygook,但计算机可以理解它。
另外作为参考,作为如何创建模块并将其导入项目的示例,如果您安装date-fns
然后打开node_modules/date-fns/get_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
而babel会将进口转换为:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
并相应地处理对函数的所有引用。
让我举一个包括带有require和import的express模块的例子
-要求
var express = require('express');
-进口
import * as express from 'express';
所以在使用上述任何一个语句后,我们将有一个名为'express'的变量。现在我们可以将'app'变量定义为,
var app = express();
因此我们将'require'与'CommonJS'一起使用,'import'与'ES6'一起使用。
有关'require'和'import'的更多信息,请阅读以下链接。
要求 - Requiring modules in Node.js: Everything you need to know
进口 - An Update on ES6 Modules in Node.js
这里不是答案,更像是评论,抱歉,但我无法发表评论。
在节点V10中,您可以使用标志--experimental-modules
告诉Nodejs您要使用import
。但是您的输入脚本应以.mjs
结尾。
请注意,这仍然是一个实验性的东西,不应该用于生产。
// main.mjs
import utils from './utils.js'
utils.print();
// utils.js
module.exports={
print:function(){console.log('print called')}
}
import用于打字稿(angular)。在ES6中使用require(ExpressJs)
以上是关于“require(x)”和import x之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
为 ES6 "import x" 而不是 express 中的 "require(x)" 准备环境的简单方法