【问题标题】:On Node.JS, Jade Templates, and Javascript Options Objects关于 Node.JS、Jade 模板和 Javascript 选项对象
【发布时间】:2012-08-16 14:56:52
【问题描述】:

我目前正在 Windows 中使用 node.js 构建一个项目。我正在使用批处理文件来组装资源并通过命令行构建翡翠模板。在 Jade 中,我使用开关 -o 来定义填充模板中本地化内容的 JS 对象

有一段时间,一切都很顺利。但是,对我的 JSON 查找的更改导致了错误: "输入行太长"

研究错误后,我发现 windows shell 对行的长度有限制。不幸的是,我的项目需要整个查找对象。但是,我开始想知道翡翠是否可以接受我的查找文件的路径,而不是包含文件内容的字符串。目前,我正在将内容构建到一个变量中并用那个ala调用jade:

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (%sourcedir%\assets\english.json) do set content=!content! %%i
::use the json file as a key for assembling the jade templates 
call jade %sourcedir% --out %destdir% -o"%content%"
EndLocal

如果我可以使用查找文件的路径,那就容易多了。但是,我很确定如何做到这一点(如果可能的话)。 Jade 的文档有点欠缺。

那么,简而言之,Jade 是否可以接受 JS 对象的文件路径而不是包含该对象的字符串?有没有更好的方法来构建不会超过限制的玉调用?

【问题讨论】:

  • 为什么不让它在使用时动态编译模板?
  • 我不太清楚你的意思。你是说在编辑每个单独的模板时编译它吗?我正在尝试创建一个批处理过程,我可以在构建时运行它来组装一个用于分发的包。
  • 不是在编辑时而是在请求时。为什么要首先“构建”模板?
  • 我在本地构建我的 html 文件,而不是推送到服务器。我用这种结构继承了这个项目(我相信产品服务器由于某种原因不允许节点执行)。如果我可以让玉将我的字典视为文件而不是使用长字符串,那将是最有帮助的。我的查找对象太大而无法在命令行中使用

标签: javascript windows node.js command-line pug


【解决方案1】:

编写一个 node.js 脚本,它将读取您的“资产”并调用一个玉。比如:

var fs = require('fs'),
    _ = require('underscore'),
    async = require('async');

var sourceDir = 'path to the directory with your jade templates',
    destinationDir = 'path to the directory where you want the result html files to be contained in';

async.waterfall([
    async.parallel.bind(null, {
        serializedData: fs.readFile.bind(null, 'assets/english.json'),
        files: fs.readDir.bind(null, sourceDir),
    }),
    function (result, callback) {
        var data = JSON.parse(result.serializedData),
            files = result.files;
        async.parallel(_.map(files, function (file) {
            return async.waterfall.bind(null, [
                fs.readFile.bind(null, sourceDir + file),
                function (jadeSource, callback) {
                    process.nextTick(callback.bind(null, jade.compile(jadeSource)(data)));
                },
                fs.writeFile.bind(null, destinationDir + file)
            ]);
        }), callback);
    }
], function (err) {
    if (err) {
        console.log("An error occured: " + err);
    } else {
        console.log("Done!");
    }
});

然后在你的批处理文件中直接调用这个脚本,而不是枚举目录,手动调用jade。

它不仅可以解决您的问题,而且工作得更快,因为:

  1. I/O 操作是并行完成的;
  2. Node.js 在构建过程中只启动一次,而不是像现在这样为每个文件启动它。

【讨论】:

  • 我最终使用 ubuntu 虚拟机绕过了这个问题,但这个解决方案确实工作了几天,直到我构建了子弹并进入 Linux 环境
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多