我有一个JavaScript函数的外部库,需要将其放入服务器端Google Apps Script项目中。我这样做主要是出于性能方面的考虑,但也是因为Google now recommends against using external libs。
在当前配置中,外部库中的函数由<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;
}
最佳答案
有两种解决方法。
您可以使用browserify将节点库转换为一段代码,只需将其粘贴到apps脚本编辑器中即可。
或者,您可以使用immediately invoked function expression自己包装代码。
像这样:
var MyLib = (function() {
var globA = { key: 'libKey', value: 'valLibA' };
function getValue( ) {
return globA;
}
return {
globA: globA,
getValue: getValue
}
})();
顺便说一句如果创建多个.gs文件,则它们中的代码/定义将按照文件名在编辑器左侧显示的顺序执行。