質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

Q&A

解決済

1回答

2750閲覧

EJSでhtmlを書き出した際に入る、余分な改行を削除したい

hogeniho

総合スコア58

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

0グッド

0クリップ

投稿2019/07/11 06:24

編集2019/07/11 07:17

前提・実現したいこと

EJSをhtmlに書き出すタスクを作成しています。

・余分な余白や改行は削除。ただし、コードの圧縮はしない。
・gulpやNode.jsのバージョンは変更しない。

発生している問題・エラーメッセージ

書き出したhtmlのソースコードの、1行目と最終行に余分な改行が入ってしまうのを消したい。
(<!DOCTYPE html>の前と、</html>の後ろに余分な改行が入ってしまう)

該当のソースコード

gulpfile.js

// gulpプラグインの読み込み const gulp = require('gulp'); const runSequence = require('run-sequence'); // コンパイルするプラグインの読み込み // ejs const htmlhint = require('gulp-htmlhint'); const htmlmin = require('gulp-htmlmin'); const ejs = require('gulp-ejs'); // ファイル名変更 const rename = require('gulp-rename'); // エラー出力 const plumber = require('gulp-plumber'); const notify = require('gulp-notify'); // HTMLタスクを生成する gulp.task('html', function() { // ファイルを取得 return ( gulp.src(['assets/html/**/*.ejs', '!assets/**/_*.ejs']) // コンパイルを実行 .pipe(plumber( {errorHandler: notify.onError('<%= error.message %>')} )) .pipe(ejs()) .pipe(htmlmin( { preserveLineBreaks: true, collapseWhitespace: true, removeComments: true } )) .pipe(htmlhint('.htmlhintrc')) .pipe(htmlhint.reporter()) .pipe(rename({extname: '.html'})) .on('error', function(e){ console.log(e); }) // フォルダ以下に保存 .pipe(gulp.dest('dist/')) ); });

index.ejs

<%# ejsRootは都度変更する %> <% const ejsRoot = ''; %> <% const pageTitle = 'hoge'; const pageDescription = 'hogehoge'; const pageCanonical = 'http://hogehogehogehoge.com/'; %> <!DOCTYPE html> <html lang="ja" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <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"> <title><%- pageTitle %></title> <meta name="Description" content="<%= pageDescription %>"> <meta name="format-detection" content="telephone=no"> <link rel="stylesheet" type="text/css" href="/css/index.css"> <meta property="og:type" content="website"> <meta property="og:locale" content="ja_JP"> <meta property="og:title" content="<%= pageTitle %>"> <meta property="og:description" content="<%= pageDescription %>"> <meta property="og:url" content="<%= pageCanonical %>"> <meta property="og:image" content="/image/ogp.jpg"> </head> <body> <header class="temp-header"> <h1 class="temp-header-lv1">hogehoge Website</h1> </header> <main class="temp-main"> <p>現在リニューアル工事中です。</p> <% const snsLists = [ { alt: 'Facebook', href: 'https://www.facebook.com/hogehoge', }, { alt: 'Instagram', href: 'https://www.instagram.com/hogehoge/', }, { alt: 'Flickr', href: 'https://www.flickr.com/photos/hogehoge/', }, { alt: 'Blogger', href: 'http://hogehoge.blogspot.jp/', } ] %> <ul class="temp-list"> <% snsLists.forEach((v,i) => { %> <li> <a href="<%- v.href %>" target="_blank"> <img src="/image/icon_sns0<%- i+1 %>.svg" alt="<%- v.alt %>"> </a> </li> <% }) %> </ul> </main> <%- include(ejsRoot + '_component/_copyright') %> <%# JS %> <script src="/js/common.js" charset="utf-8"></script> </body> </html>

index.html
(<!DOCTYPE html>の前と、</html>の後ろに余分な改行が入ってしまう)

<!DOCTYPE html> <html lang="ja" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> ・ ・ 中略 ・ ・ </body> </html>

試したこと

<%# ejsRootは都度変更する %> <% const ejsRoot = ''; %> <% const pageTitle = 'hoge'; const pageDescription = 'hogehoge'; const pageCanonical = 'http://hogehogehogehoge.com/'; %>

上記コードを、<head>タグ内に入れると、
一行目の不要な改行は出力されませんでした。

可能であれば、<!DOCTYPE html>より上に記述したいと考えております。

補足情報

Node.js
v8.9.4

gulp
CLI version 3.9.1
Local version 3.9.1

ご教授いただけないでしょうか。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

下記の方法で自己解決しました

gulp-ejs のoptionをつかって、余白の削除とファイル名の変換を設定しました

// HTMLタスクを生成する gulp.task('html', function() { // ファイルを取得 return (gulp.src(['assets/html/**/*.ejs', '!assets/**/_*.ejs'])) // コンパイルを実行 .pipe(plumber( {errorHandler: notify.onError('<%= error.message %>')} )) .pipe(ejs( {}, {rmWhitespace: true}, {ext: '.html'} )) .pipe(htmlhint('.htmlhintrc')) .pipe(htmlhint.reporter()) .on('error', function(e){ console.log(e); }) // フォルダ以下に保存 .pipe(gulp.dest('dist/')) });

そのままでは、{rmWhitespace: true}が作動しなかった為、
gulp-ejs のバージョンを、4.0.0 から 3.1.1に変更した所、
無事に想定している挙動になりました。

投稿2019/07/12 05:58

編集2019/07/12 06:43
hogeniho

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問