tag:crieit.net,2005:https://crieit.net/tags/medium/feed 「medium」の記事 - Crieit Crieitでタグ「medium」に投稿された最近の記事 2019-07-22T22:52:26+09:00 https://crieit.net/tags/medium/feed tag:crieit.net,2005:PublicArticle/15210 2019-07-07T00:13:01+09:00 2019-07-22T22:52:26+09:00 https://crieit.net/posts/next-js-medium-css next.jsさわってみた/medium.css使ってみた <h1 id="使ってみた技術"><a href="#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E6%8A%80%E8%A1%93">使ってみた技術</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://nextjs.org/">next.js</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/lucagez/medium.css/">medium.css</a> - medium風にするCSSライブラリ</li> <li>Noto Sans Japanese - フォント。</li> <li>Netlify - フロントエンドのプラットフォームdeployサービス。</li> <li>markdown</li> <li>remark.js - markdownを扱うライブラリ。</li> <li>react.js</li> </ul> <h2 id="next.js"><a href="#next.js">next.js</a></h2> <p>next.jsはReactを使ってstaticなサイトを作るフレームワークです。<br /> - <code>pages</code>配下にjsファイルを作成すると、ファイルシステムがそのままAPIになります。<br /> - <code>static</code>配下は画像などのstaticなファイルを置くときに使います。</p> <h2 id="next.jsの採用をやめた理由"><a href="#next.js%E3%81%AE%E6%8E%A1%E7%94%A8%E3%82%92%E3%82%84%E3%82%81%E3%81%9F%E7%90%86%E7%94%B1">next.jsの採用をやめた理由</a></h2> <p><code>/article/:name</code>などを使ってpath paramで記事の内容を書いたmdファイルを指定しようとした。<br /> - next.jsはpath paramに対応するのにバックエンドでexpressサーバを立ち上げる必要があった。</p> <p>→じゃあreact-routerに戻ろう</p> <h2 id="改めて使っている技術"><a href="#%E6%94%B9%E3%82%81%E3%81%A6%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">改めて使っている技術</a></h2> <p>next.jsをやめてreact.js(CreateReactApp)で作り直しました。<br /> - react.js<br /> - <a target="_blank" rel="nofollow noopener" href="https://github.com/lucagez/medium.css/">medium.css</a> - medium風にするCSSライブラリ<br /> - Noto Sans Japanese - フォント。<br /> - Netlify - フロントエンドのプラットフォームdeployサービス。<br /> - markdown<br /> - remark.js - markdownを扱うライブラリ。<br /> - react-highlight</p> <h2 id="データについて"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">データについて</a></h2> <p>今回DBは使っていません。<br /> jsonに全体のマスタデータを記述しています。</p> <pre><code class="json">{ "articles":[ { "title": "next.jsで技術ブログ作ろうとした話", "date": "2019-07-07", "md_name":"next-js-blog", "tag":[ "next.js","blog" ] }, ... </code></pre> <h2 id="markdownのhighlight実装"><a href="#markdown%E3%81%AEhighlight%E5%AE%9F%E8%A3%85">markdownのhighlight実装</a></h2> <pre><code class="javascript">import React from "react"; import parse from "remark-parse"; import Highlight from "react-highlight"; var html = require("remark-html"); let remark = require("remark"); class HighlightedMarkdown extends React.Component { state = { contents: "", rendered: false }; componentDidMount() { (async () => { let response = await fetch(this.props.file); let data = await response.text(); let beginIndex = data.indexOf('<title>') let endIndex = data.indexOf('</title>') let title='' if(beginIndex !== -1 && endIndex !== -1 ){ title = data.substring(beginIndex + '<title>'.length , endIndex) } let markdown = remark() .use(parse) .use(html) .processSync(data).contents; //.toString('utf-8') this.setState({ contents: markdown, rendered: true, title: title }); console.log(this.state.contents); })().catch(err => { console.log(err); }); } render() { if (this.state.rendered) { return ( <div className="container"> <div class="meta"> <div class="image" /> <div className="info"> <h1>{this.state.title}</h1> </div> </div> <Highlight innerHTML={true}>{this.state.contents}</Highlight> <hr/> </div> ); } else { return <div />; } } } export default HighlightedMarkdown; </code></pre> ckoshien