tag:crieit.net,2005:https://crieit.net/tags/target%3D'_blank'/feed 「target='_blank'」の記事 - Crieit Crieitでタグ「target='_blank'」に投稿された最近の記事 2019-05-24T11:36:04+09:00 https://crieit.net/tags/target%3D'_blank'/feed tag:crieit.net,2005:PublicArticle/15016 2019-05-23T19:07:05+09:00 2019-05-24T11:36:04+09:00 https://crieit.net/posts/vuepress-Navbar VuePress で Navbar のリンクが別タブで開かれないようにするためにデフォルト・テーマをちょっといじる <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>ウェブアプリのドキュメントを、これまで GitBook でつくっていたのですが VuePress に乗り換えようとしています<br /> <a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/guide/">Guide</a> にあるみたいに既存のアプリケーションに docs フォルダをつくってそこで作業をするようにするとアプリケーションのコードとドキュメントが一体で管理できて嬉しいです</p> <p>アプリケーションとドキュメントのナビゲーションに相互に行き来できるようリンクを用意します</p> <p>あれ?ドキュメントからアプリに<strong>素直に戻ってくれない</strong>で、わざわざ<strong>別タブでアプリを開き直してくれてる</strong>、これはちょっと...</p> <h1 id="試してみてダメだったこと"><a href="#%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%A6%E3%83%80%E3%83%A1%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">試してみてダメだったこと</a></h1> <p>Config Reference 見てたら <a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/config/#markdown-externallinks">markdown.externalLinks</a> って section があって、デフォルトは <strong>{ target: '_blank', rel: 'noopener noreferrer' }</strong> なんだそうです<br /> これが原因だなとおもって config.js で</p> <pre><code class="js:">markdown: { externalLinks: { } } </code></pre> <p>ってかんじに <strong>target: '_blank'</strong> その他諸々をまるまる消してみたのですがダメでした<br /> 名前の通り、これは markdown に対する設定みたい</p> <h1 id="default theme に手を入れる"><a href="#default+theme+%E3%81%AB%E6%89%8B%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B">default theme に手を入れる</a></h1> <p>Nav の link に対する設定はないかな?と思って Config Reference を穴が開くほど見るのですがめぼしいものがみつかりません<br /> ないのならテーマに手を入れて nav の link に target='_blank' つけるのを止めるしかなさそうです</p> <p><strong>昨日今日 vuepress を触りはじめたばかりのニワカ者</strong> にそんな事がかんたんに出来るものなのかという妥当な不安を感じますが、実はその心配は杞憂だったということをこの後の作業を通じて大観します</p> <h2 id="theme の eject"><a href="#theme+%E3%81%AE+eject">theme の eject</a></h2> <p>手を入れるために、まず以下のコマンドで default theme の定義ファイルを docs/theme の下に吐き出させます</p> <pre><code class="bash:">vuepress eject docs </code></pre> <p>なお、ゴチャゴチャやってるうちに <strong>vuepress なんてコマンドありません</strong> とか言われてしまうようなややこしい環境になってしまってたら、package.json に vuepress の build コマンドを追加したのと同じ要領で eject コマンドを追加しておいて</p> <pre><code> "scripts": { "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs", "docs:eject": "vuepress eject docs" }, </code></pre> <p><code>npm run docs:eject</code> で実行するのもいいかもしれません、環境をさっさと修復すべきなのかもしれませんが</p> <h2 id="NavLink.vue の変更"><a href="#NavLink.vue+%E3%81%AE%E5%A4%89%E6%9B%B4">NavLink.vue の変更</a></h2> <p>theme の下にできたファイルを見ていると <strong>NavLink.vue</strong> なんていうそれっぽい名前のファイルがあったので見てみると</p> <pre><code>template> class="nav-link" :to="link" v-if="!isExternal(link)" :exact="exact" ><span>{</span><span>{</span> item.text <span>}</span><span>}</span> v-else :href="link" class="nav-link external" :target="isMailto(link) || isTel(link)? null : '_blank'" :rel="isMailto(link) || isTel(link) ? null : 'noopener noreferrer'" > </code></pre> <p>みるからにコレですね ^^;</p> <p>手の入れ方は以下の3通りが考えられます</p> <ul> <li>:target を無条件に null にする</li> <li>:target を null にする条件に <strong>isExternal(link)</strong> を追加する</li> <li>:target を null にする条件に <strong>isAppTop(link)</strong> というのを新たにつくって追加し、アプリケーションに戻るパスだけ null にする</li> </ul> <p>このどれでもうまくいく(実際にうまくいきました、戻るリンクに target='_blank' はつかなくなりました)のですが、最初のはちょっと気がさしますよね<br /> 2番めのはまだマシかと思いきや、実は <strong>isExternal</strong> の定義って util/index.js にあって</p> <pre><code>export const outboundRE = /^(https?:|mailto:|tel:)/ export function isExternal (path) { return outboundRE.test(path) } </code></pre> <p>なので、2番めのロジックって実は最初のと全く同じになってしまうという ^^;;;</p> <p>3番めのロジックは NavLink.vue の methods に</p> <pre><code> isAppTop: function (path){ return /^https?:\/\/pokectiveness2.netlify.com\//.test(path) } </code></pre> <p>みたいに(直書きでカッコ悪いですが ^^;;;)チェックを追加して、前述の template に追加します</p> <pre><code> :target="isMailto(link) || isTel(link) || isAppTop(link) ? null : '_blank'" </code></pre> <h1 id="感想"><a href="#%E6%84%9F%E6%83%B3">感想</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/guide/#why-not">なぜ GItBook じゃなくて VuePress なのか</a>にも <strong>'and the theming system is, again, not Vue based'</strong> ってありましたけど、最初に読んだときは「だからなんなんだ ^^;;;」って心でツッコミいれながら読んでたんですけども、実際に自分で体験してみると<strong>テーマの定義が Vue で読める</strong>のって<strong>予想以上に嬉しい</strong>ですね、ドキュメントとかなくてもコンポーネント見てると自然にわかってくる感じがとても気持ちいいです</p> <p>それはそうとなんで vuepress は外部へのリンクをタブで開かせたがるんだろ?</p> Dr. Takeyuki Ueda