Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6模块&x2B;揭示模块模式_Javascript - Fatal编程技术网

Javascript ES6模块&x2B;揭示模块模式

Javascript ES6模块&x2B;揭示模块模式,javascript,Javascript,我刚刚开始使用ES6模块进行前端开发(我们根本不使用Node),我想知道我们提出的这种模式是否有任何缺陷,或者您是否有任何改进建议。我猜它使用了es6模块中揭示模块模式背后的一些基本原理。我问这个问题是因为我看到的大多数es6模块“如何指导”都做了一些不同的事情,我将在问题的最底部加以说明 需要注意的一些事项: 我们(非常确定)希望每个模块只导出一个东西。这在Airbnb风格指南中被列为最佳实践,我们刚刚发现,在使用npm软件包时,它总体上是不错的 我们非常喜欢使用“public”和“priv

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

需要注意的一些事项:

  • 我们(非常确定)希望每个模块只导出一个东西。这在Airbnb风格指南中被列为最佳实践,我们刚刚发现,在使用npm软件包时,它总体上是不错的
  • 我们非常喜欢使用“public”和“private”来命名方法(我想我们应该使用uu)作为私有方法,因为这是最新的最佳实践),这样可以很容易地看到模块之外的可用内容
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模块如何”指南中看到的是:

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

export default utils;
我们(非常确定)希望每个模块只导出一个东西

不,不要这样做。如果您的模块提供多个功能,如一组帮助函数,但不提供单个函数、单个类或其他功能,则还应导出多个功能

只需将默认导出更改为

export {
  publicHello as h,
  publicHelloWorld as hw,
}
以及你对

import * as whatever from "module.js";

第二个较短,结构良好。然而,对于第一种模式也有很多好的用例。用
before@JonasW. 你能详细说明你所说的“确保良好的结构”是什么意思吗?我想我在这方面的第一个问题是私有方法/变量在哪里,在var utils之上还是之下?也是的,我们应该说uu是最佳实践;当我们很久以前开始使用public/private时,我想我们从未改变过我们的方式。“我们希望每个模块只输出一件东西。这在Airbnb风格指南中被列为最佳实践”-不,Airbnb误解了模块的工作方式。前一段时间,在我的研究中,我阅读了你在评论中链接到的堆栈答案,并在这里阅读了一些与你类似的其他答案,但我从未看到我们应该导出多个内容的明确原因。原因是什么,仅仅是“他们做了不同的事情,所以他们应该有不同的名字”?(另外,我们使用的[filestack,opentok…]来自“大公司”的npm包似乎都导出了一件事,我想,所以我只是假设。我可以看看filestack的api,说它做了“一件事”——让我们使用他们的api——或者多件事:上传、编辑图像等)a)它更短b)它允许您使用单独命名的导入(
import{h,hw}来自“module.js”;
)如果您想这样做c)它有助于树抖动(在构建阶段)和类似的优化(也在引擎中)d)这正是命名导出为hanks设计的用例,非常感谢。在这三种方法中,我真正关心的唯一好处是c),并在没有命名导入的情况下处理树抖动。所以我想我还是不相信:/Edit——也许有一个论点是,当我们最终可以在浏览器中使用模块时,它们可能需要(或者可能处理得更快)命名导出来处理树抖动。您添加了d),因此,如果规范这么说,这通常是一个很好的理由。@KayakinKoder它似乎不是:“(您也不需要单独导入它们,像我的答案中所示的名称空间导入也是可以优化的)。当然d)它本身是一个弱论点,但它确实暗示了其他论点:-)我站得住脚,认为我已经用汇总测试过了。多谢