【问题标题】:Proper way to write external javascript libraries编写外部javascript库的正确方法
【发布时间】:2018-01-17 16:58:33
【问题描述】:

我创建了一个类/库。我将新的类语法与构造函数及其方法一起使用,现在呢? 在外部 JS 文件中使用它应该放什么?

我有这样的事情

class LoadBalancer {
    constructor() {/*...*/}
    method1(...bla) {/*...*/}
}

我应该在顶部放一个use strict 吗?

'use strict';

也许把我的班级放在一个自执行匿名函数中?或者在我的班级名称中使用export

我见过很多语法如下的 .js 文件:

(function (root, factory) {
    if(typeof exports === 'object' && typeof module === 'object')
        module.exports = factory();
    else if(typeof define === 'function' && define.amd)
        define("EventBus", [], factory);
    else if(typeof exports === 'object')
        exports["EventBus"] = factory();
    else
        root["EventBus"] = factory();
})(this, function() { /*....
    their functions and libraries declaration goes here
    .....*/ 
    return whatEverNewFunc();
});

但我不知道这是什么意思,如果你不使用它们会发生什么或有什么优势,如果我只是将我的 class LoadBalancer {/*...*/}放在 loadBalancer.js 文件中,就是这样。

【问题讨论】:

  • 既然您说的是 webWorker,那么您的目标是在浏览器中运行是否正确?将代码封装在 IIFE(立即调用的函数表达式)中的通常点是防止您自己的变量污染全局命名空间并防止与其他变量发生冲突,并保护您自己的顶级变量无法被外部代码访问。在浏览器中,这通常是一件好事。在 node.js 中不需要它,因为模块已经包含在它们自己的函数中。
  • WebWorker 与我的要求无关,我的所有代码都在类声明中,我也要求导出语法。这是我的 js code
  • 您要运行的目标平台与发布模块所需的一切有关。这就是我问的原因。对于 node.js,您将作为导出其接口的模块发布。对于没有 ES6 的浏览器,您可能会将其作为脚本发布,并单独包含在内并将其接口添加到全局命名空间,或者您需要 ES6 支持并将其定义为 ES6 模块。您展示的最后一个代码块是关于平台检测的。

标签: javascript ecmascript-6 ecmascript-2016 strict-mode


【解决方案1】:

是的,我建议为您的类(以及可能要导出的其他内容)编写一个带有 export 语句的 ES6 模块。你甚至不需要输入"use strict";,它隐含在 ES6 模块中。

将您的库作为 ES6 模块(适用于任何现代环境或捆绑器或转译器)发布,或者自行转译并使用您所见证的 UniversalModuleDefinition 样式发布它的版本 - 转译器可以为您添加它。当然,您也可以同时发布这两个版本。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多