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