サーバーレスなアプリケーションをフレームワークなしで作成するとに一番困ったのが、sassとhtmlの共通化でした。
フロントエンドはwebpack
やgulp.js
などの便利なツールがいろいろありますが、メンテがしてないとか多機能すぎるなどの問題がありました。まぁ、読めばいいでしょうけど、面倒くさい。
まず第一条件としてあるのは、フレームワークより簡単で、なるべく簡単にsassとかの環境構築ができて尚且つツールアップデートとかに振り回されないこと。 ページ数で言うと50ページ未満で単純な機能のみのサーバーレスで実装。メンテナンスをなるべくしなくてもいいようにフレームワークは使わない。 なるべく簡単に簡単に。
最初は、webpack
やgulp.js
を使っていこうかなぁと思ってましたが、以下の理由でやめました。
nuxt.js
などの静的ジェネレータを使うよと思ったのでやめたnode
が必要なのでインストールしてない人はインストールしてください。
公式にインストール方法がのってます。
pugのインストール
$ npm install -D pug
僕の場合はグローバルにインストールするのはイヤなので、ローカルにしてます。
$ npm install -D pug-cli
正しく、インストールされたか確認。
$ npx pug --help
部分テンプレートにしたい部分の名前に_
をいれる。ベーシックなものだとこんな感じになると思います。
_layout
というフォルダの中にhead
やmeta
とかの共通部分を_baseof.pug
に記述。
_partials
フォルダにfooter
やheader
を入れてます。
footer
やheader
をbaseof.pug
にincludeするので、baseof.pug
を組み立てます。
//- ページの設定
block pagedata
doctype html
html(lang="ja")
head
meta(charset="utf-8")
meta(http-equiv="X-UA-Compatible" content="IE=edge")
meta(name="viewport" content="width=device-width, initial-scale=1.0")
link(href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet")
title #{pageTitle} | Sampleホームページ
block pagecss
body.page
div.container
include ./_partials/_nav
div.main-box
include ./_partials/_header
block main
include ./_partials/_footer
block pagejs
これで共通レイアウトの部分は完成。
ここのページはどこにでも作っていいのですが、今回はテストなのでディレクトリ直下にサンプルフォルダを作成し、その中にindex.pug
を作成し、先ほど作ったbaseof.pug
をincludeします。
//- テンプレート読み込み
extend ../_layout/_baseof
//-ページ独自の設定
append pagedata
- var pageTitle= "トップページ";
//- ページ独自のcss
append pagecss
link(rel="stylesheet" href="../assets/css/style.css")
//- ページ独自のjs
append pagejs
script(src="../assets/js/index.js")
//- ページのコンテンツ
block main
div.content
div.page-item
h1 トップページのコンテンツ
コードを見たらわかると思いますが、単純にbaseof.pug
をincludeしてあとは個別のコンテンツやjs
やcss
を書いてるだけです。
pugファイルはbuildすると素のhtmlを書き出してくれます。ただし、一つ一つbuildコマンドを叩くのは面倒なので、sh
ファイルを作って、まとめて、buildする形にします。ここでは、build_pug.sh
を作成します。
#!/bin/sh
#
# Sample
#
npx pug sample/index.pug --pretty --out public/sample
僕の場合は、ローカルにpug cli
をインストールしてないので、npx
コマンドを付けてます。このコマンドの場合はディレクトリ直下のsampleフォルダの中のindex.pugをbuildして、publicフォルダのsampleフォルダに書き出すという意味です。気をつけて欲しいのはpublicやsampleフォルダは予め作成しておいてください。
出来たら、これをbuildします。
$ sh build_pug.sh
先ほどのをbuildするとpublic/sampleにこんな感じで書き出されます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
<title>トップページ | Sampleホームページ</title>
<link rel="stylesheet" href="../assets/css/style.css">
</head>
<body class="page">
<div class="container">
<nav class="nav"><span>ここはnav</span></nav>
<div class="main-box">
<header class="header"><span>ここヘッダー</span></header>
<div class="content">
<div class="page-item">
<h1>トップページのコンテンツ</h1>
</div>
</div>
</div>
<footer class="footer"><span>ここはフッター</span></footer>
</div>
</body>
<script src="../assets/js/index.js"></script>
</html>
node_modules
やbuildされるたびに変更されるものはgitに含めないようにします。
/node_modules/
/public/top/
node-sass
はsassを自動コンパイルするのに使うのでインストールしときます。
$ npm i node-sass -D
フォルダ構成はなんでもいいですけど、僕の場合は以下のようにしています。publicフォルダにassets/css
にコンパイルしたsass
が格納されるようにしてあります。
試しにnode-sass
のコマンドを実行してみます。ターミナルで以下のコマンドを実行してみてください。
$ npx node-sass sass/_src/style.scss --output public/assets/css/ --output-style compressed
public/assets/css/
配下にsassをコンパイルして圧縮したcssが格納されていると思います。
今度はこれをsassが変更された時に自動でコンパイルされるようにnpm scripts
を使います。
package.json
のscripts
に先ほどのコマンドを追記します。
{
"scripts": {
"sass": "npx node-sass sass/_src/style.scss --output public/assets/css/ --output-style compressed"
}
}
ただ、このままでは本番のコンパイルは問題ないですが、開発中はちょっと面倒なので、開発用のsass-dev
を追加します。
{
"scripts": {
"sass-dev": "npx node-sass sass/_src/style.scss --output public/assets/css/ --output-style compressed --watch --source-map true",
"sass": "npx node-sass sass/_src/style.scss --output public/assets/css/ --output-style compressed"
}
}
sassの変更を検知できるようにwatch
やcssのデバックが簡単になるようにsource-map
を使っています。これでコマンドを実行します。ターミナルで以下のコマンド実行してください。
$ npm run sass-dev
sassが変更されたときにきちんと検知してコンパイルされていると思います。
開発中はsass-dev
を使って本番にdeployするときにsass
を使うといった具合に切り分けすればいい思います。
多少、htmlのbuildを何回もやらなきゃいけないのはちょっと面倒ですが、サーバーレスでのことなのでhtmlよりjs
の実装が多いのでさほど問題にならないです。頑張ればbashで自動コンパイルもできますし。
もし、htmlの方が多いなら静的サイトジェネレーターを考えた方がいいかも。少量のページ数ですと1人で担当することが多いので、余計なツールを使わずに雛形を作ってgit管理しておけばいつでも使いまわせるので便利だと思います。