es6-module默认导出导入为未定义

fly*_*123 6 javascript bigcommerce jspm es6-module-loader

我不确定我在这里缺少什么。我正在使用jspm和es6-module-loader进行项目。我有一个定义如下的模块:

import hooks from './hooks';
import api from './api';
import tools from './tools';

const StencilUtils = {
    hooks: hooks,
    api: api,
    tools: tools,
};

export {hooks, api, tools};
export default StencilUtils;

/* global define */
(function(root) {
    if (typeof define === 'function' && define.amd) {
        define(function() {
            return (root.stencilUtils = StencilUtils);
        });
    } else if (typeof module === 'object' && module.exports) {
        module.exports = StencilUtils;
    } else {
        window.stencilUtils = StencilUtils;
    }
}(this));
Run Code Online (Sandbox Code Playgroud)

我将此模块导入另一个文件,并像这样使用它:

import utils from 'bigcommerce/stencil-utils';

utils.hooks.on('cart-item-add', (event, form) => {
    // do stuff
});
Run Code Online (Sandbox Code Playgroud)

当文件加载,我得到一个错误,那utils就是undefined。如果我将文件更改为此:

import {hooks} from 'bigcommerce/stencil-utils';

hooks.on('cart-item-add', (event, form) => {
    // do stuff
});
Run Code Online (Sandbox Code Playgroud)

它可以正常工作。因此,似乎默认导出语句无法正常工作。这里的import或export语句是否存在明显错误,这会导致此问题?

Yas*_*arg 7

我认为有关此问题有两件事:

  1. 命名导出后,您可以通过将其导入为库或破坏对象来访问它们。

方法1

xyz.js

export const a = 1;
Run Code Online (Sandbox Code Playgroud)

abc.js

import {a} from "xyz";
Run Code Online (Sandbox Code Playgroud)

方法2

xyz.js

export const a = 1;
Run Code Online (Sandbox Code Playgroud)

abc.js

import {* as myModule} from "xyz";
console.log(myModule.a);
Run Code Online (Sandbox Code Playgroud)

所以你的情况

export {hooks, api, tools};
Run Code Online (Sandbox Code Playgroud)

可以是

import * as utils from 'bigcommerce/stencil-utils';
Run Code Online (Sandbox Code Playgroud)

要么

import {hooks} from 'bigcommerce/stencil-utils';
Run Code Online (Sandbox Code Playgroud)
  1. 默认导出声明不正确

可以是

export default {
    hooks: hooks,
    api: api,
    tools: tools,
};
Run Code Online (Sandbox Code Playgroud)

要么

const StencilUtils = {
   hooks: hooks,
   api: api,
   tools: tools,
};
export { StencilUtils as default };
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你。欲了解更多详情,请参阅

  • 我认为这是不对的。根据文档(我认为),我显示的默认导出语法很好,我尝试了您的第一个默认导出示例,但仍无法解决问题。 (2认同)