将库转换为JavaScript闭包

3
我有一个JavaScript函数的外部库,需要将它拉入我的服务器端Google Apps脚本项目中。我这样做主要是为了提高性能,同时也因为Google现在建议不要使用外部库
在当前配置下,外部库中的函数通过<Libname>.funcName()引用,库中的任何全局变量也是如此,例如<Libname>.globA。如果我只是将库复制到我的项目文件中,那么这些函数(和“全局变量”)将只被引用为funcName()。我在我的项目中有数百个这样的引用,可能需要更改。这没关系;全局搜索和替换可以解决这个问题。但是,我担心“命名空间”问题……由于该库是第三方代码,我无法控制它,现在我遇到了名称冲突,因为库中的对象和函数与我的某些代码具有相同的名称。
我该如何将这段代码引入我的项目,并使其内部细节与我的代码分离?有没有一种方法可以保留当前的命名约定<Libname>.funcName()?我认为JavaScript闭包是正确的解决方案,但我对它们不够了解。

我的项目,Code.gs

var globA = { key: 'aKey', value: 'valA' };

function myFunction() {
  var a = MyLib.getValue();
  Logger.log( JSON.stringify( a ) );  // { key: 'libKey', value: 'valLibA' };
}

function getValue() {
  return globA;
}

库"MyLib",Code.gs

var globA = { key: 'libKey', value: 'valLibA' };

function getValue(  ) {
  return globA;  
}
3个回答

2

有两种方法可以解决这个问题。

您可以使用 Browserify 将 Node.js 库转换为可直接粘贴到应用脚本编辑器中的代码。

或者,您可以使用 立即调用函数表达式 自己包装代码。

像这样:

var MyLib = (function() {
  var globA = { key: 'libKey', value: 'valLibA' };
  function getValue(  ) {
    return globA;  
  }

  return {
    globA: globA,
    getValue: getValue
  }
})();

顺便说一下,如果您创建了多个.gs文件,则它们中的代码/定义将按照编辑器左侧显示的文件名顺序执行。


看起来像是我需要的。我会试一试。谢谢! - Mogsdad

0

在我看来,保持一定程度的封闭性来构建模块的最佳方式是使用异步模块定义(AMD)。一个很好的库可以使用 requirejs 来实现。

您可以像以下这样定义和要求您的模块:

define(['path/to/your1stLib', 'path/to/your2ndLib', ...], function(Your1stLib, Your2ndLib, ...) {

  var MyOtherLib = {
    Your1stLib.doStuff(...)

    // rest of the code
  }

  return MyOtherLib;

});

我无法在Google Apps Script中以这种方式使用requirejs。它可以在客户端JavaScript中使用,但不能在服务器端使用。 - Mogsdad
你可以编写一些服务器端脚本,收集你的 Google 代码库并将它们包装在一个工厂函数中。 - Lyes BEN
你能展示一下它是如何工作的吗?请记住,与客户端JavaScript不同,Google Apps脚本作为资源连接到项目中,并没有"文件路径",不能被脚本以文本形式读取。 - Mogsdad
我认为你需要重新考虑你的需求。也许有些需求你认为必须满足,但实际上并不是这样。 - Lyes BEN

0
我建议将该库封装为 AMD 模块,并使用 requirejs 或类似的工具来加载依赖项。

以这种方式在Google Apps Script中无法使用AMD模块或requirejs。它可以在客户端JavaScript中使用,但不能在服务器端使用。 - Mogsdad
啊,好的,抱歉我无法在这种情况下提供帮助。 - jsdeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接