【问题标题】:es2015 re-export module and override single export function of the re-exported modulees2015重新导出模块并覆盖重新导出模块的单个导出功能
【发布时间】:2016-04-17 03:41:09
【问题描述】:

我想重新导出整个模块并仅覆盖重新导出模块的特定功能。但是,当已重新导出相同的函数时,似乎不会处理导出覆盖函数。

(http://www.ecma-international.org/ecma-262/6.0/#sec-module-semantics-static-semantics-early-errors, '如果 ModuleItemList 的 ExportedNames 包含任何重复条目,则为语法错误。')

如果我只想覆盖重新导出的模块中的特定函数或方法,我的方法背后的动机是尽量减少显式重新导出非常大或长的模块。

有没有办法在 es6/es2015 中实现我的方法?

到目前为止我的代码:

模块-a.js

export class MyFirstStandardClass {
  sendMeMessages() {
  return `hello, I'm a standard implementation`;
  }
}
export function talkToMe() {
  return `standard talking: how are you doing?`;
}

模块-b.js

import * as StandardModule from 'module-a';

export function talkToMe(condition = true) {
  if (condition) {
    return `project conditional talking: ${StandardModule.talkToMe()}`;
  }
  return `project without a condition!`;
}

export * from 'module-a';

模块-c.js

import * as MyModule from 'module-b';
import React, { Component } from 'react';

export default class App extends Component {

  componentWillMount() {
    console.log(MyModule);
    this.myFirstStandardInstance = new MyModule.MyFirstStandardClass();
  }

  render() {
    return (
      <div>
        <label>
          Class
        </label>
        <div>
          { this.myFirstStandardInstance.sendMeMessages() }
        </div>
        <label>
          Function
        </label>
        <div>
          { MyModule.talkToMe(true) } // returns 'standard talking: how are you doing?'; expected 'project conditional talking: standard talking: how are you doing?' 
        </div>
      </div>
    );
  }
}

【问题讨论】:

    标签: javascript import reactjs export ecmascript-6


    【解决方案1】:

    看来我的第一个解决方案应该可行。根据 ECMAScript 规范,本地导出应具有优先权。 (http://www.ecma-international.org/ecma-262/6.0/#sec-getexportednames)

    这是 Babel 转译器中的一个问题。更多信息:https://github.com/systemjs/systemjs/issues/1031#issuecomment-171262430

    Babel 中的问题:https://phabricator.babeljs.io/T6967

    【讨论】:

      【解决方案2】:

      您可以从module-a 中选择要在一行中导出的模块。所以在你的module-b.js 你可以这样做:

      // export all modules excluding `talkToMe`
      export { MyFirstStandardClass, someOtherModule } from 'module-a';
      
      export function talkToMe(condition = true) {
          // ...
      }
      

      或者您可以导出默认对象并使用 Object.assign() 选择要排除/覆盖的内容:

      import * as StandardModule from 'module-a';
      
      const overridenExports = {
          talkToMe: function(condition = true) {
              // ...
          }
      }
      
      const myModule = Object.assign({}, StandardModule, overridenExports);
      
      export default myModule;
      

      并导入默认值:

      import MyModule from 'module-b';
      

      【讨论】:

      • 2 感谢您的回答。我已经尝试过了,它有效。但是如果你在 module-a 中有很多子模块,那么这个列表会很长。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2017-04-29
      • 2019-06-06
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多