为什么Node使用require而不是import?

18

我正在学习node.js,想知道为什么它使用require语法而不是React使用的import语法。

例如:

const Validator = require("validator");

import Validator from "validator";

我认为import是es6语法,但我不认为这解释了为什么在node中没有被使用。


1
“我不认为这解释了为什么它在Node中没有被使用” - 当然解释了:Node.js比ES6早得多。 - Bergi
看一下commonjs模块的历史 - 讨论始于2010年,比ES6早五年。 - Bergi
1
因为我经常看到箭头函数和其他es6特性在node中使用,所以我认为import应该是一样的,在chrome和V8中也可用。但是我明白为什么它不被支持,从@axm__在他的回答中分享的链接中可以看出。 - Holly
4个回答

9

importdefault是较新的ES6特性,Node尚未使用。但Node已经作为实验实现了这些新特性:只需使用--experimental-modules标志并仅适用于保存有.mjs扩展名的文件。

babel这样的转换器使得编写现代、规范批准和/或实验性ECMAScript成为可能。在像Webpack这样的打包工具生态系统中,借助babel这样的转换器,编写易于维护、具有未来性的JavaScript变得容易,同时代码仍然受到广泛支持,因为它被转换为commonjs(可以通过require(旧式的import)和module.exports(旧式的export)进行识别)。


请注意,Bable和Typescript的import系统实现未经过规范批准。具体而言,规范要求导入模块的文件名与您传递给import语句的字符串匹配。.mjs类型的整个问题是由于无法使ES6模块系统与Commonjs(node的模块系统)兼容所致。 - slebetman

1

1

我认为import是ES6的一部分,但我不认为这解释了为什么它在Node中没有被使用。

就像NodeJS实现他们整个库的方式,其中有大量支持基于回调的异步函数。这样想,你会意识到,早晚,NodeJS框架肯定会支持import语法,并升级所有这些异步函数以支持基于Promise的方法。


0
在Node.js中,使用require来加载模块,而在ECMAScript模块(ESM模块)中使用import来静态或动态地加载其他模块。 requireimport的主要区别在于,require会自动扫描node_modules以查找模块,但import不会,它来自ES6
大多数人使用Babel来编译importexport,这使得import的行为与require相同。
  1. require更多是动态分析,而import更多是静态分析。
  2. require在运行时抛出错误,而import在解析时抛出错误。
  3. require是非词法的,而import是词法的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接