SourceMap(ソースマップ)ってなんぞ

gulpを使ってみて、gulp-sourcemapsというモジュールが便利そうだったので調べたことをメモ。そもそもSouceMapとは何か。

ソースマップとは

ブラウザで利用されているJavaScriptはコンパイルされているが、何かエラーが起こった際に、コンパイルされたままだとエラー箇所がよくわからず、不便。そのため、最適化やコンパイルされる前のJavaScriptを保持したソースファイルを作っておくと、後々便利、といったもの。

source map is a file that maps from the transformed source to the original source, enabling the browser to reconstruct the original source and present the reconstructed original in the debugger.
To enable the debugger to work with a source map, you must:
generate the source map
– generate the source map
– include a comment in the transformed file, that points to the source map. The comment’s syntax is like this:
//# sourceMappingURL=http://example.com/path/to/your/sourcemap.map

Use a source map

意訳:
ソースマップはオリジナルファイルから変換されたソースをマップしたファイルで、ブラウザがオリジナルのソースを再構築し、その再構築されたオリジナルをデバッガーに表示できるようにするものだ。
ソースマップでそのデバッガーを有効にするには、ソースマップを生成する必要がある。

  • まず、ソースマップを生成
  • 再構築されたファイル内に、ソースマップを指定するコメントを記述

コメントは以下の形式

//# sourceMappingURL=http://example.com/path/to/your/sourcemap.map

こうなることも想定

//# sourceMappingURL=main.js.map

動画でも解説あり。
https://youtu.be/Fqd15gHC4Pg

In the video above we load https://mdn.github.io/devtools-examples/sourcemaps-in-console/index.html. This page loads a source called “main.js” that was originally written in CoffeeScript and compiled to JavaScript. The compiled source contains a comment like this, that points to a source map:
//# sourceMappingURL=main.js.map
In the Debugger’s source list pane, the original CoffeeScript source now appears as “main.coffee”, and we can debug it just like any other source.

Use a source map

以下も意訳。元記事・動画はFirefoxを使っているが、意訳ではChromeを使用した場合の記載に書き換えている。

例えば、こちらのサンプルページ。
https://mdn.github.io/devtools-examples/sourcemaps-in-console/index.html

検証ツール-> Sources を開き、jsフォルダの中身を見てみよう。
このページでは、もともとCoffeeScriptで書かれ、コンパイルされたmain.jsというJavaScriptを読み込んでいる。このコンパイルされたソースコードには以下のコメントが挿入されており、これがソースマップを指しているのだ。

//# sourceMappingURL=main.js.map

デバッガーのSourcesパネルには、オリジナルのソースであるmain.coffeeが表示されており、まるで別のソースをいじるかのようにして、我々はこのソースをデバッグできるのである。

以上メモおしまい

nodenv,anydenvを使ったNode.jsのアップデート

Nuxt.js 3が出ましたね。

https://v3.nuxtjs.org/getting-started/quick-start

でもnodeバージョンは14.16 か 16.11. 以上でないとダメらしいです。

* If you already have Node.js installed, check with node --version that you are using version 14.16 or above 16.11.

nodenv install --list

で、今入っているバージョンを確認。しかし、nodenvはインストール時に登録されているバージョンしか表示されないそう。

というわけでnodeをバージョンアップします。

以前、node.jsのバージョン切り替え方法を書いたのですが、

[node.js]バージョン切り替え方法

nodenv,anydenvが入っている方は

anyenv update

これでOK!

あとはもう一度インストール済のバージョンを確認いただいて、インストール。

nodenv install --list
nodenv install 18.4.0

バージョンを上げたいプロジェクトディレクトリで切り替えます。

nodenv local 18.4.0 node -v

 

おしまい。

おまけ

18.4.0でnuxt 3動きましたよ!!

npx nuxi init nuxt-app

VSCodeでnuxt-appフォルダをOpenし、dependenciesをインストール。

npm install

devサーバでスタート。

npm run dev -- -o

めちゃめちゃエラー出るやないかい!!

でも起動はする。

めでたしめでた…し?

[node.js]バージョン切り替え方法

node.jsバージョン切り替え方法

npm run dev

(thread_id_key != 0x7777), function find_thread_id_key, file ../src/coroutine.cc, line 134

複数のプロジェクトを扱うようになると、プロジェクトごとにnode.jsのバージョンを切り替えなければならないシーンが出てきます。上記のエラーは、現在使用しているnode.jsのバージョンが合わなかった際に出てきたエラー。

別のプロジェクトのブランチを切ってきて、npm run devした時のものです。

いろいろ調べてみて、nodeのバージョンを落としたりfiber取り除いたりしてみたのですが解決せず…。

結局、上司に泣きついて解決した作業工程をまとめておきます。

※当方Max OS 11.2.3使用

問題はnode.jsのバージョンにあった!

