ES6和CommonJS出口惯例的缺点

对于由package.json定义的npm模块的main文件,我正在考虑一个这样的模式:

 import Struct from './src/struct' module.exports = Struct module.exports.default = Struct 

为了支持CommonJS和ES6导入:

 const Struct = require('my-module') // or import Struct from 'my-module' 

这个公约有什么缺点可能导致意想不到的问题吗?

我试图解决的问题是不得不迫使这个软件包的用户坚持ES6或CommonJS,因为这两者看起来相当令人讨厌:

 const Struct = require('my-module').default // or import * as Struct from 'my-module' 

进一步考虑这个之后,会在/src/struct.js定义我的类是否更好?

 export default class Struct { static get default () { return Struct } ... } 

让我们来看看巴贝尔import foo from 'bar';时候所做的事情import foo from 'bar';

 'use strict'; var _bar = require('bar'); var _bar2 = _interopRequireDefault(_bar); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 

您可以看到,根据导入模块的“types”,Babel将导入default导出,或者导入module.exports (因为require('bar')返回module.exports

这意味着,为了让你的模块是可导入的

 const Struct = require('my-module') // and import Struct from 'my-module' 

所有你需要做的是

 module.exports = Struct; 

使它为一个包工作打破一致性,可以造成混乱:

 import Struct from 'my-module'; // works import Foo from 'another-module'; // fails 

default导出通常在NPM包中被丢弃(除非它们是从ES6构build的),因为

 const Struct = require('my-module').default; 

 const { default: Struct } = require('my-module'); 

麻烦,难以阅读。 而

 import * as Struct from 'my-module'; 

相当于

 const Struct = require('my-module'); 

在巴别塔6,这是一般应该由用户完成的方式。 如果他们对CommonJSimport品还没有这种习惯,那么他们可能不得不购买它。

那么,由于nodejs仍然没有对ES6模块的原生支持,现在它实际上只是代码可读性的问题。 但IMO不需要同时支持CommonJS和ES6模块。 坚持一个。