【问题标题】:ES6 Modules + Revealing Module PatternES6 模块 + 显示模块模式
【发布时间】:2017-12-07 21:16:35
【问题描述】:

我刚刚开始使用 es 6 模块进行前端开发(我们根本不使用 Node),想知道我们提出的这种模式是否有任何缺陷,或者您是否有任何改进建议。我猜它在 es6 模块中使用了揭示模块模式背后的一些基本原理。我问这个问题是因为我见过的大多数 es6 模块“如何指导”都做了不同的事情,我会在问题的最底部注明。

注意事项:

  • 我们(非常确定我们)希望每个模块只导出一个东西。这在 Airbnb 风格指南中被列为最佳实践,我们刚刚发现在使用 npm 包时总体上很好
  • 我们非常喜欢使用“public”和“private”来命名方法(我们应该将 _ 用于私有方法,因为这是较新的最佳实践),这样可以轻松查看模块外部可用的内容

module.js:

// publicly available method
function publicHello() {
    return 'Hello';
};

// publicly available method
function publicHelloWorld(){
    const a = publicHello();
    const b = privateProcessWorld(a);
    return b;
};

// private method
function privateProcessWorld(x) {
    return x + ' world';
};


// create an object to export, containing only the public methods
// note that we rename them here as well, making them easier to consume
const exp = {
    h: publicHello,
    hw: publicHelloWorld,
};

// export the object as default so it can be used in an unnamed import
export default exp;

使用模块:

import whatever from "module.js";

whatever.h();   // "Hello"
whatever.hw();  // "Hello world"

我在大多数“es6 module how to”指南中看到的是这样的:

var utils = {
  generateRandom: function() {
    return Math.random();    
  },
  sum: function(a, b) {
    return a + b;
  }
};

export default utils;

【问题讨论】:

  • 第二个更短,保证了良好的结构。然而,第一种模式也有很多很好的用例。而不是public / private,它是一种常见的模式,用_# 之前注释peivate
  • @JonasW。您能否详细说明“确保良好结构”的含义?我想我在这方面的第一个问题是私有方法/变量在哪里,高于或低于 var utils?同样是的,我们应该说 _ 是最佳实践;当我们很久以前开始使用公共/私有时,我想我们只是从未改变过我们的方式。
  • "我们希望每个模块只导出一个东西。这在 Airbnb 风格指南中被列为最佳实践" - 不,airbnb 误解了模块的工作原理。 Please don't do this.

标签: javascript


【解决方案1】:

我们(很确定我们)希望每个模块只导出一个东西。

没有。不要这样做。如果你的模块提供了多种功能,比如一堆辅助函数,并且不提供单个函数或单个类之类的东西,你也应该导出多个东西。

只需将默认导出更改为

export {
  publicHello as h,
  publicHelloWorld as hw,
}

以及您的导入

import * as whatever from "module.js";

【讨论】:

  • 在我的研究期间,我阅读了您在评论中链接到的堆栈答案,并在这里阅读了与您类似的其他一些答案,但我从未见过明确的原因为什么 我们应该导出多个东西。原因是什么,只是“他们做不同的事情,所以他们应该以不同的方式命名”? (此外,我们使用 [filestack, opentok ...] 的“大公司”的 npm 包似乎都导出了我认为的一件事,所以我只是假设。我可以查看 filestack 的 api 并说它做了“一件事" -- 让我们使用他们的 api -- 或多种功能:上传、编辑图片等)
  • a) 它更短 b) 如果您想这样做,它允许您使用单独的命名导入 (import {h, hw} from "module.js";) c) 它有助于树摇动(在构建阶段)和类似的优化(也在引擎中)d)这正是命名导出的用例
  • 谢谢,非常感谢。我真正关心这三个的唯一好处是 c),并且rollupjs.org 可以在没有命名导入的情况下处理树抖动。所以我想我仍然不相信:/ 编辑——也许一个论点是,当我们最终可以在浏览器中使用模块时,它们可能需要(或可能处理得更快)命名导出来处理树抖动。并且您添加了 d),所以如果规范这么说,这通常是一个很好的理由。
  • @KayakinKoder 似乎不是这样:“Exporting functions individually is the way to make them tree-shakeable.”(您也不需要单独导入它们,命名空间像我的答案中显示的那样的导入也是可以优化的)。当然 d) 本身是一个弱论点,但它确实暗示了其他论点:-)
  • 我的立场是正确的,我以为我已经用汇总测试过了。非常感谢
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2020-01-23
  • 2016-05-15
相关资源
最近更新 更多