0

私は現在、Windowsでnode.jsを使用してプロジェクトを構築しています。バッチファイルを使用して、コマンドラインからリソースをアセンブルし、jadeテンプレートを作成しています。Jadeでは、スイッチ-oを使用して、テンプレート内のローカライズされたコンテンツを埋めるJSオブジェクトを定義しています。

しばらくの間、すべてがうまく機能しました。ただし、JSONルックアップを変更すると、「入力行が長すぎます」というエラーが発生しました。

エラーを調べたところ、Windowsシェルには行の長さに制限があることがわかりました。残念ながら、プロジェクトにはルックアップオブジェクト全体が必要です。しかし、jadeがファイルの内容を含む文字列ではなく、ルックアップファイルへのパスを受け入れることができるかどうか疑問に思い始めました。現在、コンテンツを変数に組み込み、その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は、オブジェクトを含む文字列ではなく、JSオブジェクトへのファイルパスを受け入れることができますか?限界を超えない翡翠の呼び出しを構築するためのより良い方法はありますか?

4

1 に答える 1

0

「資産」を読み取り、翡翠を呼び出す 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!");
    }
});

次に、ディレクトリを列挙してジェイドを手動で呼び出す代わりに、バッチファイルでこのスクリプトを直接呼び出します。

問題を解決するだけでなく、次の理由により、はるかに高速に動作します。

  1. I/O 操作は並行して行われます。
  2. Node.js は、現在のようにすべてのファイルに対して開始するのではなく、ビルド プロセス中に 1 回だけ開始されます。
于 2012-08-16T06:56:52.857 に答える