今回達成すること
markdown-it
のデフォルトの挙動は、外部リンクを新規タブで開きません。
そこでmarkdown-it
に外部リンクを新規タブで開く、markdown-it-link-attributes
プラグインを追加します。
Contentfulの記事に内部リンクを追加する
事前にContentfulのマークダウン記事に内部リンクを用意しましょう。
パスはご自身の内部リンクに書き換えてください。
[内部リンクが別タブで開かないかテスト](/posts/main-category-01/demo-blog-10)
Nuxtに記事へのリンクを用意する
Nuxtのトップページにマークダウン記事リンクを設置します。
pagea/index.vue
<template>
<div>
<v-container>
<!-- 追加 -->
<v-card-title
class="font-weight-bold"
>
<nuxt-link
to="/posts/main-category-01/markdown-test"
>
@nuxtjs/markdownit test
</nuxt-link>
</v-card-title>
...
</template>
マークダウン記事に遷移するリンクが用意できました。
リンクを操作するプラグインを追加する
リンクを操作するmarkdown-it
のプラグインはmarkdown-it-link-attributes
を使用します。
下記コマンドでインストールします。
% yarn add markdown-it-link-attributes
markdown-itへプラグインを追加する方法
markdown-it
へのプラグインの追加とセットアップは
markdown.use
プロパティ内に配列を追加し、
- 1つ目の値にプラグイン名
- 2つ目の値にプラグインのオプション
を渡すことで追加とセットアップを行います。
nuxt.config.js
markdown: {
use: [
[
'プラグイン名',
{ 'オプション': ... }
]
]
}
markdown-it-link-attributesのセットアップ
markdown-it-link-attributes
のセットアップを行います。
use
プロパティに以下を追加してください。
nuxt.config.js
markdownit: {
...
use: [
/*
<a>タグの操作
Doc: https://github.com/crookedneighbor/markdown-it-link-attributes
*/
['markdown-it-link-attributes', {
// matcher: trueを返すリンクにattrsオプションを付与する
matcher (href, _config) {
// '/'から始まらないリンク(外部リンク)にtrueを返す
return /^(?!\/)/.test(href)
},
attrs: {
// markdownリンクにclassを付与する
// class: 'my-class',
target: '_blank',
rel: 'noreferrer'
}
}]
]
},
markdown-it-link-attributesのmatcher()オプション
matcher()
でtrue
を返した場合、attrs
で指定したプロパティが<a>
タグに付与されます。
-
matcher()
-
第一引数
href
...<a>
タグのhref
プロパティの値が返る。 -
第二引数
config
... オプションオブジェクトが格納されている。
-
config
の実態はこんな感じです。
config {
matcher: [Function: matcher],
attrs: {
target: '_blank',
rel: 'noreferrer'
}
}
/^(?!/)/.test(href)の意味
外部リンクのhref
の値は必ずhttp
から始まり、内部リンクは/
で始まります。
正規表現の否定的先読みを使用し、外部リンクの場合にtrue
を返しています。
否定的先読みとは
?! で始まる正規表現を括弧 () で括ることにより、指定した文字列を含まないという条件(否定的先読み)でマッチングを行うことができます。
今回のコードは以下の意味を持ちます。
/^(?!\/)/.test(href)
^
... 先頭の文字列が(?!\/)
.../
から始まらないtest(href)
...href
の値にtrue
を返す
matcher
内でログをとると、ターミナルに以下のログが出力されます。
// nuxt.config.js
matcher (href, _config) {
console.log(href, /^(?!\/)/.test(href))
}
// terminal
/posts/main-category-01/demo-blog-10 false
https://nodeca.github.io/pica/demo/ true
https://github.com/nodeca/babelfish/ true
http://dev.nodeca.com true
http://nodeca.github.io/pica/demo/ true
https://www.npmjs.org/browse/keyword/markdown-it-plugin true
https://github.com/markdown-it/markdown-it-emoji true
...
これで外部リンクを別タブで開く設定は完了です。
ブラウザでaタグを確認しよう
マークダウン記事に移動して、外部リンクにのみtarget
とref
プロパティが付与されているか確認してください。
対して内部リンクにはプロパティが追加されていません。
今回の作業は以上です。
% git commit -am "Add markdown-it link-attributes plugin"
まとめと次回
今回は外部リンクを新規タブで開くために、markdown-it
にプラグインを追加しました。
現状、内部リンクの<a>
タグはページがリロードされます。
次回はこの挙動を<nuxt-link>
と同じ挙動にし、高速にページ遷移を行う実装を行います。