黄色のSourceMapのコンソールエラー - コンパイルについても

今回のエラーはChromeデベロッパーツールのコンソールエラーを調べていて気になったもののうちの1つです。
(もう一つはCookieのエラーです)

 DevTools failed to load SourceMap: Could not load content for (Chromeの拡張機能のjsのソースマップ): HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME

似たエラーで

DevTools failed to load SourceMap: ...

というのも見掛けました。

Chrome拡張機能のjsのソースマップファイルが読み込めない(load)か、解析できない(parse)の違いです。
(load → parseの順で処理されます)

js.mapcss.map という、map拡張子の「ソースマップ」に遭遇することは今までなかったので、せっかくなので調べました。

SourceMap(ソースマップ)とは

コンパイル前後のjsやcssファイルを紐付けるファイルです。
ソースマップファイルがあるとデバックのときにコンパイル前の、元のファイルをたどることができて便利です。

ソースマップファイルはコンパイル時に作られることもあるそうです(後述)。

ソースマップファイルの中身

Tools for Web Developers の記事からソースを拝借しました。

styles.scss

%$textSize: 26px;
$fontColor: red;
$bgColor: whitesmoke;
h2 {
    font-size: $textSize;
    color: $fontColor;
    background: $bgColor;
}

(最初の% 何でしょうか...?)

コンパイルされたcss
styles.css

h2 {
  font-size: 26px;
  color: red;
  background-color: whitesmoke;
}
/*# sourceMappingURL=styles.css.map */ 

# sourceMappingURL=styles.css.mapsourceMappingURL アノテーション といいます。
ソースマップファイルの位置を示します。
コンパイル時にアノテーションが付きます。

続いてソースマップファイル。
中身はJSON形式で書かれています。

styles.css.map

{
  "version": "3",
  "mappings":"AAKA,EAAG;EACC,SAAS,EANF,IAAI;EAOX,KAAK"
  "sources": ["sass/styles.scss"],
  "file": "styles.css"
}

version:ソースマップの仕様のバージョン
mappingsマッピング情報
sourcesコンパイル元のファイル。複数入ることもあります
fileコンパイルによる生成ファイル
他には
names:コードに出てくる変数名、関数名(←要確認)

もっと色々あるようです。

mappingsの値については、Base64というものを使っているそうですが、難しそうです。

Safx: JavaScriptのSource Mapの内部表現について

エラーの解消方法

肝心の、どうエラーを解決するかですが、

  • ソースマップを使わない → cssファイルに書かれている sourceMappingURL アノテーションを削除する
  • ソースマップを使わない → sourceMappingURL アノテーション通りにソースマップファイルを配置、さらにscssやlessファイルを配置する

のどちらかです。

ソースマップの使い方

ソースマップファイルを使おうとすると、サーバーにmapファイルだけではなく、コンパイル前のscss、lessファイルも置かなくてはならないのでしょうか。
しかし、デバックすることが目的なので、サイト管理者のローカル環境にファイルが置いてあってもソースマップを利用することができるようです。

Source Map に関する情報 – ラボラジアン

ソースマップファイルの作り方(コンパイルの方法)

便利なソースマップ。作り方にはいくつか方法があります。
ここではscss、lessファイルからcssファイルをコンパイルする場合を調べました。

SassとLESS

まずこの2つの言語をさらっと調べました。
その前にどちらもCSSメタ言語プリプロセッサです。
(単語がどういう意味なのかはおいおい)

Sass・・・「Syntactically Awesome StyleSheet」。Rubyで実装されているオープンソースソフトウェア
LESS・・・「Leaner CSS」。JavaScriptで実装されているオープンソースソフトウェア。

パターン1:Sass、Lessをインストールして実行する

コマンドラインでインストールします。

Sassの場合

Sassはその前にRubyをインストールする必要があります。
その他にもgemやbundler、compassをインストールすると便利とのことですが、ちょっと...Rubyをやることがあればまた勉強しようと思います。

sassをインストール

gem install sass

scssファイルのコンパイル

sass style.scss:style.css

これでコンパイルとともにソースマップファイルも作られます。

CSSのメタ言語Sass(SCSS)、LESSの完全入門 - Qiita

☆Nodeでもsassのモジュールがあるみたいです。

LESSの場合

一方でLESSは事前にnode.jsをインストールする必要があります。

lessをインストール

npm install -g less

lessファイルのコンパイル

lessc styles.less > styles.css

同じくコンパイルとともにソースマップファイルも作られるはずです。

lessとはNodeでいう「モジュール」ですね。イコール「オープンソースソフトウェア」のことだと解釈しました。(Rubyではsassなどを「gem」というっぽい)

Nodeを使う場合は、タスクランナーであるgulpなどを使うと、他の処理と合わせてコンパイルできて便利です。

LESSでCSSを簡単に!LESSの使い方と便利な機能 - Qiita

パターン2:(LESSのみ)クライアント側でコンパイラを使う

lessファイルを読み込んだ後でless.jsというコンパイラを読み込みます。

<link rel="stylesheet/less" type="text/css" href="styles.less">
<script src="less.js" type="text/javascript"></script>

less.jsはダウンロードして使う方法もあればCDNでもあります。

第1回 LESSのメリットと導入方法:LESSで3倍ラクするスマートフォンコーディング|gihyo.jp … 技術評論社

ただこの方法だとソースマップファイルが作られるのか分かりませんでした...。

パターン3:GUIツールを利用する

GUIコンパイラと呼ばれるツールです。WindowsでSassをコンパイルしたいときにも、GUIコンパイラを使えばRubyをインストールすることなくできます。
「Prepros」、「koala」が有名なGUIコンパイラです。

コンパイルの設定でソースマップファイルを作ることができます。

パターン4:エディタの拡張機能を使う

VSCodeでは「Easy Sass」、「Easy LESS」といったものが検索で出てきました。
ファイルを保存するとコンパイル処理が走る、といった感じらしいです。

こちらもオプションでソースマップファイルが作れそうです。
(要確認)

やっぱりコンパイルが気になる

ここまでコンパイルコンパイル書いていると疑問がふつふつと再燃してきました。
ソースマップから完全に脱線しています。

☆別で記事にしました!こちら。

実はソースマップで一番知りたかったことは、importしたscssファイルまでソースマップでたどることができるのか、なのですが、また今度確認してみます。

その他の参考

ソースマップについてコンソールに警告(DevTools failed to parse SourceMap)【Chromeデベロッパーツール】 | まろりか

ソースマップの自作は割とコワくない。 - Qiita