当前位置: 首页 > 知识库问答 >
问题:

module.exports与node.js和ES6中的导出默认值

越朗
2023-03-14

Node的 和ES6的 有什么区别?我试图弄清楚为什么在Node.js6.2.2中尝试 时会出现“__is not a constructor”错误。

'use strict'
class SlimShady {
  constructor(options) {
    this._options = options
  }

  sayName() {
    return 'My name is Slim Shady.'
  }
}

// This works
module.exports = SlimShady
'use strict'
class SlimShady {
  constructor(options) {
    this._options = options
  }

  sayName() {
    return 'My name is Slim Shady.'
  }
}

// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady

共有3个答案

黄俊雄
2023-03-14

您需要在项目中正确配置babel,以使用export default和export const foo

npm install --save-dev @babel/plugin-proposal-export-default-from

然后在。babelrc中添加以下配置

"plugins": [ 
       "@babel/plugin-proposal-export-default-from"
      ]
关学
2023-03-14

Felix Kling对这两者做了一个很好的比较,对于那些想知道如何在nodejs中使用module.exports与命名exports一起执行导出默认值的人来说

module.exports = new DAO()
module.exports.initDAO = initDAO // append other functions as named export

// now you have
let DAO = require('_/helpers/DAO');
// DAO by default is exported class or function
DAO.initDAO()
东郭赞
2023-03-14

问题在于

在编写本文时,还没有任何环境支持ES6模块。在Node.js中使用它们时,需要使用Babel之类的方法将模块转换为CommonJS。但这到底是怎么发生的呢?

许多人认为 相当于 ,而 相当于 。但这并不完全正确,或者至少巴别塔不是这么做的。

ES6 exports实际上也被命名为exports,只不过 是一个“保留”名称,并且对它有特殊的语法支持。让我们来看看Babel是如何编译命名导出和默认导出的:

// input
export const foo = 42;
export default 21;

// output
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = exports.foo = 42;
exports.default = 21; 

这里我们可以看到,默认导出成为 对象上的属性,就像 一样。

我们可以通过两种方式导入模块:使用CommonJS或使用ES6 语法。

你的问题:我相信你正在做如下的事情:

var bar = require('./input');
new bar();

期望 被分配默认导出的值。但是正如我们在上面的示例中看到的,默认导出被分配给 属性!

null

var bar = require('./input').default;

null

import bar from './input';
console.log(bar);

巴别塔会把它变成

'use strict';

var _input = require('./input');

var _input2 = _interopRequireDefault(_input);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

console.log(_input2.default);

您可以看到,对 的每次访问都转换为访问

 类似资料:
  • 问题内容: Node 和ES6 之间有什么区别?我试图弄清楚为什么在Node.js 6.2.2中尝试出现“ __不是构造函数”错误。 什么有效 什么 不 工作 问题答案: 问题是 如何在CommonJS中模拟ES6模块 您如何导入模块 ES6到CommonJS 在撰写本文时,没有环境本地支持ES6模块。在Node.js中使用它们时,您需要使用Babel之类的东西将模块转换为CommonJS。但是那

  • 问题内容: 我在Node.js模块中找到了以下合同: 我不知道什么之间的不同和为什么都被用在这里。 问题答案: 设置允许在时像函数一样调用函数。简单地设置将不允许导出函数,因为节点导出了对象引用。以下代码不允许用户调用该函数。 module.js 以下内容无效。 如果设置以下内容,则将起作用。 安慰 基本上, node.js 不会导出当前引用的对象,而是导出最初引用的对象的属性。尽管 Node.j

  • 问题内容: 在我正在合作的项目中,关于可以使用哪种模块系统,我们有两个选择: 导入使用的模块,并使用导出和。 使用ES6导入模块,并使用ES6导出 相互使用是否对性能有好处?如果要在Node模块上使用ES6模块,还有其他什么应该知道的吗? 问题答案: 相互使用是否对性能有好处? 请记住,还没有JavaScript引擎本身支持ES6模块。您说自己正在使用Babel。无论如何,Babel都会默认将其转

  • 该组件在以下情况下工作: 如果我删除最后一行,它将不起作用。 我想,我不明白es6语法中的一些东西。不是必须导出不带标志的“默认”吗?

  • 问题内容: 如果要创建组件,似乎可以用很多不同的方式创建类。这些有什么区别?我怎么知道要使用哪个? 我只是假设他们做不同的事情,还是只是语法不同? 如果有人可以给我快速的解释或链接,我将不胜感激。我不想从一个新的框架开始,不知道到底有什么区别。 问题答案: 嗨,欢迎来到React! 我认为您在这里遇到的问题并不是与React特定的,而是与新的ES2015模块语法有关。在创建React类组件时,出于