結論から言うと、今回の問題はプロジェクトにマッチしないnode.jsを使用していることがエラーの原因でした。というわけで、パッケージマネジャを使用し、プロジェクトにマッチしたnode.jsに切り替えます。

node.jsのバージョン管理には、nodebrewを使用する方法や、nodenvを使用する方法など、いろいろあります。

プロジェクトによって使用しているパッケージのバージョンは異なるため、それに合わせたnode.jsを使用する際、こうしたパッケージマネジャを使えば簡単にnode.jsのバージョンが切り替えられるというわけです。

今回は、nodenvを使用してnode.jsのバージョンを切り替える方法を記載します。

nodenv,anydenvが入っていることを前提として書き進めます。双方のインストール方法はこちらから

MacにNode.jsをインストール(anyenv + nodenv編) – Qiita

nodenvを使用してnode.jsのバージョンを切り替える

node.jsのバージョン確認は、 node -vでできます。

@MeowBook nks-frontend % node -v
v15.14.0

つづいて nodenvででコマンドを確認。

@MeowBook nks-frontend % nodenv
nodenv 1.4.0+3.631d0b6
Usage: nodenv <command> [<args>]

Some useful nodenv commands are:
   commands    List all available nodenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
   install     Install a Node version using node-build
   uninstall   Uninstall a specific Node version
   rehash      Rehash nodenv shims (run this after installing executables)
   version     Show the current Node version and its origin
   versions    List installed Node versions
   which       Display the full path to an executable
   whence      List all Node versions that contain the given executable

See `nodenv help <command>' for information on a specific command.
For full documentation, see: <https://github.com/nodenv/nodenv#readme>

nodenv versions で既にインストール済みのバージョンを確認。

@MeowBook nks-frontend % nodenv versions
  system
* 15.14.0 (set by /Users/xxx/Documents/xxx-frontend/.node-version)
  16.0.0
  16.2.0

つづいてnodenv install --list で、node.jsインストール時に登録されたバージョンを確認します。

@MeowBook nks-frontend % nodenv install --list
0.1.14
0.1.15
0.1.16
0.1.17
0.1.18

中略

15.13.0
15.14.0
16.0.0
16.1.0
16.2.0
chakracore-dev
chakracore-nightly
chakracore-8.1.2

中略

この時点で任意のバージョンが表示されていなければ`anyenv update `でリストをアプデし、再度`nodenv install --list `で任意バージョンがインストールされていることを確認。

anyenvについてはこちら。

nodenv,anydenvを使ったNode.jsのアップデート

任意のバージョンが表示されていることを確認したら、

nodenv install 16.1.0 のようにバージョンを指定し、node.jsをインストールします。

@MeowBook xxx-frontend % nodenv install 16.1.0 
Downloading node-v16.1.0-darwin-arm64.tar.gz...
-> <https://nodejs.org/dist/v16.1.0/node-v16.1.0-darwin-arm64.tar.gz>
Installing node-v16.1.0-darwin-arm64...
Installed node-v16.1.0-darwin-arm64 to /Users/xxx/.anyenv/envs/nodenv/versions/16.1.0

nodenv local 16.1.0 カレントディレクトリで適用したいバージョンを指定し、設定したら、最後にnode -v できちんと設定できているか確認。

@MeowBook xxx-frontend % nodenv local 16.1.0  
@MeowBook xxx-frontend % node -v              
v16.1.0

npm install で消したnode_modulesを再ダウンロードし、npm dev runでページが見られるか確認しましょう。

補足:vueとvue-template-compilerのバージョンが合わないよ!と言うエラーが出ることがあります。

その際は、package.jsonのdependenciesオブジェクト内のバージョン部分を変更し、古い方のバージョンを新しいバージョンの数値に合わせましょう。

"dependencies": {
  "@nuxtjs/axios": "^5.3.6",
  "@nuxtjs/device": "^1.2.7",
  "@nuxtjs/markdownit": "^1.2.9",
  "@nuxtjs/pwa": "^3.0.0-0",
  "axios": "^0.19.0",
  "chart.js": "^2.8.0",
  "chartjs-plugin-annotation": "^0.5.7",
  "chartjs-plugin-datalabels": "^1.0.0"
  , "cookie-universal-nuxt": "^2.0.18",
  "cookieparser": "^0.1.0",
  "crypto-js": "^4.0.0",
  "flatpickr": "^4.6.3",
  "js-cookie": "^2.2.1",
  "markdown-it-toc": "^1.1.0",
  "nuxt": "^2.0.0",
  "tabulator-tables": "^4.4.3",
  "vanilla-autokana": "^1.1.6",
  "vue": "^2.6.14", // ここか
  "vue-chartjs": "^3.4.2",
  "vue-flatpickr-component": "^8.1.4",
  "vue-server-renderer": "^2.6.14",
  "vue-template-compiler": "^2.6.14", // ここ
  "vuetify": "^2.2.11",
  "vuex-persistedstate": "^2.5.4",
  "vuex-shared-mutations": "^1.0.2"
},

おしまい