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

Node.js和ES6中的module.exports与导出默认值,node.js,module,ecmascript-6,Node.js,Module,Ecmascript 6,节点的模块导出与ES6的导出默认之间有什么区别?我试图弄清楚,当我尝试在Node.js 6.2.2中导出默认值时,为什么会出现“\uuuuuu不是构造函数”错误 什么有效 什么不起作用 问题在于 如何在CommonJS中模拟ES6模块 如何导入模块 ES6至CommonJS 在撰写本文时,没有任何环境本机支持ES6模块。在Node.js中使用它们时,需要使用类似Babel的东西将模块转换为CommonJS。但这究竟是怎么发生的呢 许多人认为模块。导出=……/代码>等价于代码>导出默认值…<

节点的
模块导出
与ES6的
导出默认
之间有什么区别?我试图弄清楚,当我尝试在Node.js 6.2.2中导出默认值时,为什么会出现“\uuuuuu不是构造函数”错误

什么有效 什么不起作用 问题在于

  • 如何在CommonJS中模拟ES6模块
  • 如何导入模块
ES6至CommonJS 在撰写本文时,没有任何环境本机支持ES6模块。在Node.js中使用它们时,需要使用类似Babel的东西将模块转换为CommonJS。但这究竟是怎么发生的呢

许多人认为<代码>模块。导出=……/代码>等价于代码>导出默认值…< /COD>和<代码> ExpS.Fo…< /代码>,等效于<代码>导出confoo=…< /代码>。但这并不完全正确,至少巴贝尔不是这样做的

ES6
default
exports实际上也被命名为exports,只是
default
是一个“保留”名称,并且有特殊的语法支持。让我们看看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; 
在这里,我们可以看到默认导出成为
exports
对象上的一个属性,就像
foo
一样

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

你的问题:我相信你在做类似的事情:

var bar = require('./input');
new bar();
应为
指定默认导出的值。但正如我们在上面的示例中所看到的,默认导出被分配给
default
属性

因此,为了访问默认导出,我们实际上必须

var bar = require('./input').default;
如果我们使用ES6模块语法,即

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);

您可以看到,对
条的每次访问都转换为访问
。默认值

您需要在项目中正确配置babel以使用导出默认值和导出常量foo

npm install --save-dev @babel/plugin-proposal-export-default-from
然后将下面的配置添加到.lrc中

"plugins": [ 
       "@babel/plugin-proposal-export-default-from"
      ]

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

module.exports=new DAO()
module.exports.initDAO=initDAO//将其他函数附加为命名导出
//现在你有了
让DAO=require(“”/helpers/DAO');
//默认情况下,DAO是导出的类或函数
DAO.initDAO()

@Bergi:我没有搜索tbh(我很惭愧:()。关于同一个问题肯定有问题,但问的方式不同。如果你找到合适的东西,请告诉我!好的,找到这些东西花了一些时间,但你现在可以使用你新获得的异能,选择其中一个作为复制目标:-)我现在能做到这一点是多么讽刺:D@djKianoosh: . 在分配给
模块.exports
之后,
导出
模块.exports
具有不同的值,因此分配给
导出.defaults
没有效果(因为导出的是
模块.exports
)。换句话说,这与您只执行了
module.exports={…}
完全相同。我们如何导出默认值和命名值,以便这两个值都在客户端代码端工作:
ES6
->
导入库,{a,b,c}来自“库”
commonJS
->
const library=require(“库”);const{a,b,c}=require(“库”)
?就像使用
React
一样,在使用ES6时,我们可以从“React”执行
import React、{useffect,useState}const React=require(“React”);const{useffect,useState}=require(“react”)。。。我们如何在编写自己的库时实现同样的效果?非常感谢。我相信这个插件只支持语法
export someName from./someModules.js'
npm install --save-dev @babel/plugin-proposal-export-default-from
"plugins": [ 
       "@babel/plugin-proposal-export-default-from"
      ]