1

我正在寻找用于构建 JS 文件的非常简单的模板脚本。它应该只做一件事:将一个文件包含到另一个文件中。

模板(main.js)

/*> script.js */

var style = "/*> style.css */";

脚本.js

var my_script;

样式.css

html, body {margin:0; padding:0}
.my-style {background: #fffacc}

输出

var my_script;

var style = "html, body {margin:0; padding:0}\
.my-style {background: #fffacc}";

我做了cat main.js | sed -e 's!/\*> \(.*\) \*/!cat \1!g'。输出:

cat script.js

var style = "cat style.css";

如何使cat \1实际工作?

我将使用它来构建 UserJS(Greasemonkey 脚本)。我的存储库中的 JS 和 CSS 文件很少。我想让它们彼此分开。但结果脚本必须只有一个,所以我需要将所有 JS 和 CSS 文件合并到它。

我可以使用 sed、awk、perl 或 ruby​​。


最后,我制作了js-preprocessor。多谢你们!

4

3 回答 3

4

有三个明显的解决方案:

  1. 不要使用任何类型的包含指令,只需指定文件的顺序。这使您可以使用简单的cat file1 file2 file3 > output语句来获得最终结果。
  2. 使用现有的预处理器,例如 C 预处理器 ( cpp),但要小心它如何与 JS 交互。但是,您也可以通过在“标题”中定义宏来利用这一点,就像在 C 中所做的那样,创建您自己的库。
  3. 编写一个简单的预处理器,它可以完全按照您的要求进行操作。如果您只想支持#include-like 指令,这并不难。

非显而易见的解决方案可能会使用一些特定的 JavaScript 引擎,这些引擎允许您添加挂钩或插件以支持文件包含、输出结果代码或完全其他的东西。

于 2009-12-29T17:46:42.077 回答
1

这个的预期用途是什么?JavaScript 不支持多行字符串,因此您的style变量定义将在模板扩展后导致语法错误。

编辑:我的错误——我错过了你的示例扩展包括一个\延续。但是,这会使扩展过程复杂化;如果你能更详细地说明你打算在哪里使用它,你有什么工具等,那就太好了。

Ruby 中的一个示例:

ruby <main.js -pe'$_.gsub!(%r{/\*>\s*(.+?)\s*\*/}) { File.read($1) }'
于 2009-12-29T17:16:14.290 回答
0

我也会使用 ruby​​,但我建议依赖ruby​​ stdlib 中包含的erb 。如果您想添加更复杂的功能,它允许可扩展性。

在您的情况下,您可以编写以下方法:

def include_file(filename)
  File.open( filename, "r" ) { |f| f.read }
end

然后从您的模板中使用它:

<% include_file "script.js"  %>
var style = "<% include_file "style.css"  %>";

它只是工作...

于 2009-12-30T13:19:53.523 回答