すべてのJadeファイルを個々のHTMLファイルにコンパイルするようにGruntfileを構成しようとしています。たとえば、次のソースフォルダがある場合:
source
└── templates
├── first.jade
├── second.jade
└── third.jade
次に、grunt jade
が出力することを期待します。
build
└── templates
├── first.html
├── second.html
└── third.html
grunt-contrib-jade
を使用したGruntfileは次のとおりです。
module.exports = function(grunt) {
grunt.initConfig({
jade: {
compile: {
options: {
client: false,
pretty: true
},
files: [ {
src: "*.jade",
dest: "build/templates/",
ext: "html",
cwd: "source/templates/"
} ]
}
},
});
grunt.loadNpmTasks("grunt-contrib-jade");
};
ただし、jadeコマンドを実行すると、次のエラーが発生します。
Running "jade:compile" (jade) task
>> Source file "first.jade" not found.
>> Source file "second.jade" not found.
>> Source file "third.jade" not found.
私は何が間違っているのですか?
上記の回答を完了するには
jade: {
compile: {
options: {
client: false,
pretty: true
},
files: [ {
cwd: "app/views",
src: "**/*.jade",
dest: "build/templates",
expand: true,
ext: ".html"
} ]
}
}
したがって、ソースが次のように構成されている場合:
app
└── views
└── main.jade
└── user
└── signup.jade
└── preferences.jade
grunt jade
は次の構造を作成します
build
└── templates
└── main.html
└── user
└── signup.html
└── preferences.html
編集:grunt-contrib-jade
は非推奨です。むしろgrunt-contrib-pug
を使用する必要があります。まったく同じですが、ヒスイの名前をパグに変更する必要がありました。
誰かがそれを必要とする場合に備えて。上記は何も機能しませんでした。これが私にとって最終的にどのように機能したかです。
私はgrunt.loadNpmTasks('grunt-contrib-pug');
を使用していますが、contrib-jadeが非推奨になったかどうかはわかりませんが、このソリューションは機能します。 index.jadeだけを処理する最初のファイルオブジェクトと、テンプレートを処理する2番目のファイルオブジェクトが必要です。今、私がそれを分割せず、プロジェクトディレクトリを指すだけで、jadeコンパイラが私のnpmパッケージフォルダ内で失われるので、これははるかに速く実行されます。
pug: {
compile: {
options: {
client: false,
pretty: true,
data: {
debug: false
}
},
files: [
{
'dist/index.html': ['index.jade']
},
{
src: "templates/*.jade",
dest: "dist",
expand: true,
ext: ".html"
} ]
}
}
私はこれが古い投稿であることを知っていますが、同様の問題を解決しようとしている間、私はここに戻ってきました。 forループを使用して単一のjadeテンプレートファイルから複数のhtmlファイルを出力したかったのです。そのため、「ファイル」オブジェクトをより細かく制御する必要がありました。
私が遭遇して最終的に解決した2つの問題は、出力ファイル名(javascriptオブジェクトリテラルKEY)を設定することと、ループ変数を使用できるようにインラインjavascript関数をすぐに実行することです。
これがコメント付きの私の完全なソースコードです。これが、この投稿に出くわした他の人の役に立つことを願っています。
Gruntfile.js:
module.exports = function(grunt) {
// Create basic grunt config (e.g. watch files)
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
grunt: { files: ['Gruntfile.js'] },
jade: {
files: 'src/*.jade',
tasks: ['jade']
}
}
});
// Load json to populate jade templates and build loop
var json = grunt.file.readJSON('test.json');
for(var i = 0; i < json.length; i++) {
var obj = json[i];
// For each json item create a new jade task with a custom 'target' name.
// Because a custom target is provided don't nest options/data/file parameters
// in another target like 'compile' as grunt wont't be able to find them
// Make sure that functions are called using immediate invocation or the variables will be lost
// http://stackoverflow.com/questions/939386/immediate-function-invocation-syntax
grunt.config(['jade', obj.filename], {
options: {
// Pass data to the jade template
data: (function(dest, src) {
return {
myJadeName: obj.myname,
from: src,
to: dest
};
}()) // <-- n.b. using() for immediate invocation
},
// Add files using custom function
files: (function() {
var files = {};
files['build/' + obj.filename + '.html'] = 'src/index.jade';
return files;
}()) // <-- n.b. using () for immediate invocation
});
}
grunt.loadNpmTasks('grunt-contrib-jade');
grunt.loadNpmTasks('grunt-contrib-watch');
// Register all the jade tasks using top level 'jade' task
// You can also run subtasks using the target name e.g. 'jade:cats'
grunt.registerTask('default', ['jade', 'watch']);
};
src/index.jade:
doctype html
html(lang="en")
head
title= pageTitle
script(type='text/javascript').
if (foo) {
bar(1 + 5)
}
body
h1 #{myJadeName} - node template engine
#container.col
p.
Jade is a terse and simple
templating language with a
strong focus on performance
and powerful features.
test.json:
[{
"id" : "1",
"filename" : "cats",
"tid" : "2016-01-01 23:35",
"myname": "Cat Lady"
},
{
"id" : "2",
"filename" : "dogs",
"tid" : "2016-01-01 23:45",
"myname": "Dog Man"
}]
'grunt'を実行した後、出力は次のようになります。
build/cats.html
build/dogs.html