使用Google Closure编译器时,在浏览器和node.js之间共享JS的最佳方法

时间:2011-11-06 11:53:54

标签: javascript node.js google-closure-compiler

我正在浏览器和运行node.js的服务器之间开发一个联网应用程序。我现在正在共享很多代码,但是当我实际部署它时,我希望客户端只获取客户端特定的代码。我现在的选择是:

1。)使用继承实现任何browser / node.js差异。我在几个地方尝试了这个,最后我得到了许多类,这些类是他们父母的非常非常基本的自定义,通常只是部分专门化一个函数。这不是我非常喜欢的风格,因为当你试图找出实际发生的事情时,它意味着很多间接。

2.。)在全局范围内定义一个类似IS_BROWSER的常量,然后在需要更改浏览器与node.js上的代码路径时检查它。然后,封闭使用高级优化编译所有js以删除浏览器上的死代码(设置IS_BROWSER = true)。这种方法是否存在任何问题,假设我需要做任何我需要做的事情才能在闭包编译器中进行高级优化?

3。)??我愿意接受建议。

1 个答案:

答案 0 :(得分:1)

如果使用高级编译,则应删除任何未使用的代码;如果您正确使用编译器的导出系统,那么客户端代码不会调用的任何服务器端代码都不会在客户端代码的编译版本中。

您可以在一个大blob中编写所有代码,然后为您的客户端添加一个包含

等内容的文件
goog.require('my.client.app');
goog.exportSymbol('my.app.entryPoint', my.client.app.entryPoint);

编译后的代码不会包含my.client.app.entryPoint调用树中没有的任何内容。同样,如果您的编译仅导出服务器入口点,则将排除客户端代码。

上面的样式用于编写脚本以提供一些函数,然后由内联脚本调用;要将整个事情变成一个单独的脚本,你可以做一些更简单的事情:

goog.require('my.client.app');
my.client.app.entryPoint();

要验证您的编译输出中没有大量死代码,您可以使用以下内容:ScriptCover