首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Node.js需求与ES6导入/导出

使用Node.js需求与ES6导入/导出
EN

Stack Overflow用户
提问于 2015-07-11 07:19:47
回答 11查看 773.6K关注 0票数 1.3K

在我正在合作的一个项目中,我们有两个选择可以使用哪个模块系统:

  1. 使用require导入模块,使用module.exportsexports.foo导出模块。
  2. 使用ES6 import导入模块,使用ES6 export导出模块

使用一个比另一个有什么性能上的好处吗?如果我们要使用ES6模块而不是Node,我们还需要知道其他什么吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2015-07-12 12:38:45

更新

由于Node v12 (2019年4月),对ES模块的支持在默认情况下是启用的,而且由于Node v15 (2020年10月)是稳定的(参见这里)。包括节点模块的文件必须以.mjs结尾,或者最近的package.json文件必须包含"type": "module"节点文档有更多的信息,也有关于CommonJS和ES模块之间互操作的信息。

性能方面,总是有机会更新的功能没有现有的功能那么好的优化。但是,由于模块文件只评估一次,所以性能方面可能会被忽略。最后,您必须运行基准,以得到一个明确的答案无论如何。

ES模块可以通过import()函数动态加载。与require不同的是,这将返回一个承诺。

先前的回答

使用一个比另一个有什么性能上的好处吗?

请记住,目前还没有JavaScript引擎支持ES6模块。你自己说你在利用巴贝尔。默认情况下,Babel将importexport声明转换为CommonJS (require/module.exports)。因此,即使您使用ES6模块语法,如果您在Node中运行代码,也将在幕后使用CommonJS。

CommonJS和ES6模块之间存在技术差异,例如CommonJS允许您动态加载模块。ES6不允许这样做,但是有一个API正在开发中。

由于ES6模块是标准的一部分,我将使用它们。

票数 937
EN

Stack Overflow用户

发布于 2015-07-11 08:49:38

您可能需要考虑以下几种用法/功能:

要求:

  • 如果加载的模块名称不是预定义的/static,或者只有在“真正需要”的情况下才有条件加载模块(取决于特定的代码流),则可以进行动态加载。
  • 加载是同步的。这意味着,如果您有多个require,则会一个接一个地加载和处理它们。

ES6进口:

  • 您可以使用命名导入来选择性地加载所需的部分。这样可以节省记忆。
  • 导入可以是异步的(在当前的ES6模块加载器中,它实际上是异步的),并且可以执行得稍微好一点。

另外,需求模块系统也不是基于标准的。既然存在ES6模块,就不太可能成为标准模块了。将来,在各种实现中都会有对ES6模块的本地支持,这将有利于性能的提高。

票数 225
EN

Stack Overflow用户

发布于 2020-02-21 03:41:11

到目前为止,ES6导入,导出是总是编译成CommonJS,所以没有使用任何一个或另一个的好处。尽管建议使用ES6,因为当浏览器发布本机支持时,它应该是有利的。原因是,您可以从一个文件导入部分,而在使用CommonJS时,您必须需要所有的文件。

ES6→import, export default, export

CommonJS→require, module.exports, exports.foo

下面是这些的常用用法。

ES6出口违约

代码语言:javascript
复制
// hello.js
function hello() {
  return 'hello'
}
export default hello

// app.js
import hello from './hello'
hello() // returns hello

ES6导出倍数和导入倍数

代码语言:javascript
复制
// hello.js
function hello1() {
  return 'hello1'
}
function hello2() {
  return 'hello2'
}
export { hello1, hello2 }

// app.js
import { hello1, hello2 } from './hello'
hello1()  // returns hello1
hello2()  // returns hello2

CommonJS module.exports

代码语言:javascript
复制
// hello.js
function hello() {
  return 'hello'
}
module.exports = hello

// app.js
const hello = require('./hello')
hello()   // returns hello

CommonJS module.exports倍数

代码语言:javascript
复制
// hello.js
function hello1() {
  return 'hello1'
}
function hello2() {
  return 'hello2'
}
module.exports = {
  hello1,
  hello2
}

// app.js
const hello = require('./hello')
hello.hello1()   // returns hello1
hello.hello2()   // returns hello2
票数 119
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31354559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档