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模块。 坚持一个。