代码之家  ›  专栏  ›  技术社区  ›  Qiulang

Babel如何让我使用任何名称来导入导出函数的节点模块

  •  0
  • Qiulang  · 技术社区  · 8 年前

    举个例子可以让我的问题更清楚,比如说我想导入 debug module 到我的Vuejs代码

    调试模块导出 createDebug 像这样的功能,

    module.exports = require('./browser.js');
    ...
    exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
    
    function createDebug(namespace) { ... }
    

    当我使用 import 要导入调试模块,我可以给它任何名称,比如

    import debug from 'debug' // or any name I want, e.g
    import debugjs from 'debug'
    

    我明白如果 export default 匿名函数,然后我可以用我想要的任何名称导入它,但这里不是这样。

    为什么我可以用任何名称导入它?

    -----------更新-----------

    答案的一个要点是 import "any name" 为…工作 both 默认导出匿名函数和命名函数。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Felix Kling    8 年前

    但情况并非如此。

    有点像。您正在尝试导入没有ES6导出的模块。您正在尝试导入CommonJS模块。所以巴贝尔必须决定如何处理这个案子。

    从CommonJS模块导出某些内容有两种常见方法:

    • 将属性分配给 exports (或 module.expoets )例如 exports.answer = 42;
    • 覆盖的值 module.exports ,例如 module.exports = 42; .

    在第二种情况下,您最终只能从模块中导出一个值。这基本上就是默认导出的内容(因为只能有一个),这就是您在代码中所做的。

    换句话说,当通过ES6导入CommonJS模块时 import 语句,然后是 导出模块 用作默认导出值。

    我们可以通过查看 how Babel converts the code 以下内容:

    // import foo from 'bar'; becomes
    var _bar = require('bar');
    
    var _bar2 = _interopRequireDefault(_bar);
    
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : { default: obj };
      //                                   ^^^^^^^^^^^^^^^^
    }