JavaScript 的 import 和 require 的区别?
我最近编写了一个脚本,用于从第三方 API 请求数据,并且我是在 Sapper 项目的服务器上运行这个脚本的。为了正确获取这些数据,我使用了 Promise 链,并且需要在脚本中使用 '.mjs' 扩展名。
自 Node v12 起,ES 模块已默认启用。因此,我使用 '.mjs' 文件来运行包含 Node 模块的文件。
另一种解决此问题的方法是使用 Node.js 的 import 语句,需要将 package.json 文件中的 'type' 设置为 'module'。然而,由于这种格式不受支持(rollup 文件输出的格式为 commonjs),因此使用这种方法导致我的 Sapper 服务器崩溃。详情请参见(此 GitHub issue)。
CommonJS 使用 require 和 module.exports,而 ES6 使用 import 和 export。import 和 export 用于引用 ES 模块,不能用于其他文件类型。
我进一步了解了一下,发现了一些不同之处。
- import 语句总是会在文件开头执行,而 require 语句则可以在任何时间、任何位置调用。
- 导入的文件会被排序到文件顶部。
- 导入功能可用于选择性地加载所需部分,并可节省内存。
- import 语句可以是异步的,这显然性能更好,而 require 语句是同步的。
还有其他我遗漏的吗?
简而言之:ES6 -> import、export default、export vs CommonJS -> require、module.exports、export.foo