Giter VIP home page Giter VIP logo

real-world-website-boilerplate's Introduction

Real World Website Boilerplate

静的ウェブサイトを制作するためのテンプレートです。

Features

受託開発にありがちな面倒臭さを解消するために、以下のような機能があります。

サブディレクトリ前提の開発用サーバー設定

サブディレクトリのパスを設定することで、開発用サーバーで開かれるページのURLも変更することができます。加えて、HTMLテンプレートから、サブディレクトリを含めたルートパスを作成できるユーティリティー関数を利用できます。

設定方法に関しては、サイトのサブディレクトリの設定を参照してください。

共通ヘッダー等の置き場所

vendor_assets/というディレクトリ以下に、共通ヘッダーや共通CSSなどのファイルを配置すると、開発サーバーから参照することができます。ここに配置されたファイルはdist/以下には格納されません。

SSIを利用したい場合は、gulpfile.babel.jsに以下のように書き加えます。

const serve = done => {
  browserSync.init({
    // 省略
    rewriteRules: [
      {
        match: /<!--#include virtual="(.+?)" -->/g,
        fn(req, res, match, filename) {
          const includeFilePath = path.join('vendor-assets', filename)
          if (fs.existsSync(includeFilePath)) {
            return fs.readFileSync(includeFilePath)
          } else {
            return `<span style="color: red">\`${includeFilePath}\` could not be found</span>`
          }
        }
      }
    ],
    // 省略
  }, done)
}

HTML制作環境

全てのテンプレートファイル(src/html/**/*.pug)に、ファイルの配置に対応するページのデータとページのURLを提供します。

ページのデータ

ページに対応するテンプレートファイルと同名のJSONファイルを作成することで、そのページにのみ適応されるデータを作成することができます。src/html/index.pugにのみ提供するデータを作成したいときは、src/html/index.jsonというファイルを作成します。

src/html/metadata.jsonのみは例外で、全てのテンプレートファイルに適応されるデータです。

ページのURL

テンプレート側からページのURLを参照するために、以下の変数・データを提供しています。

currentPath

src/htmlから見た相対パスを提供する変数です。例えば、src/html/subdir/page.pugというファイルには、/subdir/page.htmlを提供します。index.pugというファイル名の場合のみ例外で、/という値を提供します。

urlFor(relativePath)

プロジェクトに設定されたサブディレクトリを含めたルートパスを返す関数です。urlFor('css/main.css')という風にすると、/path/to/project/css/main.cssという値が返ります。urlFor(currentPath)とすることで、現在のページまでのルートパスが取得できます。

詳しくはgulpfile.babel.jshtmlというタスクを参照してください。

参考:静的サイト制作のための便利なHTML開発環境の作り方 - ライデンの新人ブログ

納品ファイルの管理

開発用にコンパイルされたファイルは.tmp/以下に、納品用のファイルはdist/以下に格納されます。dist/以下のファイルをGitのコマンドで差分を取れば、差分納品用のZIPが作成できます。納品用のビルドは、コミットごとに自動的に実行されます。

差分Zipの作成

以下のようなコマンドで、HEAD<commit>の差分Zipがarchive/htdocs.zipとして作成されます。

yarn archive -- --commit <commit>

HEAD以外のコミットとの差分を取りたい場合は以下のようにします。

yarn archive -- --commit <old-commit> --commit <new-commit>

この方法では不十分な場合は、以下のようなコマンドが参考になります。

差分Zip生成コマンドの例

git archive --format=zip --prefix=htdocs/ HEAD:dist/path/to/project `git diff --diff-filter=AMCR --name-only <prev-commit> HEAD | grep "^dist/path/to/project/" | sed -e "s/dist\/path\/to\/project\///"` > ~/Desktop/htdocs.zip

差分ファイルリスト出力コマンドの例

git diff --name-only --diff-filter=AMCR <prev-commit> | grep "^dist/path/to/project/" | sed -e "s/dist\/path\/to\/project\///" > ~/Desktop/filelist.txt

参考:ビルドの生成物をGitのリポジトリに含めたいときの問題点の改善例 - ライデンの新人ブログ

Setup

依存パッケージのインストール

yarn

サイトのサブディレクトリの設定

package.jsonprojectConfig.baseDirに、サイトが公開されるサブディレクトリを設定します。

"projectConfig": {
  "baseDir": "path/to/project"
},

ルートなら以下のようにします。

"projectConfig": {
  "baseDir": ""
},

Development

yarn start

上記のコマンドを実行することで、開発用サーバーが立ち上がり、ファイルの変更が監視されるようになります。

Build

pre-commitを利用したフックによって、コミットごとに自動的に納品用のビルドが実行されます

Directory structure

.
├── README.md
├── dist
│   └── path
│       └── to
│           └── project
│               ├── about.html
│               ├── css
│               │   └── app.css
│               ├── index.html
│               └── js
│                   └── app.js
├── gulpfile.babel.js
├── package.json
├── src
│   ├── css
│   │   ├── _base.scss
│   │   ├── _function.scss
│   │   ├── _var.scss
│   │   └── index.scss
│   ├── html
│   │   ├── about.json
│   │   ├── about.pug
│   │   ├── index.json
│   │   ├── index.pug
│   │   ├── metadata.json
│   │   └── partial
│   │       ├── global-header.pug
│   │       ├── head.pug
│   │       └── scripts.pug
│   ├── img
│   ├── js
│   │   ├── index.js
│   │   └── utils.js
│   └── static
├── vendor-assets
├── webpack.config.js
└── yarn.lock

14 directories, 23 files

Recommended CSS design

ECSSが現実的なCSS設計のパターンだと考えており、それを利用することを推奨します。

ファイルの配置としては、src/css/components/namespace/Component.scssという風にします。

参考:最近の僕のCSSとの向き合い方 - yuhei blog

Recommended JavaScript design

Webpackでモジュールシステムをシンプルに利用するために、全てのページで一枚のJavaScriptを読み込んで実行するという形にしています。そのため、ページごとに実行するJavaScriptの処理を切り分けるために、このテンプレートではPageDispatcherを利用しています。

src/js/main.jsには以下のように記述します。

dispatcher.on('home', () => {
  console.log('home')
})

HTMLテンプレート側には以下のように記述します。

body(data-page-type="home")

処理が巨大化してきた場合、以下のようにファイルを分割することができます。それぞれのファイルは、読み込んだだけでは副作用を起こさないようにします。

src/js/main.js

// 静的に`require`しないとwebpackで依存関係を解決できない
dispatcher.on('home', require('./pages/home').default)
dispatcher.on('about', require('./pages/about').default)
dispatcher.on('products', require('./pages/products').default)
dispatcher.on('products/foods', require('./pages/products/foods').default)
dispatcher.on('products/drink', require('./pages/products/drink').default)

src/js/pages/home.js

import {$} from '../utils.js'

export default () => {
  // ここにページ固有の処理を書く
}

参考:ページごとにJSの処理を分割するためのよさそうな方法 - ライデンの新人ブログ

Recipes

UMD対応してないスクリプトの読み込み

webpack.config.jsentry.appにパッケージ名を追加してください。

圧縮に時間のかかる画像のスキップ

src/static/imgに画像ファイルを配置すると、圧縮されずに単にコピーされます。圧縮後の画像ファイルをキャッシュして、毎回のビルド時間を短縮できます。

Deploy to staging

dist/及びvendor_assets/以下のファイルをサーバーへコピーすることで反映できます。

License

MIT

real-world-website-boilerplate's People

Contributors

yuheiy avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.