Answers:
这个简单的图表,可以帮助我理解之间的差异require
和import
。
除此之外,
您不能选择性地仅加载所需的零件,require
而使用imports
,则可以仅选择性地加载所需的零件。这样可以节省内存。
另一方面,加载是同步的(分步进行),require
因为它import
可以是异步的(无需等待先前的导入),因此执行 起来会比更好require
。
module.exports
在模块初始化代码完成运行时看到分配的内容。在试图使单个模块对ESM和CommonJS都起作用时,仅此差异就造成了兼容性方面的麻烦。
require
和之间的主要区别import
是,require
它将自动扫描node_modules
以查找模块,但是import
来自ES6的则不会。
大多数人使用巴贝尔来编译import
和export
,这使得import
行为一样require
。
Node.js的未来版本可能会import
自我支持(实际上,实验版本已经支持),根据Node.js的注释判断,它import
不支持node_modules
,它基于ES6,并且必须指定模块的路径。
因此,我建议您不要import
与babel一起使用,但是此功能尚未得到证实,node_modules
将来可能会支持,谁知道呢?
作为参考,下面是babel如何将ES6的import
语法转换为CommonJS的require
语法的示例。
假设文件app_es6.js
包含此导入:
import format from 'date-fns/format';
这是从节点程序包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);
对于大多数人来说,该文件大多数都是鬼话,但计算机可以理解。
另外,作为参考,作为如何创建模块并将其导入到项目中的示例,如果安装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
通天塔将进口转换为:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
并相应地处理对该函数的所有引用。
require
了更改
import won't support node_modules
那是什么意思
让我举一个包含require&import的Express模块示例
-要求
var express = require('express');
-进口
import * as express from 'express';
因此,在使用上述任何语句之后,我们将获得一个名为“ express”的变量。现在我们可以将“ app”变量定义为
var app = express();
因此,我们将'require'与'CommonJS'结合使用,并将'import'与'ES6'结合使用。
有关“要求”和“导入”的更多信息,请阅读以下链接。
import- Node.js中的ES6模块更新
在这里没有答案,更像是评论,对不起,但我无法评论。
在节点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')}
}
express
将是typeany
。您可以在此处包含定义npmjs.com/package/@types/express