コーディングするときにpug使ってますか?慣れるとhtmlでコーディングするより大分速くコーディングできるようになります!
pugについてあまり知らない人はPugでHTMLコーディングを効率化・メリットと使い方を知るに分かりやすく書いてあるので、読んでみてください。
コンパイル言語なので、コンパイルするための環境の構築が大変なときもあります。そんなときは下記のコンパイラーを使うと簡単にpugのコンパイル環境が手に入ります。
pugの特徴の1つはファイルのincludeができることです。
ほんとに便利なのですが、たまにincludeファイルの内容がページごとに微妙に異なり、includeファイルにしたいけど、includeファイルにできない!ってこともあります。
今回はそんなときの解決方法を紹介します。
pugを使い始めて間もない人には役に立つ内容だと思います。
相対パスを解決する
画像へのパスや、リンクが相対パスになっているとincludeファイルにしたときに困ります。
例えば次のようなディレクトリ構造を考えてみます。
- index.pug
- _include.pug
- img.jpg
- hoge
- index.pug
index.pug と hoge/index.pug の両方でimg.jpgを読み込む場合、
相対パスで書くと当然記述が変わります。
これを index.pug と hoge/index.pug の2つファイルで
includeされている_include.pug で img.jpg を
相対パスで読み込むにはどうすれば上手くいくでしょうか。
それはpathの変数をおくと上手くいきます。
次が記述例です。
index.pug
- var path = "./";
include _include.pug
hoge/index.pug
- var path = "../";
include ../_include.pug
_include.pug
img(src=`${path}img.jpg`)
このように書くことでコンパイルされると次のようになります。
index.pug → index.html
<img src="./img.jpg">
hoge/index.pug → hoge/index.html
<img src="../img.jpg">
これを利用すれば、リンクなどの相対パスがincludeしたいファイルの中にあっても、問題なくincludeファイルとして利用できます。
ナビのカレントのclassを解決する
次はナビのカレントなど、ページによってclassが変わったり、classが追加されたりする要素がincludeファイルの中にある場合の解決方法です。
これはfor文やfunctionなども使用しているので、pugを使い始めた人には少し分かりづらいかもしれません。
基本的な解決方法は先程と同じで、ページを識別するための変数を1つおきます。
以下のようなディレクトリ構造を考えてみます。
includeするのは_nav.pugです。
- index.pug
- _nav.pug
- outline
- index.pug
次が記述例です。
index.pug
- var page = "home";
include _nav.pug
outline/index.pug
- var page = "outline";
include ../_nav.pug
_nav.pug
-
var nav = {
home:{
url:"/",
name:"HOME"
},
outline:{
url:"/outline/",
name:"OUTLINE"
},
items:{
url:"/items/",
name:"ITEMS"
},
news:{
url:"/news/",
name:"NEWS"
},
contact:{
url:"/contact/",
name:"CONTACT"
}
};
function currentCheck(i){
if( i == page )
return "current";
else
return "";
}
nav.nav
ul.glnav
- for(item in nav)
li(class=`glnav-item ${currentCheck(item)}`)
a(href=`${nav[item].url}`)= nav[item].name
_nav.pugは少し複雑かもしれません。
nav変数には、ナビゲーションメニューの内容を配列で入れています。
currentCheck関数は、page変数とnav変数のキーを比較して、同じだったら current を返す関数です。
上記のものをコンパイルすると、次のようになります。
index.pug → index.html
<nav class="nav">
<ul class="glnav">
<li class="glnav-item current"><a href="/">HOME</a></li>
<li class="glnav-item"><a href="/outline/">OUTLINE</a></li>
<li class="glnav-item"><a href="/items/">ITEMS</a></li>
<li class="glnav-item"><a href="/news/">NEWS</a></li>
<li class="glnav-item"><a href="/contact/">CONTACT</a></li>
</ul>
</nav>
outline/index.pug → outline/index.html
<nav class="nav">
<ul class="glnav">
<li class="glnav-item"><a href="/">HOME</a></li>
<li class="glnav-item current"><a href="/outline/">OUTLINE</a></li>
<li class="glnav-item"><a href="/items/">ITEMS</a></li>
<li class="glnav-item"><a href="/news/">NEWS</a></li>
<li class="glnav-item"><a href="/contact/">CONTACT</a></li>
</ul>
</nav>
includeしてはいませんが、上記の内容をcodepenで作成しました。
OUTLINEにcurrentのclassが付いていることが確認できると思います。
See the Pen pug nav by takblog (@blanks-site) on CodePen.
これからもpugについて思いついたことを書いていこうと思います。