node.js - ES6 和 CommonJS 导出约定的缺点

标签 node.js import ecmascript-6 export commonjs

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

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
  }
  ...
}

最佳答案

Lets look at what Babel does when you do import foo from 'bar'; :

'use strict';

var _bar = require('bar');

var _bar2 = _interopRequireDefault(_bar);

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

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

这意味着,为了使您的模块可以导入为

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

你所要做的就是

module.exports = Struct;

关于node.js - ES6 和 CommonJS 导出约定的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310911/

相关文章:

node.js - 在项目数组上使用 Sequelize 创建/更新

node.js - 在http中发送和接收一个大的json对象

python - 带有自动递增主键的mysql LOAD DATA INFILE

javascript - 回调/Promise 嵌套循环,2 个 API 调用

javascript - 从 MySQL/JSON 数据创建 JSON 层次树

javascript - 如何正确使用 ES6 "export default"和 CommonJS "require"?

node.js - React Node API 请求设计模式

json - 尝试使用 crypto-js 和 nodejs 解密

python - pickle 无法导入已存在的模块?

java:找出丢失符号的原始包