ES6和CommonJS导出约定的缺点

Pat*_*rts 1 import export commonjs node.js ecmascript-6

对于由定义mainnpm模块文件package.json,我正在考虑以下模式:

import Struct from './src/struct'

module.exports = Struct
module.exports.default = Struct
Run Code Online (Sandbox Code Playgroud)

为了支持CommonJS和ES6导入:

const Struct = require('my-module')
// or
import Struct from 'my-module'
Run Code Online (Sandbox Code Playgroud)

该公约是否有任何可能导致意外问题的弊端?

我要解决的问题是必须迫使软件包的使用者坚持使用ES6或CommonJS,因为这两种方法似乎都不太好用:

const Struct = require('my-module').default
// or
import * as Struct from 'my-module'
Run Code Online (Sandbox Code Playgroud)

在进一步考虑这一点之后,这样定义我的课程/src/struct.js会更好吗?

export default class Struct {
  static get default () {
    return Struct
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

让我们看看Babel在您做什么时会做什么import foo from 'bar';

'use strict';

var _bar = require('bar');

var _bar2 = _interopRequireDefault(_bar);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Run Code Online (Sandbox Code Playgroud)

您会看到,根据导入模块的“类型”,Babel要么导入default导出,要么导入module.exports(因为require('bar')return module.exports

这就是说,为了使您的模块可以导入为

const Struct = require('my-module')
// and
import Struct from 'my-module'
Run Code Online (Sandbox Code Playgroud)

您要做的就是

module.exports = Struct;
Run Code Online (Sandbox Code Playgroud)