• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

manabuyasuda/equip: Gulp, EJS, Sass(ECSS), Aigis, iconfont

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称(OpenSource Name):

manabuyasuda/equip

开源软件地址(OpenSource Url):

https://github.com/manabuyasuda/equip

开源编程语言(OpenSource Language):

CSS 76.6%

开源软件介绍(OpenSource Introduction):

equip - Make efficient site

静的サイトを効率良く作るためのテンプレートです。以下のような特徴があります。

  • EJSでヘッダーなどの共通部分のテンプレート化、JSONを利用したデータの管理
  • FLOCSSをベースにしたSassのディレクトリ、レイアウト用コンポーネント、メディアクエリなどの@mixin
  • CSSや画像などのminifyと圧縮
  • アイコンフォントと専用のscssファイルの生成
  • Browsersyncを利用したライブリロード
  • Hologramを利用したスタイルガイドの生成

コーディングルールは以下のリンクをベースにします。

始め方とGulpタスク

npmでパッケージをインストールします。

npm install

開発に使用するGulpタスクは2つあります。

gulp
gulp release
  1. gulp(EJSとSassのコンパイル、jsの結合や画像の出力、アイコンフォントの生成、browser-syncによるライブリロード)
  2. gulp releasegulpタスクに画像とCSSの圧縮を追加。)

いずれもcleanタスクでreleaseディレクトリがあればいったん削除されます。

EJS

develop/index.ejsがトップページになります。develop/_partialsディレクトリ内にグローバルに使用するテンプレートを保存します。

新規案件でルートディレクトリに制作していくことを想定していますが、そうではない場合でも使えるように基本的に相対パスで記述します。ただし、グローバルナビゲーションで使い回しができるようにすると複雑になってしまうため、必要最低限であればルート相対パスで記述することもできます。

site.json

develop/assets/data/site.jsonにサイト共通の値が指定されています。サイトの名前やOGPの指定などがありますので、最初に確認をして、変更してください。site.jsonの値はsite.nameのように呼び出すことができます。

変数名 説明
site.name サイトの名前を記述します。(title要素に使用されます)
site.description サイトの簡単な説明を記述します。(meta要素内のname属性に使用されます)
site.keywords サイトのキーワードを記述します。(meta要素内のname属性に使用されます)
site.author その文書の作者名(そのサイトの運営者・運営社)を記述します。※省略可能(meta要素内のname属性に使用されます)
site.rootUrl そのサイトの絶対パス(httpで始まりドメイン名+/で終わる)を記述します。(OGPのog:urlに使用されます)
site.css assetsディレクトリで読み込むCSSファイルの拡張子を記述します。gulp releaseタスクを実行すると、minify(圧縮)したCSSファイルが生成されます。名前は~.min.cssになります、minifyしたCSSファイルを読み込む場合は.min.cssと記述します。
site.ogpImage シェアされたときのサムネイル画像を絶対パスで記述します。(OGPのog:imageで使用されます)
site.facebookAdmins Facebook insightsのデータの閲覧権限を与える個人のFacebookアカウントID(カンマで区切ると複数人に権限を与えられる)を記述します。site.facebookAppIdsite.facebookAdminsのどちらかを記述します。(OGPのfb:adminsに使用されます)※省略可能
site.facebookAppId Facebook insightsのデータの閲覧権限を与えるアプリ(サイト)のIDを記述します。site.facebookAdminssite.facebookAppIdのどちらかを記述します。(OGPのfb:app_idに使用されます)※省略可能
site.twitterCard Twitterでツイートされたときのスタイルを指定します。(OGPのtwitter:cardで使用されます)
site.twitterSite Twitterでツイートされたときに表示するTwitterアカウントを@をつけて記述します。※省略可能(OGPのtwitter:siteで使用されます)
site.favicon ファビコンに使用する画像を絶対パスで記述します。.ico形式に変換した16px×16pxと32px×32pxのマルチアイコンにするのが良いようです。※省略可能(shortcut iconに使用されます)
site.appleIcon iPhoneでホーム画面に追加したときに使用される画像(ホームアイコン)を絶対パスで記述します。iPhone 6 Plusで180px、iPhone 6と5で120pxが適合するサイズです。※省略可能(apple-touch-iconで使用されます)
site.appTitle ホームアイコンを保存するときのタイトルの初期値を記述します。※省略可能日本語は6文字以内、英語は13文字以内にすると省略されないようです。(apple-mobile-web-app-titleに使用されます)
site.analyticsId Google AnalyticsのトラッキングIDを記述します。
site.developDir 開発用ディレクトリ名を記述します。ファイルのルートパスを取得するのに使用されます。例えばdevelop/page1が開発用のルートディレクトリになるのであれば"develop/page1/"と変更します。
{
  "name": "サイトのタイトル",
  "description": "サイトの概要",
  "keywords": "サイトのキーワード1, サイトのキーワード2",
  "author": "",
  "rootUrl": "http://example.com/",
  "css": ".css",
  "ogpImage": "http://example.com/images/og-image.jpg",
  "facebookAdmins": "",
  "facebookAppId": "",
  "twitterCard": "summary",
  "twitterSite": "@",
  "favicon": "",
  "appleIcon": "",
  "appTitle": "",
  "analyticsId": "",
  "developDir": "develop/"
}

