【问题标题】:Is there a JavaScript minifier with conditional directives?是否有带有条件指令的 JavaScript 缩小器?
【发布时间】:2011-08-25 19:49:29
【问题描述】:

我正在寻找一个 JavaScript 缩小器,它将对类似于 conditional compilation directives 的东西提供某种支持。

例如,原始的 JavaScript 代码可能类似于以下内容:

//#if Dev
    showLoginScreen();
//#else
    login("DevUser", "qwerty1");
//#endif

因此原始代码可能包含指令#define Dev,但一旦投入生产,#define Dev 将被删除,并且压缩器将从其输出中排除 login("DevUser", "qwerty1"); 行。

是否有任何缩小器支持这种行为?

【问题讨论】:

  • 我不知道具有此功能的 minifier,但我认为在向一个缩小器。基本上就像使用生成的 HTML 所做的一样(例如,通过带有 .erb 文件的 Ruby 或带有 .php 文件的 PHP)。
  • 闭包编译器支持定义。
  • @Stephen Chung - 你能链接到任何关于使用闭包编译器和defines 的资源吗?
  • 你可以到 Closure 编译器主页阅读文档。您可以在 JsDoc 表示法中执行 @define,然后使用 --define 开关在命令行中设置变量。
  • @Stephen Chung - 看起来闭包支持不同类型的defineone which can override variable values。这不是我要找的;我需要条件编译。我希望根据define 从最终输出中删除代码。

标签: javascript minify conditional-compilation


【解决方案1】:

只需通过 C 预处理器运行代码,然后通过压缩器运行该输出。除了处理字符串文字之外,C 预处理器并不是真正的 C 特定的。

例子:

cpp -DDev file.js /dev/stdout | jsmin > file-min.js

file.js 在哪里:

#if Dev
    showLoginScreen();
#else
    login("DevUser", "qwerty1");
#endif

将包含开发代码,然后将其缩小。

为了使原始源代码按原样可执行,您可以在处理管道中再添加一个步骤。像这样编写代码:

//#if Dev
    showLoginScreen();
//#else
    login("DevUser", "qwerty1");
//#endif

然后像这样处理它:

sed 's!^//#!#!' file.js | cpp -DDev /dev/stdin /dev/stdout | jsmin > file-min.js

sed 部分用于从以//# 开头的行中去除前导//cpp 然后像往常一样对源进行预处理,cpp 的输出通过 jsmin 馈送以进行缩小。

一个更好的解决方案可能只是像 C 程序员那样做,并且总是在运行之前适当地预处理你的源文件。您可以编辑 .jspp(“预处理 JavaScript”)文件,并设置您的系统以在您更改内容时对其进行适当的预处理以进行开发或部署。如果您使用频繁的测试,您可以将预处理作为测试工具调用的一部分。

(注意:命令行可能已关闭;我从手册页中计算出 cpp 部分,从 jsmin.c 源代码文件中计算出 jsmin 部分,因此我没有实际测试过此命令行。)

【讨论】:

  • 是的。我已经扩展了我的答案,试图提供一个更完整的例子。
  • 但是由于 # 字符(在开发环境中不会缩小),原始 JavaScript 无法执行,但如果我将它们放在 cmets 中,cpp 似乎会忽略他们。
  • 正确。您不再运行原始 JavaScript;你通过预处理器运行它。运行原始版本没有意义,因为您正在引入 if/else:如果您希望两者都运行,那么您将不需要 if/else 构造。如果您确实希望能够按原样运行 Javascript,那么是时候在您的预处理工具链中执行另一个步骤了:在您的代码中写入 //#,然后使用 sed 将 line-initial //# 全局替换为 @ 987654336@,然后通过 cpp 运行该输出。
  • k...我还发现了这个:nongnu.org/espresso/js-cpp.html - 它的评论行对我来说效果很好。
  • @Richard:sed 解决方案不是解决这个问题吗?
【解决方案2】:

我根据对类似问题的回答查看了 C 预处理器和其他一些竞争者。然后找到了我认为迄今为止最好的答案 - PHP。考虑:

1) PHP 确实是一个预处理器(它的首字母缩写)。

2) PHP 已准备好在大多数服务器上运行。您所要做的就是将文件扩展名从“.js”更改为“.php”或“.js.php”,或者(我的偏好)对配置文件进行简单编辑(您可以在其他地方找到详细信息)。

3) 许多 JavaScript 开发人员已经熟悉或精通 PHP。

4) 与许多其他预处理器不同,PHP 是图灵完备的。

5) 你只需要基本的 PHP 知识就能受益匪浅。

6) PHP 的文档/教程/论坛比其他预处理器多得多。

但大多数情况下,它很奇怪很酷。感谢给我这个想法的人 - 我现在找不到他们的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2016-01-08
    • 2012-02-02
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多