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