また、develop/assets/dataディレクトリにはsample.jsonファイルが入っています。記事内で記事一覧やニュースなどをループで、処理をしたい場合に使用します。

[
  {
      "title": "title1",
      "description": "description1"
  },
  {
      "title": "title2",
      "description": "description2"
  }
]

jsonファイルを追加する場合はgulpfile.jsにも追加する必要があります。develop.dataでdataディレクトリへのパスを取得できます。

.pipe(ejs({
  site: JSON.parse(fs.readFileSync(develop.data + 'site.json')),
  sample: JSON.parse(fs.readFileSync(develop.data + 'sample.json')),
  sample2: JSON.parse(fs.readFileSync(develop.data + 'sample2.json'))
},

ejsファイルではforEach()を使用してデータを取得し、ループを回します。

<% sample.forEach(function(data){ %>
  <article class="article">
    <h2><%= data.title %></h2>
    <p><%= data.description %></p>
  </article>
<% }); %>

このように出力されます。

<article class="article">
  <h2>title1</h2>
  <p>description1</p>
</article>

<article class="article">
  <h2>title2</h2>
  <p>description2</p>
</article>

index.ejs

index.ejsには変更が必要なものや変更ができるものについての変数が定義されているので、ページごとに変更することができます。変数はindex.ejsとインクルードしている_head.ejsや_footer.ejsなどでpage.titleのように呼び出すことができます。

変数名 説明
page.title そのページの名前を記述します。空にするとサイトタイトルだけ、記述するとサイトタイトルと一緒に出力されます。
page.desctiption そのページの説明を記述します。
page.keywords そのページのキーワードを記述します。"ページのキーワード1, ページのキーワード2"のようにクウォーテーション内でカンマ区切りで指定します。
page.bodyClass body要素にclassを指定できます。
page.singleCss ページ専用のcssファイルを作成したい場合に指定します。["../common/css/category.css", "css/single.css"]のように配列でパスを渡します。
page.singleJs ページ専用のjsファイルを作成したい場合に指定します。["../common/js/category.js", "js/single.js"]のように配列でパスを渡します。
page.ogpType OGPで使用されていて、トップページはwebsite、それ以外の記事はarticleを指定します。
page.ogpImage OGPで使用されていて、サイト共通であればsite.ogpImageを指定、個別に設定したい場合は'http://example.com/images/og-image.jpg'のように絶対パスで指定します。
page.absolutePath ファイルごとの/を含まないルートパスを格納しています。metaタグの絶対パスで使用されています。
page.relativePath ファイルごとの相対パスを格納しています。
<%
var absolutePath = filename.split(site.developDir)[filename.split(site.developDir).length -1].replace('.ejs','.html');
var relativePath = '../'.repeat([absolutePath.split('/').length -1]);
var page = {
  title: "",
  description: site.description,
  keywords: "",
  bodyClass: "",
  singleCss: [],
  singleJs: [],
  ogpType: "website",
  ogpImage: site.ogpImage,
  absolutePath: absolutePath,
  relativePath: relativePath
};
-%>
<%- include(page.relativePath + '_partials/_head', {page: page, modifier: ''}); %>
<%- include(page.relativePath + '_partials/_header', {page: page, modifier: ''}); %>
    <article>contents</article>

<%- include(page.relativePath + '_partials/_footer', {page: page, modifier: ''}); %>

include()の第一引数はすべてのindex.ejs共通です。第二引数の1つ目のpage: page,は各index.ejsの変数(page)をインクルードするファイルに渡しています。2つ目のmodifier: ''はインクルードするファイルにclass属性を付け加えたい場合に指定します。例えば_header.ejsのインクルードでmodifier: ' header--fixed'と渡した場合(スペースが入っていることに注意)、以下のように出力されます。

<header class="header header--fixed">

ルートディレクトリのindex.html以外にファイルを作成したり場合は_sample.ejsをコピーして使いまわします。sample.ejsのようにアンダースコアを外すとHTMLとして出力されるようになります。

下層ページのejsファイルはdevelop/page1ディレクトリをコピーして使いまわします。変数は下記のように変更して使います。

<%
var absolutePath = filename.split(site.developDir)[filename.split(site.developDir).length -1].replace('.ejs','.html');
var relativePath = '../'.repeat([absolutePath.split('/').length -1]);
var page = {
  title: "ページのタイトル",
  description: "ページの概要",
  keywords: "",
  bodyClass: "",
  singleCss: [],
  singleJs: [],
  ogpType: "article",
  ogpImage: site.ogpImage,
  absolutePath: absolutePath,
  relativePath: relativePath
};
-%>
<%- include(page.relativePath + '_partials/_head', {page: page, modifier: ''}); %>
<%- include(page.relativePath + '_partials/_header', {page: page, modifier: ''}); %>
<%- include('_partials/_breadcrumb', {page: page, pageTitle: page.title, modifier: ''}); %>
    <article>contents</article>

<%- include(page.relativePath + '_partials/_footer', {page: page, modifier: ''}); %>

ルーディレクトリのindex.ejsファイル以外はパンくずリストをインクルードします。デフォルトではpageTitle: page.titleのようにファイルのタイトルがパンくずリストのタイトルになるようになっています。

変更する場合はpageTitle: '任意のタイトル'のようにします。

_head.ejs

develop/_partials/_head.ejsには共通で使用するメタタグなどが定義されています。基本的に変更する必要はなく、site.jsonやindex.ejsの設定によって要素を削除したりしています。

<% if (typeof modifier === undefined) { var modifier = ''; } -%>
<!DOCTYPE html>
<html lang="ja">
  <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# <%= page.ogpType %>: http://ogp.me/ns/<%= page.ogpType %>#">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <% if(page.title) { %><title><%= page.title %> | <%= site.name %></title><% } else { %><title><%= site.name %></title><% } %>
    <meta name="description" content="<%= page.description %>"><% if(page.keywords) { %>
    <meta name="keywords" content="<%= page.keywords %>"><% } %><% if(site.author) { %>
    <meta name="author" content="<%= site.author %>"><% } %>

    <link rel="stylesheet" href="<%= page.relativePath %>assets/css/common<%= site.css %>"><% if(page.singleCss) { %><% page.singleCss.forEach(function(data) { %>
    <link rel="stylesheet" href="<%= data %>"><% }); %><% } %>

    <meta name="format-detection" content="telephone=no"><% if(site.favicon) { %>
    <link rel="shortcut icon" href="<%= site.favicon %>"><% } %><% if(site.appleIcon) { %>
    <link rel="apple-touch-icon" sizes="180x180" href="<%= site.appleIcon %>"><% } %><% if(site.appTitle) { %>
    <meta name="apple-mobile-web-app-title" content="<%= site.appTitle %>"><% } %>

    <!-- OGP -->
    <meta property="og:title" content="<% if(page.title) { %><%= page.title %> | <%= site.name %><% } else { %><%= site.name %><% } %>">
    <meta property="og:type" content="<%= page.ogpType %>">
    <meta property="og:image" content="<%= page.ogpImage %>">
    <meta property="og:url" content="<%= site.rootUrl %><%= page.absolutePath %>">
    <meta property="og:description" content="<%= page.description %>">
    <meta property="og:site_name" content="<%= site.name %>">
    <meta property="og:locale" content="ja">
    <% if(site.facebookAppId) { %><meta property="fb:app_id" content="<%= site.facebookAppId %>"><% } else if(site.facebookAdmins) { %><meta property="fb:admins" content="<%= site.facebookAdmins -%>"><% } %>
    <meta name="twitter:card" content="<%= site.twitterCard %>"><% if(site.twitterSite) { %>
    <meta name="twitter:site" content="<%= site.twitterSite %>"><% } %>
    <!-- / OGP -->

  </head>
  <% if(page.bodyClass) { %><body class="<%= page.bodyClass %><%= modifier %>"><% } else { %><body><% } %>

_header.ejs

vedelop/_partials/_header.ejsには共通で使用するメインナビゲーションが定義されています。グローバルナビゲーションは条件分岐が多く複雑になってしまうため、ルート相対パスで指定をします。

<% if (typeof modifier === undefined) { var modifier = ''; } -%>
    <header class="header<%= modifier %>">
      <h1><a href="/"><%= site.name %></a></h1>

      <nav>
        <ul  
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap